Arquitecturas de microservicios - Codemotion 2014

43
MADRID · NOV 21-22 · 2014 Ernesto Hernández Rodríguez Arquitecto Java en Medianet Software @ehdez73 Arquitecturas de Microservicios

description

Arquitectura de microservicios implementada con Spring Cloud, NetflixOSS, Docker y Fig

Transcript of Arquitecturas de microservicios - Codemotion 2014

Page 1: Arquitecturas de microservicios  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

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

Arquitecturas de Microservicios

Page 2: Arquitecturas de microservicios  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

Page 3: Arquitecturas de microservicios  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

Page 4: Arquitecturas de microservicios  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

¿MicroServicios?

Page 5: Arquitecturas de microservicios  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

"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  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

Evolución arquitectura

Page 7: Arquitecturas de microservicios  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

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

Page 8: Arquitecturas de microservicios  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

Page 9: Arquitecturas de microservicios  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

BUT…WAIT A

MOMENT!

Page 10: Arquitecturas de microservicios  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

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  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

Necesitamos

Page 12: Arquitecturas de microservicios  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

Page 13: Arquitecturas de microservicios  -  Codemotion 2014

MADRID · NOV 21-22 · 2014http://screenagers.me/wp-content/uploads/2012/01/US-bandwidth.png

Page 14: Arquitecturas de microservicios  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

Page 15: Arquitecturas de microservicios  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

EUREKA ARCHAIUS HYSTRIX TURBINE

ZUUL BLITZ4J RIBBON

http://netflix.github.io

Page 16: Arquitecturas de microservicios  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

Page 17: Arquitecturas de microservicios  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

CorrelationID

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

Page 18: Arquitecturas de microservicios  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

ELK STACK

Files Logstash ElasticSearch Kibana

Page 19: Arquitecturas de microservicios  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

Spring Cloud

https://github.com/spring-cloud

Page 20: Arquitecturas de microservicios  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

Eureka Server

@Configuration

@EnableAutoConfiguration

@EnableEurekaServer

public class Application {

public static void main(String[] args) {

new SpringApplicationBuilder(Application.class)

.web(true)

.run(args);

}

}

Page 21: Arquitecturas de microservicios  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

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 22: Arquitecturas de microservicios  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

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 23: Arquitecturas de microservicios  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

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 24: Arquitecturas de microservicios  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

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 25: Arquitecturas de microservicios  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

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 26: Arquitecturas de microservicios  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

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 27: Arquitecturas de microservicios  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

Hystrix Dashboard

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

Page 28: Arquitecturas de microservicios  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

Zuul Config

@EnableZuulProxy

/api/users → /users

Hystrix → Ribbon → Eureka

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

Page 29: Arquitecturas de microservicios  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

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

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

Page 30: Arquitecturas de microservicios  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

Spring Cloud Config - Server

@Configuration

@EnableAutoConfiguration

@EnableEurekaClient

@EnableConfigServer

public class ConfigServerApplication {

public static void main(String[] args) {

SpringApplication.run(ConfigServerApplication.class, args);

}

}

Page 31: Arquitecturas de microservicios  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

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

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

Page 32: Arquitecturas de microservicios  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

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 33: Arquitecturas de microservicios  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

@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 34: Arquitecturas de microservicios  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

DevOps

Page 35: Arquitecturas de microservicios  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

Page 36: Arquitecturas de microservicios  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

Page 37: Arquitecturas de microservicios  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

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 38: Arquitecturas de microservicios  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

http://www.fig.sh/

Page 39: Arquitecturas de microservicios  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

Fig.sh

Page 40: Arquitecturas de microservicios  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

fig.ymlmyapp1: image: ehdez73/myapp1 ports: - "8880:8880"

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

db: image: postgres

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

$ fig up

Page 41: Arquitecturas de microservicios  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

DEMO

Page 42: Arquitecturas de microservicios  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

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 43: Arquitecturas de microservicios  -  Codemotion 2014

MADRID · NOV 21-22 · 2014

Muchas gracias@ehdez73