Arquitecturas de microservicios - @cibbva

Post on 25-Jul-2015

360 views 0 download

Transcript of Arquitecturas de microservicios - @cibbva

MADRID · 20/04/2014Meetups

Ernesto Hernández Rodríguez@ehdez73

Arquitecturas de Microservicios

MADRID · 20/04/2014Meetups

ERNESTO HERNÁNDEZ RODRÍGUEZ

http://linkdin.me/ehdez73

@ehdez73

Arquitecto de SoftwareInstructor certificado SpringSource

www.medianetsoftware.com

MADRID · 20/04/2014Meetups

¿MicroServicios?

MADRID · 20/04/2014Meetups

"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."

MADRID · 20/04/2014Meetups

Evolución arquitectura

MADRID · 20/04/2014Meetups

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

MADRID · 20/04/2014Meetups

Microservice with Spring Boot

$ spring run app.groovy

$ curl localhost:8080

Helllo World !

https://spring.io/guides/gs/spring-boot/

MADRID · 20/04/2014Meetups

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

MADRID · 20/04/2014Meetups

Necesitamos

MADRID · 20/04/2014Meetups

MADRID · 20/04/2014Meetups

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

MADRID · 20/04/2014Meetups

MADRID · 20/04/2014Meetups

EUREKA ARCHAIUS HYSTRIX TURBINE

ZUUL BLITZ4J RIBBON

http://netflix.github.io

MADRID · 20/04/2014Meetups

MADRID · 20/04/2014Meetups

Logging

MADRID · 20/04/2014Meetups

Log Management

Logs Logstash ElasticSearch Kibana

ELK Stack

MADRID · 20/04/2014Meetups

CorrelationID

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

cid : { 887250bd-747b-4618-881b-d5eeb6cff59f }

cidcid

cid

cid

cid

MADRID · 20/04/2014Meetups

Spring Cloud

http://projects.spring.io/spring-cloud

MADRID · 20/04/2014Meetups

Registry

MADRID · 20/04/2014Meetups

Eureka Server

@Configuration

@EnableAutoConfiguration

@EnableEurekaServer

public class Application {

public static void main(String[] args) {

new SpringApplication.run(Application.class, args);

}

}

MADRID · 20/04/2014Meetups

Eureka Server

@Configuration

@EnableAutoConfiguration

@EnableEurekaServer

public class Application {

public static void main(String[] args) {

new SpringApplication.run(Application.class, args);

}

}

application.yml

server: port: 8761

spring: application: name: eureka-server

MADRID · 20/04/2014Meetups

Eureka Client@Configuration

@EnableAutoConfiguration

@EnableEurekaClient

@RestController

public class Application {

@RequestMapping("/sayHello")

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

public static void main(String[] args) {

new SpringApplication.run(Application.class, args);

}

}

MADRID · 20/04/2014Meetups

Eureka Client@Configuration

@EnableAutoConfiguration

@EnableEurekaClient

@RestController

public class Application {

@RequestMapping("/")

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

public static void main(String[] args) {

new SpringApplication.run(Application.class, args);

}

}

application.yml

spring: application: name: eureka-clienteureka: client: serviceUrl: defaultZone: http://eureka.machine:8761/eureka/

MADRID · 20/04/2014Meetups

Load balancer

MADRID · 20/04/2014Meetups

Ribbon

@Autowired

private LoadBalancerClient loadBalancer;

public void useIt() {

ServiceInstance instance = loadBalancer.choose("eureka-client");

URI uri = URI.create( String.format(

"http://%s:%s",

instance.getHost(),

instance.getPort()));

// Now do something with the URI

}

LoadBalancerClient

MADRID · 20/04/2014Meetups

Ribbon

@Autowired

private RestTemplate template;

public void useIt() {

template.getForObject("http://eureka-client/sayHello", String.class);

}

Integrado con RestTemplate

MADRID · 20/04/2014Meetups

Circuit breaker

MADRID · 20/04/2014Meetups

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 */;

}

}

MADRID · 20/04/2014Meetups

Hystrix Config

@Configuration

@EnableAutoConfiguration

@EnableHystrix

@EnableHystrixDashboard

public class Application {

public static void main(String[] args) {

new SpringApplication.run(Application.class);

}

}

MADRID · 20/04/2014Meetups

Hystrix Dashboard

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

MADRID · 20/04/2014Meetups

Edge service

MADRID · 20/04/2014Meetups

Zuul Config

@EnableZuulProxy

GET: /api/sayHello

Hystrix → Ribbon → Eureka

zuul: routes: eureka-client: /api/**

MADRID · 20/04/2014Meetups

Config

MADRID · 20/04/2014Meetups

Spring Cloud Config ∘ Properties en repositorio Git ∘ API∘ App/Profile∘ Cifrado∘ @RefreshScope

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

MADRID · 20/04/2014Meetups

Spring Cloud Config - Server

@Configuration

@EnableAutoConfiguration

@EnableEurekaClient

@EnableConfigServer

public class ConfigServerApplication {

public static void main(String[] args) {

SpringApplication.run(ConfigServerApplication.class, args);

}

}

MADRID · 20/04/2014Meetups

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: config-server

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/minionize-the-world-config

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

MADRID · 20/04/2014Meetups

Spring Cloud Config - Client

@Configuration

@EnableAutoConfiguration

@RestController

public class Application {

@RequestMapping("/")

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

public static void main(String[] args) {

new SpringApplication.run(Application.class, args);

}

}

MADRID · 20/04/2014Meetups

@Configuration

@EnableAutoConfiguration

@RestController

public class Application {

@RequestMapping("/")

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

public static void main(String[] args) {

new SpringApplication.run(Application.class, args);

}

}

Spring Cloud Config - Client

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

MADRID · 20/04/2014Meetups

MADRID · 20/04/2014Meetups

MADRID · 20/04/2014Meetups

MADRID · 20/04/2014Meetups

FROM dockerfile/javaMANTAINER Ernesto Hdez, ernesto.hernandez@medianet.esADD target/myapp1.jar /tmp/myapp1.jarEXPOSE 8080ENTRYPOINT ["java", "-jar", "/tmp/myapp1.jar"]

Dockerfile

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

$ docker ps$ docker stop m1$ docker start m1

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

MADRID · 20/04/2014Meetups

https://docs.docker.com/compose

Docker Compose

MADRID · 20/04/2014Meetups

Docker Compose

docker-compose.yml

MADRID · 20/04/2014Meetups

docker-compose.ymlmyapp1: image: ehdez73/myapp1 ports: - "8880:8880"

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

db: image: postgres

$ docker-compose up

MADRID · 20/04/2014Meetups

DEMO

MADRID · 20/04/2014Meetups

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

MADRID · 20/04/2014Meetups

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

Fallo Minium - Characters

MADRID · 20/04/2014Meetups

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

Fallo Minium - Ipsum

Fallo Minium - Characters

MADRID · 20/04/2014Meetups

Minionize the world !!!

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

MADRID · 20/04/2014Meetups

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

MADRID · 20/04/2014Meetups

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

MADRID · 20/04/2014Meetups

Muchas gracias@ehdez73