arquitecturas de microservicios - codemotion 2014

Post on 08-Jul-2015

1.359 Views

Category:

Software

3 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

MADRID · NOV 21-22 · 2014

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

Arquitecturas de Microservicios

MADRID · NOV 21-22 · 2014

MADRID · NOV 21-22 · 2014

MADRID · NOV 21-22 · 2014

¿MicroServicios?

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

MADRID · NOV 21-22 · 2014

Evolución arquitectura

MADRID · NOV 21-22 · 2014

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

MADRID · NOV 21-22 · 2014

MADRID · NOV 21-22 · 2014

BUT…WAIT A

MOMENT!

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?

MADRID · NOV 21-22 · 2014

Necesitamos

MADRID · NOV 21-22 · 2014

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

MADRID · NOV 21-22 · 2014

MADRID · NOV 21-22 · 2014

EUREKA ARCHAIUS HYSTRIX TURBINE

ZUUL BLITZ4J RIBBON

http://netflix.github.io

MADRID · NOV 21-22 · 2014

MADRID · NOV 21-22 · 2014

CorrelationID

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

MADRID · NOV 21-22 · 2014

ELK STACK

Files Logstash ElasticSearch Kibana

MADRID · NOV 21-22 · 2014

Spring Cloud

https://github.com/spring-cloud

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);

}

}

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/

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);

}

}

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/

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

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

}

}

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);

}

}

MADRID · NOV 21-22 · 2014

Hystrix Dashboard

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

MADRID · NOV 21-22 · 2014

Zuul Config

@EnableZuulProxy

/api/users → /users

Hystrix → Ribbon → Eureka

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

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

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);

}

}

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='

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);

}

}

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}

MADRID · NOV 21-22 · 2014

DevOps

MADRID · NOV 21-22 · 2014

MADRID · NOV 21-22 · 2014

MADRID · NOV 21-22 · 2014

FROM dockerfile/javaMANTAINER Ernesto Hdez, ehdez73@gmail.comADD 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/

MADRID · NOV 21-22 · 2014

http://www.fig.sh/

MADRID · NOV 21-22 · 2014

Fig.sh

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

MADRID · NOV 21-22 · 2014

DEMO

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

MADRID · NOV 21-22 · 2014

Muchas gracias@ehdez73

top related