Top Banner
Ernesto Hernández Rodríguez Arquitecto Java en Medianet Software @ehdez73 Arquitecturas de Microservicios
54

Arquitecturas de microservicios - Medianet Software

Jul 18, 2015

Download

Software

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Arquitecturas de microservicios   -  Medianet Software

Ernesto Hernández RodríguezArquitecto Java en Medianet Software@ehdez73

Arquitecturas de Microservicios

Page 2: Arquitecturas de microservicios   -  Medianet Software
Page 3: Arquitecturas de microservicios   -  Medianet Software
Page 4: Arquitecturas de microservicios   -  Medianet Software

¿MicroServicios?

Page 5: Arquitecturas de microservicios   -  Medianet Software

"Microservices is a software architecture design pattern, in which complex applications are composed of small, independent processes communicating with each other using language-agnostic APIs. These services are small, highly decoupled and focus on doing a small task."

Page 6: Arquitecturas de microservicios   -  Medianet Software

Evolución arquitectura

Page 7: Arquitecturas de microservicios   -  Medianet Software

Beneficios ∘ Servicios pequeños∘ Principio de responsabilidad única∘ Fácilmente abarcable∘ Políglota∘ PoC∘ Despliegues∘ Escalado eficiente

Page 8: Arquitecturas de microservicios   -  Medianet Software
Page 9: Arquitecturas de microservicios   -  Medianet Software

BUT…WAIT A

MOMENT!

Page 10: Arquitecturas de microservicios   -  Medianet Software

Nuevos desafíos ∘ ¿Cómo localizo los servicios?∘ ¿Qué pasa si alguno falla?∘ ¿Cómo los configuro?∘ ¿Y las trazas?∘ ¿Y los diferentes entornos?

Page 11: Arquitecturas de microservicios   -  Medianet Software

Necesitamos

Page 12: Arquitecturas de microservicios   -  Medianet Software
Page 13: Arquitecturas de microservicios   -  Medianet Software

http://screenagers.me/wp-content/uploads/2012/01/US-bandwidth.png

Page 14: Arquitecturas de microservicios   -  Medianet Software

EUREKA ARCHAIUS HYSTRIX TURBINE

ZUUL BLITZ4J RIBBON

http://netflix.github.io

Page 15: Arquitecturas de microservicios   -  Medianet Software

EUREKA

Service locator

∘ API REST∘ Eureka Server - Peer awarness∘ Eureka Client - Service Discovery

https://github.com/Netflix/eureka

Page 16: Arquitecturas de microservicios   -  Medianet Software

ARCHAIUS

Configuration management

∘ Apache Commons Configuration∘ Configuration Source∘ High throughput∘ Thread safe∘ Composite configuration∘ JMX

https://github.com/Netflix/Archaius

Page 17: Arquitecturas de microservicios   -  Medianet Software

RIBBON

Interprocess communication ∘ Balanceador de carga∘ Cliente Eureka ∘ Hystrix

https://github.com/Netflix/Ribbon

Page 18: Arquitecturas de microservicios   -  Medianet Software

HYSTRIX

Circuit Breaker

∘ Aislar puntos de acceso∘ Tolerancia a fallos∘ Fallos en cascada∘ Dashboard

https://github.com/Netflix/Hystrix

Page 19: Arquitecturas de microservicios   -  Medianet Software

http://cloud.spring.io/spring-cloud-netflix/images/HystrixGraph.png

Circuit Breaker

Page 20: Arquitecturas de microservicios   -  Medianet Software

http://cloud.spring.io/spring-cloud-netflix/images/HystrixFallback.png

Circuit Breaker

Page 21: Arquitecturas de microservicios   -  Medianet Software

Hystrix Dashboard

http://techblog.netflix.com/2012/12/hystrix-dashboard-and-turbine.html

Page 22: Arquitecturas de microservicios   -  Medianet Software

TURBINE

Stream aggregator

Turbine is an application that aggregates all of the relevant /hystrix.stream endpoints into a combined /turbine.stream for use in the Hystrix Dashboard

https://github.com/Netflix/Turbine

Page 23: Arquitecturas de microservicios   -  Medianet Software

http://youtu.be/zWM7oAbVL4g

Page 24: Arquitecturas de microservicios   -  Medianet Software

ZUUL

Edge Service

∘ Router and filter∘ Reverse proxy∘ Ribbon & Eureka∘ Hystrix

https://github.com/Netflix/Zuul

Page 25: Arquitecturas de microservicios   -  Medianet Software

BLITZ4J

Fast asynchronous logging

∘ Basado en log4j∘ Menos recursos∘ Más rápido∘ Archaius

https://github.com/Netflix/Blitz4j

Page 26: Arquitecturas de microservicios   -  Medianet Software
Page 27: Arquitecturas de microservicios   -  Medianet Software

CorrelationID

http://ragavj.blogspot.com.es/2013/08/how-to-lookup-error-in-sharepoint-2010.html

Page 28: Arquitecturas de microservicios   -  Medianet Software

ELK STACK

Files Logstash ElasticSearch Kibana

Page 29: Arquitecturas de microservicios   -  Medianet Software

Spring Cloud

https://github.com/spring-cloud

Page 30: Arquitecturas de microservicios   -  Medianet Software

Eureka Server

@Configuration

@EnableAutoConfiguration

@EnableEurekaServer

public class Application {

public static void main(String[] args) {

new SpringApplicationBuilder(Application.class)

.web(true)

.run(args);

}

}

Page 31: Arquitecturas de microservicios   -  Medianet Software

Eureka Server

@Configuration

@EnableAutoConfiguration

@EnableEurekaServer

public class Application {

public static void main(String[] args) {

new SpringApplicationBuilder(Application.class)

.web(true)

.run(args);

}

}

application.yml

server: port: 8761

eureka: instance: hostname: localhost client: registerWithEureka: false fetchRegistry: false serviceUrl: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

Page 32: Arquitecturas de microservicios   -  Medianet Software

Eureka Client@Configuration

@ComponentScan

@EnableAutoConfiguration

@EnableEurekaClient

@RestController

public class Application {

@RequestMapping("/")

public String home() { return "Hello world"; }

public static void main(String[] args) {

new SpringApplicationBuilder(Application.class)

.web(true).run(args);

}

}

Page 33: Arquitecturas de microservicios   -  Medianet Software

Eureka Client@Configuration

@ComponentScan

@EnableAutoConfiguration

@EnableEurekaClient

@RestController

public class Application {

@RequestMapping("/")

public String home() { return "Hello world"; }

public static void main(String[] args) {

new SpringApplicationBuilder(Application.class)

.web(true).run(args);

}

}

application.ymleureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/

Page 34: Arquitecturas de microservicios   -  Medianet Software

Ribbon

RibbonAutoConfiguration.java@Bean

@ConditionalOnMissingBean(RestTemplate.class)

public RestTemplate restTemplate(RibbonInterceptor ribbonInterceptor) {

RestTemplate restTemplate = new RestTemplate();

List<ClientHttpRequestInterceptor> list = new ArrayList<>();

list.add(ribbonInterceptor);

restTemplate.setInterceptors(list);

return restTemplate;

}

}

Transparente vía RestTemplate

http://github.com/.../RibbonAutoConfiguration.java

Page 35: Arquitecturas de microservicios   -  Medianet Software

Hystrix wrapper

@Component

public class StoreIntegration {

@HystrixCommand(fallbackMethod = "defaultStores")

public Object getStores(Map<String, Object> parameters) {

//do stuff that might fail

}

public Object defaultStores(Map<String, Object> parameters) {

return /* something useful */;

}

}

Page 36: Arquitecturas de microservicios   -  Medianet Software

Hystrix Config

@Configuration

@EnableAutoConfiguration

@EnableHystrix

@EnableHystrixDashboard

@ComponentScan

public class Application {

public static void main(String[] args) {

new SpringApplicationBuilder(Application.class)

.web(true)

.run(args);

}

}

Page 37: Arquitecturas de microservicios   -  Medianet Software

Zuul Config

@EnableZuulProxy

/api/users → /users

Hystrix → Ribbon → Eureka

zuul.proxy.mapping: /apizuul.proxy.route.users: /users

Page 38: Arquitecturas de microservicios   -  Medianet Software

Spring Cloud Config ∘ Properties en repositorio Git ∘ API∘ Profiles∘ Encriptado∘ @RefreshScope∘ PropertySource & Env

https://github.com/spring-cloud/spring-cloud-config

Page 39: Arquitecturas de microservicios   -  Medianet Software

Spring Cloud Config - Server

@Configuration

@EnableAutoConfiguration

@EnableEurekaClient

@EnableConfigServer

public class ConfigServerApplication {

public static void main(String[] args) {

SpringApplication.run(ConfigServerApplication.class, args);

}

}

Page 40: Arquitecturas de microservicios   -  Medianet Software

Spring Cloud Config - Server

@Configuration

@EnableAutoConfiguration

@EnableEurekaClient

@EnableConfigServer

public class ConfigServerApplication {

public static void main(String[] args) {

SpringApplication.run(ConfigServerApplication.class, args);

}

}

bootstrap.ymlspring: application: name: configserver

encrypt: keyStore: location: classpath:keystore.jks password: ${KEYSTORE_PASSWORD} # foobar alias: test

application.ymlspring: cloud: config: server: basedir: target/config uri: https://github.com/ehdez73/cloud-config

security: user: password: '{cipher}AQBunH7b87s86E='

Page 41: Arquitecturas de microservicios   -  Medianet Software

Spring Cloud Config - Client

@Configuration

@EnableAutoConfiguration

@RestController

public class Application {

@RequestMapping("/")

public String home() { return "Hello world"; }

public static void main(String[] args) {

new SpringApplicationBuilder(Application.class)

.web(true)

.run(args);

}

}

Page 42: Arquitecturas de microservicios   -  Medianet Software

@Configuration

@EnableAutoConfiguration

@RestController

public class Application {

@RequestMapping("/")

public String home() { return "Hello world"; }

public static void main(String[] args) {

new SpringApplicationBuilder(Application.class)

.web(true)

.run(args);

}

}

Spring Cloud Config - Client

bootstrap.ymlspring: cloud: config: uri: http://localhost:${config.port:8888}

Page 43: Arquitecturas de microservicios   -  Medianet Software

DevOps

Page 44: Arquitecturas de microservicios   -  Medianet Software
Page 45: Arquitecturas de microservicios   -  Medianet Software
Page 47: Arquitecturas de microservicios   -  Medianet Software
Page 48: Arquitecturas de microservicios   -  Medianet Software

FROM dockerfile/javaMANTAINER Ernesto Hdez, [email protected] target/myapp1.jar /tmp/myapp1.jarEXPOSE 8080ENTRYPOINT ["java", "-jar", "/tmp/myapp1.jar"]

Dockerfile

$ mvn package$ docker build -t ehdez73/myapp1 .$ docker run -d -p 8080:8080 --name="m1" ehdez73/myapp1

$ docker ps$ docker stop m1$ docker start m1

https://registry.hub.docker.com/u/dockerfile/java/dockerfile/

Page 49: Arquitecturas de microservicios   -  Medianet Software

http://www.fig.sh/

Page 50: Arquitecturas de microservicios   -  Medianet Software

Fig.sh

Page 51: Arquitecturas de microservicios   -  Medianet Software

fig.ymlmyapp1: build: . ports: - "8880:8880"

myapp2: image: ehdez73/myapp2 ports: - "8881:8881" links: - db

db: image: postgres

http://www.fig.sh/yml.html

$ fig up

Page 52: Arquitecturas de microservicios   -  Medianet Software

DEMO

Page 53: Arquitecturas de microservicios   -  Medianet Software

MINIONIZE THE WORLD !!!Minions ipsum tulaliloo potatoooo pepete jeje baboiii poulet tikka masala chasy la bodaaa butt. La bodaaa aaaaaah tulaliloo wiiiii la bodaaa la bodaaa belloo! Tulaliloo para tú belloo! Me want bananaaa! Para tú aaaaaah bananaaaa para tú jiji po kass. Potatoooo tulaliloo potatoooo chasy me want bananaaa! Ti aamoo! para tú.

https://github.com/ehdez73/minionize-the-world

The minions

Page 54: Arquitecturas de microservicios   -  Medianet Software

Muchas gracias@ehdez73