Arquitecturas de microservicios - Codemotion 2014
-
Upload
ernesto-hernandez-rodriguez -
Category
Software
-
view
1.358 -
download
3
description
Transcript of Arquitecturas de microservicios - Codemotion 2014
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, [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/
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