Arquitecturas de microservicios - @cibbva
-
Upload
ernesto-hernandez-rodriguez -
Category
Technology
-
view
360 -
download
0
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, [email protected] 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