O documento apresenta as principais tecnologias open source da Netflix para desenvolvimento de aplicações na nuvem, como Eureka para descoberta de serviços, Archaius para gerenciamento de configurações e Ribbon/Hystrix para balanceamento de carga e tolerância a falhas.
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
5. 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/
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.
10. 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.
11. 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
13. 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() {
// ...
}
});
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
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());
}
}
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
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());