gujavasc - criando micro-serviços reativos com java
TRANSCRIPT
![Page 1: GUJavaSC - Criando Micro-serviços Reativos com Java](https://reader030.vdocuments.net/reader030/viewer/2022020108/5871ab9a1a28abda6a8b58d9/html5/thumbnails/1.jpg)
Criando Micro-serviços Reativos com JavaRodrigo Cândido da Silva
@rcandidosilva
![Page 2: GUJavaSC - Criando Micro-serviços Reativos com Java](https://reader030.vdocuments.net/reader030/viewer/2022020108/5871ab9a1a28abda6a8b58d9/html5/thumbnails/2.jpg)
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](https://reader030.vdocuments.net/reader030/viewer/2022020108/5871ab9a1a28abda6a8b58d9/html5/thumbnails/3.jpg)
Agenda• Monolito vs. Micro-serviços • Manifesto Reativo • Resiliência • Message-driven • Demo • Perguntas
![Page 4: GUJavaSC - Criando Micro-serviços Reativos com Java](https://reader030.vdocuments.net/reader030/viewer/2022020108/5871ab9a1a28abda6a8b58d9/html5/thumbnails/4.jpg)
Monolito vs. Micro-serviços
![Page 5: GUJavaSC - Criando Micro-serviços Reativos com Java](https://reader030.vdocuments.net/reader030/viewer/2022020108/5871ab9a1a28abda6a8b58d9/html5/thumbnails/5.jpg)
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](https://reader030.vdocuments.net/reader030/viewer/2022020108/5871ab9a1a28abda6a8b58d9/html5/thumbnails/6.jpg)
Manifesto Reativo
![Page 7: GUJavaSC - Criando Micro-serviços Reativos com Java](https://reader030.vdocuments.net/reader030/viewer/2022020108/5871ab9a1a28abda6a8b58d9/html5/thumbnails/7.jpg)
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](https://reader030.vdocuments.net/reader030/viewer/2022020108/5871ab9a1a28abda6a8b58d9/html5/thumbnails/8.jpg)
Spring BootSpring Cloud
Spring Cloud + Netflix OSS
![Page 9: GUJavaSC - Criando Micro-serviços Reativos com Java](https://reader030.vdocuments.net/reader030/viewer/2022020108/5871ab9a1a28abda6a8b58d9/html5/thumbnails/9.jpg)
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](https://reader030.vdocuments.net/reader030/viewer/2022020108/5871ab9a1a28abda6a8b58d9/html5/thumbnails/10.jpg)
Spring Cloud Config
![Page 11: GUJavaSC - Criando Micro-serviços Reativos com Java](https://reader030.vdocuments.net/reader030/viewer/2022020108/5871ab9a1a28abda6a8b58d9/html5/thumbnails/11.jpg)
Netflix Eureka
![Page 12: GUJavaSC - Criando Micro-serviços Reativos com Java](https://reader030.vdocuments.net/reader030/viewer/2022020108/5871ab9a1a28abda6a8b58d9/html5/thumbnails/12.jpg)
Netflix Ribbon
![Page 13: GUJavaSC - Criando Micro-serviços Reativos com Java](https://reader030.vdocuments.net/reader030/viewer/2022020108/5871ab9a1a28abda6a8b58d9/html5/thumbnails/13.jpg)
Netflix Hystrix• Circuit Breaker Pattern
![Page 14: GUJavaSC - Criando Micro-serviços Reativos com Java](https://reader030.vdocuments.net/reader030/viewer/2022020108/5871ab9a1a28abda6a8b58d9/html5/thumbnails/14.jpg)
Hystrix Dashboard
![Page 15: GUJavaSC - Criando Micro-serviços Reativos com Java](https://reader030.vdocuments.net/reader030/viewer/2022020108/5871ab9a1a28abda6a8b58d9/html5/thumbnails/15.jpg)
Netflix Zuul
![Page 16: GUJavaSC - Criando Micro-serviços Reativos com Java](https://reader030.vdocuments.net/reader030/viewer/2022020108/5871ab9a1a28abda6a8b58d9/html5/thumbnails/16.jpg)
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](https://reader030.vdocuments.net/reader030/viewer/2022020108/5871ab9a1a28abda6a8b58d9/html5/thumbnails/17.jpg)
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](https://reader030.vdocuments.net/reader030/viewer/2022020108/5871ab9a1a28abda6a8b58d9/html5/thumbnails/18.jpg)
Reactive Programming• Asynchronous communication and data streams
• reactive-streams.org
![Page 19: GUJavaSC - Criando Micro-serviços Reativos com Java](https://reader030.vdocuments.net/reader030/viewer/2022020108/5871ab9a1a28abda6a8b58d9/html5/thumbnails/19.jpg)
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](https://reader030.vdocuments.net/reader030/viewer/2022020108/5871ab9a1a28abda6a8b58d9/html5/thumbnails/20.jpg)
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](https://reader030.vdocuments.net/reader030/viewer/2022020108/5871ab9a1a28abda6a8b58d9/html5/thumbnails/21.jpg)
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](https://reader030.vdocuments.net/reader030/viewer/2022020108/5871ab9a1a28abda6a8b58d9/html5/thumbnails/22.jpg)
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](https://reader030.vdocuments.net/reader030/viewer/2022020108/5871ab9a1a28abda6a8b58d9/html5/thumbnails/23.jpg)
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](https://reader030.vdocuments.net/reader030/viewer/2022020108/5871ab9a1a28abda6a8b58d9/html5/thumbnails/24.jpg)
Demo• Reactive Microservices • https://github.com/rcandidosilva/reactive-microservices
![Page 25: GUJavaSC - Criando Micro-serviços Reativos com Java](https://reader030.vdocuments.net/reader030/viewer/2022020108/5871ab9a1a28abda6a8b58d9/html5/thumbnails/25.jpg)
Outras Alternativas
![Page 26: GUJavaSC - Criando Micro-serviços Reativos com Java](https://reader030.vdocuments.net/reader030/viewer/2022020108/5871ab9a1a28abda6a8b58d9/html5/thumbnails/26.jpg)
Perguntas
?
![Page 27: GUJavaSC - Criando Micro-serviços Reativos com Java](https://reader030.vdocuments.net/reader030/viewer/2022020108/5871ab9a1a28abda6a8b58d9/html5/thumbnails/27.jpg)
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