28
Criando Micro-serviços Reativos com Java Rodrigo Cândido da Silva @rcandidosilva

GUJavaSC - Criando Micro-serviços Reativos com Java

Embed Size (px)

Citation preview

Page 1: GUJavaSC - Criando Micro-serviços Reativos com Java

Criando Micro-serviços Reativos com JavaRodrigo Cândido da Silva

@rcandidosilva

Page 2: GUJavaSC - Criando Micro-serviços Reativos com Java

About Me• Software Architect

• http://integritastech.com • JUG Leader do GUJavaSC

• http://gujavasc.org • Twitter

• @rcandidosilva • Contatos

• http://rodrigocandido.me

Page 3: GUJavaSC - Criando Micro-serviços Reativos com Java

Agenda• Monolito vs. Micro-serviços • Manifesto Reativo • Resiliência • Message-driven • Demo • Perguntas

Page 4: GUJavaSC - Criando Micro-serviços Reativos com Java

Monolito vs. Micro-serviços

Page 5: GUJavaSC - Criando Micro-serviços Reativos com Java

Micro-serviços

• Pequenos • Deployment interdependente • Independente de tecnologia • Infra-estrutura separada

"Small independent component with well-defined boundaries that’s doing one thing, but

doing it well"

Page 6: GUJavaSC - Criando Micro-serviços Reativos com Java

Manifesto Reativo

Page 7: GUJavaSC - Criando Micro-serviços Reativos com Java

Resiliência• Como suportar isso com micro-serviços?

• Central point of configuration • Service registry and discovery • Routing features • Load balancing • Failover • Monitoring

Page 8: GUJavaSC - Criando Micro-serviços Reativos com Java

Spring BootSpring Cloud

Spring Cloud + Netflix OSS

Page 9: GUJavaSC - Criando Micro-serviços Reativos com Java

Spring Cloud + Netflix OSS“Casamento perfeito para criação de micro-

serviços resilientes“

Gerenciamento de Configuração Spring Cloud Config + Bus

Descoberta de Serviços Netflix Eureka

Balanceamento de Carga Netflix Ribbon

Circuit Breaker Netflix Hystrix + Turbine

Proxy Server Netflix Zuul

Segurança Spring Cloud Security

Page 10: GUJavaSC - Criando Micro-serviços Reativos com Java

Spring Cloud Config

Page 11: GUJavaSC - Criando Micro-serviços Reativos com Java

Netflix Eureka

Page 12: GUJavaSC - Criando Micro-serviços Reativos com Java

Netflix Ribbon

Page 13: GUJavaSC - Criando Micro-serviços Reativos com Java

Netflix Hystrix• Circuit Breaker Pattern

Page 14: GUJavaSC - Criando Micro-serviços Reativos com Java

Hystrix Dashboard

Page 15: GUJavaSC - Criando Micro-serviços Reativos com Java

Netflix Zuul

Page 16: GUJavaSC - Criando Micro-serviços Reativos com Java

Spring Cloud Security

Discovery

Client Relying Party

Resource Server

Get an access token

& an ID Token (JWT)

Use an access token

Authorization Server

Iden.tyProviderorIDPor

OpenIDProviderorOP

Authorization Endpoint

Token Endpoint

Important Stuff

Userinfo Endpoint

Registration Endpoint

JWKS Endpoint

JWKS Endpoint

Validate (JWT)

ID Token

/.well-known /webfinger /openid-configura.on

Check Session IFrame

End Session Endpoint

Page 17: GUJavaSC - Criando Micro-serviços Reativos com Java

Message-Driven • Como suportar isso com micro-serviços?

• Comunicação assíncrona • Non blocking I/O • Distribuição • Consistência • Event sourcing • CQRS

Page 18: GUJavaSC - Criando Micro-serviços Reativos com Java

Reactive Programming• Asynchronous communication and data streams

• reactive-streams.org

Page 19: GUJavaSC - Criando Micro-serviços Reativos com Java

Alternativas Reativas com Java EE

JMS EJB 3

Message-Driven Beans

Asynchronous Session Beans

CDIEvents

Observers

ServletAsynchronous

NIO

JAX-RSAsync on Server

Async on Client

WebSocket

Async Remote Endpoints Concurrency

Utilities

Page 20: GUJavaSC - Criando Micro-serviços Reativos com Java

Project Reactor• Biblioteca para implementação de non-blocking apps • Interage com Java 8 functional API • Oferece duas composable API reativas

• Flux[N] and Mono[0|1] • Suporta escalabilidade in-memory roteando com Bus extensions

• Suporte portável para micro-serviços

Page 21: GUJavaSC - Criando Micro-serviços Reativos com Java

REST Endpoint@RestControllerpublic class UserRestController {

private static final List<User> users = new ArrayList<>();

static { users.add(new User(1, "Rodrigo", "C", "da Silva")); users.add(new User(2, "Israel", "B", "Rodriguez")); users.add(new User(3, "Bruno", "", "Souza")); users.add(new User(4, "Edson", "", "Yanaga")); }

@RequestMapping(method = RequestMethod.GET, value = "/users") public List<User> getUsers() { return users; }

@RequestMapping(method = RequestMethod.GET, value = "/user/{id}") public User getUser(@PathVariable("id") Integer id) { return users.stream().filter(g -> g.getId() == id) .collect(Collectors.toList()).get(0); }

}

Page 22: GUJavaSC - Criando Micro-serviços Reativos com Java

REST Proxy@Componentpublic class UserServiceProxy {

@Autowired UserService service;

@HystrixCommand(fallbackMethod = "defaultUsersObservable") public Observable<List<User>> getUsersObservable() { return new ObservableResult<List<User>>() { @Override public List<User> invoke() { return service.getUsers(); } }; }

public Observable<User> defaultUsersObservable() { return null; }} @FeignClient("USER-SERVICE")

public interface UserService {

@RequestMapping(value = "/users", method = RequestMethod.GET) List<User> getUsers();

@RequestMapping(value = "/user/{id}", method = RequestMethod.GET) User getUser(@PathVariable("id") Integer id);}

Page 23: GUJavaSC - Criando Micro-serviços Reativos com Java

REST Async Client

@RestControllerpublic class APIController {

@Autowired GroupServiceProxy groupService;

@Autowired UserServiceProxy userService;

@RequestMapping(method = RequestMethod.GET, value = "/userGroups") public UserGroup getUserGroups() { Observable<List<Group>> groups = groupService.getGroupsObservable(); Observable<List<User>> users = userService.getUsersObservable();

Observable<UserGroup> userGroupObservable = Observable.zip(groups, users, (g, u) -> new UserGroup(u, g));

return userGroupObservable.toList().toBlocking().single().get(0); }

}

Page 24: GUJavaSC - Criando Micro-serviços Reativos com Java

Demo• Reactive Microservices • https://github.com/rcandidosilva/reactive-microservices

Page 25: GUJavaSC - Criando Micro-serviços Reativos com Java

Outras Alternativas

Page 26: GUJavaSC - Criando Micro-serviços Reativos com Java

Perguntas

?

Page 27: GUJavaSC - Criando Micro-serviços Reativos com Java

Referências• http://projects.spring.io/spring-boot/ • http://projects.spring.io/spring-cloud/ • https://netflix.github.io/ • http://www.reactive-streams.org/ • http://www.reactivemanifesto.org/ • https://github.com/reactivemanifesto/website-manifesto/tree/master/public/pdf • https://projectreactor.io/ • http://reactivex.io/ • http://www.kennybastani.com/2016/04/event-sourcing-microservices-spring-

cloud.html

Page 28: GUJavaSC - Criando Micro-serviços Reativos com Java

Muito Obrigado! @rcandidosilva

rodrigocandido.me