Tecnologias Netflix OSS
The Developers Conference - 2015
Danival Taffarel Calegari
● Mestre em Ciência da Computação - UNICAMP
● Mais de 14 anos desenvolvendo aplicações Java e Java EE
● Líder Técnico na MATERA Systems
● Instrutor na Globalcode
● Palestras em diversos eventos: JavaOne, TDC, JustJava,
DevCamp, …
● Certificações: SCJP, SCWCD, SCBCD
Conteúdo
● Introdução
● Arquitetura
● Eureka
● Archaius
● Governator e Karyon
● Ribbon e Hystrix
● Demo
Introdução
● Netflix OSS – Netflix Open Source Software
Introdução
● Solução para diversos problemas comuns em aplicações na
nuvem
● Bibliotecas e aplicações
● Forte ligação com AWS e microservices
● Licença Apache
● Integração com outras tecnologias
● Guice
● Spring já possui simplificações para uso das tecnologias
● http://cloud.spring.io/spring-cloud-netflix/
Arquitetura
Eureka
● Eureka é um servidor que fornece serviços REST para
localizar servidores na camada do middle.
● Faz balanceamento de carga e provê tolerância a falhas.
● Permite o monitoramento de disponibilidade das aplicações.
Eureka
● Eureka Server
● war para deploy no Tomcat
● Usa um Eureka Client para se comunicar com outros Eureka Servers
● Eureka Client
● Cliente Java para facilitar as iterações com o server
● Faz cache da localização dos serviços e load balancer básico (round
robin).
● Trabalha com serviços stateless
● Não faz sticky session
● No Netflix um load balancer mais sofisticado (que usa pesos
com vários fatores) encapsula o Eureka.
Eureka
Eureka
● Configuração do Eureka Client:
● Procura automaticamente o arquivo eureka-client.properties no
classpath.
● Pode ter um arquivo por ambiente
● eureka-client-test.properties
● eureka-client-prod.properties
● -Deureka.environment=[test|prod]
● Configuração mínima
● eureka.name = nome a aplicação (ex. playlistmiddle)
● eureka.port = porta na qual a aplicação está executando
● eureka.vipAddress = nome da aplicação no registro (ex.
playlistmiddle.matera.com)
● eureka.serviceUrls = endereço dos servidores Eureka para consultar
● Eureka Server tem configurações semelhantes.
Archaius
● Gerenciamento de propriedades com configurações
compostas e com hierarquia
● Extensão do commons-configuration da Apache
● Propriedades dinâmicas e com tipo
● Mecanismo de polling para obter mudanças de propriedades
de uma fonte de configuração.
● Mecanismo de callback para mudanças de valores
● JMXBean que pode ser acessado por um JConsole
Archaius
Archaius
● Obtendo uma configuração:
● Registrando um callback
● Criando uma fonte de configurações
public class DBConfigurationSource implements PolledConfigurationSource {
// ...
@Override
public PollResult poll(boolean initial, Object checkPoint)
throws Exception {
// implement logic to retrieve properties from DB
}
}
DynamicIntProperty prop =
DynamicPropertyFactory.getInstance().getIntProperty("myProperty",
DEFAULT_VALUE);
myMethod(prop.get());
prop.addCallback(new Runnable() {
public void run() {
// ...
}
});
Governator e Karyon
● Governator
● Melhorias para o Google Guice
● Gerenciamento de ciclo de vida
● Simplifica o bootstrapping do Guice
● Karyon
● Parte da célula que contém o DNA e o RNA e é responsável pelo seu
crescimento e reprodução.
● Contém os templates para configurar bibliotecas e deixá-las prontas
para uso.
● Bootstrapping , dependency and Lifecycle Management (via Governator)
● Runtime Insights and Diagnostics (via karyon-admin-web module)
● Configuration Management (via Archaius)
● Service discovery (via Eureka)
● Powerful transport module (via RxNetty)
Governator e Karyon
package com.matera.playlistmiddle.config;
import com.netflix.governator.guice.BootstrapBinder;
import com.netflix.karyon.server.ServerBootstrap;
public class Bootstrap extends ServerBootstrap {
@Override
protected void configureBootstrapBinder(BootstrapBinder bootstrapBinder) {
bootstrapBinder.install(new RestModule());
}
}
Governator e Karyon
● config.properties
● playlistmiddle.properties
archaius.deployment.applicationId=playlistmiddle
com.netflix.karyon.server.bootstrap.class=com.matera.playlistmiddle.
config.Bootstrap
# Eureka runtime configuration
com.netflix.karyon.eureka.disable=false
com.netflix.karyon.disable.app.discovery=false
netflix.platform.admin.resources.port=9093
com.netflix.karyon.unify.health.check.with.eureka=true
Ribbon e Hystrix
● Ribbon
● Serviço de RPC com balanceamento de carga
● Chamadas REST com diversos mecanismos de serialização
● Integração com Eureka
● Hystrix
● Biblioteca para tratar latência e tolerância a falha
● Utiliza biblioteca de ReactiveX/RxJava
Ribbon e Hystrix
public class CommandHelloWorld extends HystrixCommand<String> {
private final String name;
public CommandHelloWorld(String name) {
super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"));
this.name = name;
}
@Override
protected String run() {
// a real example would do work like a network call here
return "Hello " + name + "!";
}
}
● Command
● Execução
Observable<String> co = new CommandHelloWorld("World").toObservable();
assertEquals("Hello World!", co.toBlockingObservable().single());
Ribbon e Hystrix
@Override
protected PlayListResponseMiddle run() throws Exception {
HttpRequest request =
HttpRequest.newBuilder().uri(PLAYLIST_URL)
.header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON).build();
try (HttpResponse response =
restClient.executeWithLoadBalancer(request)) {
return mapper.readValue(response.getInputStream(),
PlayListResponseMiddle.class);
}
}
Demo
● https://github.com/wfuertes/playlist-core
● https://github.com/wfuertes/playlist-middle
● https://github.com/wfuertes/playlist-client
● https://github.com/wfuertes/playlist-edge
Obrigado!
● Danival Taffarel Calegari
● @danivaltc
● http://pt.slideshare.net/DanivalCalegari

Tecnologias Netflix OSS

  • 1.
    Tecnologias Netflix OSS TheDevelopers Conference - 2015
  • 2.
    Danival Taffarel Calegari ●Mestre em Ciência da Computação - UNICAMP ● Mais de 14 anos desenvolvendo aplicações Java e Java EE ● Líder Técnico na MATERA Systems ● Instrutor na Globalcode ● Palestras em diversos eventos: JavaOne, TDC, JustJava, DevCamp, … ● Certificações: SCJP, SCWCD, SCBCD
  • 3.
    Conteúdo ● Introdução ● Arquitetura ●Eureka ● Archaius ● Governator e Karyon ● Ribbon e Hystrix ● Demo
  • 4.
    Introdução ● Netflix OSS– Netflix Open Source Software
  • 5.
    Introdução ● Solução paradiversos problemas comuns em aplicações na nuvem ● Bibliotecas e aplicações ● Forte ligação com AWS e microservices ● Licença Apache ● Integração com outras tecnologias ● Guice ● Spring já possui simplificações para uso das tecnologias ● http://cloud.spring.io/spring-cloud-netflix/
  • 6.
  • 7.
    Eureka ● Eureka éum servidor que fornece serviços REST para localizar servidores na camada do middle. ● Faz balanceamento de carga e provê tolerância a falhas. ● Permite o monitoramento de disponibilidade das aplicações.
  • 8.
    Eureka ● Eureka Server ●war para deploy no Tomcat ● Usa um Eureka Client para se comunicar com outros Eureka Servers ● Eureka Client ● Cliente Java para facilitar as iterações com o server ● Faz cache da localização dos serviços e load balancer básico (round robin). ● Trabalha com serviços stateless ● Não faz sticky session ● No Netflix um load balancer mais sofisticado (que usa pesos com vários fatores) encapsula o Eureka.
  • 9.
  • 10.
    Eureka ● Configuração doEureka Client: ● Procura automaticamente o arquivo eureka-client.properties no classpath. ● Pode ter um arquivo por ambiente ● eureka-client-test.properties ● eureka-client-prod.properties ● -Deureka.environment=[test|prod] ● Configuração mínima ● eureka.name = nome a aplicação (ex. playlistmiddle) ● eureka.port = porta na qual a aplicação está executando ● eureka.vipAddress = nome da aplicação no registro (ex. playlistmiddle.matera.com) ● eureka.serviceUrls = endereço dos servidores Eureka para consultar ● Eureka Server tem configurações semelhantes.
  • 11.
    Archaius ● Gerenciamento depropriedades com configurações compostas e com hierarquia ● Extensão do commons-configuration da Apache ● Propriedades dinâmicas e com tipo ● Mecanismo de polling para obter mudanças de propriedades de uma fonte de configuração. ● Mecanismo de callback para mudanças de valores ● JMXBean que pode ser acessado por um JConsole
  • 12.
  • 13.
    Archaius ● Obtendo umaconfiguração: ● Registrando um callback ● Criando uma fonte de configurações public class DBConfigurationSource implements PolledConfigurationSource { // ... @Override public PollResult poll(boolean initial, Object checkPoint) throws Exception { // implement logic to retrieve properties from DB } } DynamicIntProperty prop = DynamicPropertyFactory.getInstance().getIntProperty("myProperty", DEFAULT_VALUE); myMethod(prop.get()); prop.addCallback(new Runnable() { public void run() { // ... } });
  • 14.
    Governator e Karyon ●Governator ● Melhorias para o Google Guice ● Gerenciamento de ciclo de vida ● Simplifica o bootstrapping do Guice ● Karyon ● Parte da célula que contém o DNA e o RNA e é responsável pelo seu crescimento e reprodução. ● Contém os templates para configurar bibliotecas e deixá-las prontas para uso. ● Bootstrapping , dependency and Lifecycle Management (via Governator) ● Runtime Insights and Diagnostics (via karyon-admin-web module) ● Configuration Management (via Archaius) ● Service discovery (via Eureka) ● Powerful transport module (via RxNetty)
  • 15.
    Governator e Karyon packagecom.matera.playlistmiddle.config; import com.netflix.governator.guice.BootstrapBinder; import com.netflix.karyon.server.ServerBootstrap; public class Bootstrap extends ServerBootstrap { @Override protected void configureBootstrapBinder(BootstrapBinder bootstrapBinder) { bootstrapBinder.install(new RestModule()); } }
  • 16.
    Governator e Karyon ●config.properties ● playlistmiddle.properties archaius.deployment.applicationId=playlistmiddle com.netflix.karyon.server.bootstrap.class=com.matera.playlistmiddle. config.Bootstrap # Eureka runtime configuration com.netflix.karyon.eureka.disable=false com.netflix.karyon.disable.app.discovery=false netflix.platform.admin.resources.port=9093 com.netflix.karyon.unify.health.check.with.eureka=true
  • 17.
    Ribbon e Hystrix ●Ribbon ● Serviço de RPC com balanceamento de carga ● Chamadas REST com diversos mecanismos de serialização ● Integração com Eureka ● Hystrix ● Biblioteca para tratar latência e tolerância a falha ● Utiliza biblioteca de ReactiveX/RxJava
  • 18.
    Ribbon e Hystrix publicclass CommandHelloWorld extends HystrixCommand<String> { private final String name; public CommandHelloWorld(String name) { super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup")); this.name = name; } @Override protected String run() { // a real example would do work like a network call here return "Hello " + name + "!"; } } ● Command ● Execução Observable<String> co = new CommandHelloWorld("World").toObservable(); assertEquals("Hello World!", co.toBlockingObservable().single());
  • 19.
    Ribbon e Hystrix @Override protectedPlayListResponseMiddle run() throws Exception { HttpRequest request = HttpRequest.newBuilder().uri(PLAYLIST_URL) .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON).build(); try (HttpResponse response = restClient.executeWithLoadBalancer(request)) { return mapper.readValue(response.getInputStream(), PlayListResponseMiddle.class); } }
  • 20.
    Demo ● https://github.com/wfuertes/playlist-core ● https://github.com/wfuertes/playlist-middle ●https://github.com/wfuertes/playlist-client ● https://github.com/wfuertes/playlist-edge
  • 21.
    Obrigado! ● Danival TaffarelCalegari ● @danivaltc ● http://pt.slideshare.net/DanivalCalegari