Microservice With Spring Boot and Spring Cloud

Post on 16-Jul-2015

1.790 views 9 download

Tags:

Transcript of Microservice With Spring Boot and Spring Cloud

Microservices with

Spring Boot & Spring Cloud

Eberhard Wolff Freelancer / Trainer

What are Microservices?

Eberhard Wolff - @ewolff

Micro Services: Definition•  Small •  Independent deployment units •  i.e. processes or VMs

•  Any technology •  Any infrastructure •  Include GUI

Micro Service

Server

Micro Service

Server

Eberhard Wolff - @ewolff

Components Collaborate

Micro Service

Micro Service

Link

Data Replication

REST Messaging

Eberhard Wolff - @ewolff

Infrastructure for Microservices

•  Lots of services

•  Need infrastructure Easy to create a new project REST integrated Messaging supported Uniform operations

Spring Boot Demo

Eberhard Wolff - @ewolff

Easy to Create New Project •  One pom.xml •  …Gradle / Ant

•  Very few dependencies •  One plug in •  Versions defined for you

Eberhard Wolff - @ewolff

REST Integrated•  Support in Spring MVC •  As we have seen

•  Also support for JAX-RS •  Jersey

Eberhard Wolff - @ewolff

Messaging Support•  Numerous Spring Boot Starter

•  AMQP (RabbitMQ) •  HornetQ (JMS) •  ActiveMQ (JMS, no starter)

Eberhard Wolff - @ewolff

Messaging Support•  Spring JMS abstraction •  Message driven POJOs •  Scalable •  Simplify sending JMS

•  Can use other libs, too! •  Boot can do everything plain Spring /

Java can do

Eberhard Wolff - @ewolff

Infrastructure for Microservices

•  More services

•  Need infrastructure Easy to create a new project REST integrated Messaging supported Simple deployment Uniform operations

✓ ✓

Spring BootDeploy Demo

Eberhard Wolff - @ewolff

Deploy•  Just package everything in an

executable JAR •  …or a WAR

•  Based on Maven, Ant or Gradle

•  Build in configuration (YAML, properties etc.)

Eberhard Wolff - @ewolff

Deploy•  Install a basic machine

•  Install Java

•  Copy over .jar

•  Optional: Create application.properties

Eberhard Wolff - @ewolff

Infrastructure for Microservices

•  More services

•  Need infrastructure Easy to create a new project REST integrated Messaging supported Simple deployment Uniform operations

✓ ✓

✓ ✓

Eberhard Wolff - @ewolff

Spring Boot Actuator•  Provide information about the

application •  Via http / JSON •  Can be evaluated by monitoring

tools etc. •  Another alternative approach to

monitoring

Spring BootActuator

Demo

Eberhard Wolff - @ewolff

Infrastructure for Microservices

•  More services

•  Need infrastructure Easy to create a new project REST integrated Messaging supported Simple deployment Uniform operations

✓ ✓

✓ ✓ ✓

Eberhard Wolff - @ewolff

Deploy•  Just package everything in an

executable JAR

Eberhard Wolff - @ewolff

Deploy•  Just package everything in an

executable JAR •  …or a WAR

Eberhard Wolff - @ewolff

Spring Cloud

Eberhard Wolff - @ewolff

Based on Spring Boot

Eberhard Wolff - @ewolff

Spring Cloud•  Spring support for Amazon Web

Services •  Connector for Heroku PaaS •  …and Cloud Foundry PaaS

•  The rest of Spring Cloud is for Microservices

Eberhard Wolff - @ewolff

CoordinatingMicroservices

Eberhard Wolff - @ewolff

Microservice Microservice

Must find each other

Eberhard Wolff - @ewolff

Service Discovery

Eureka

Eberhard Wolff - @ewolff

Why Eureka?•  REST based service registry •  Supports replication •  Caches on the client •  Resilient •  Fast •  …but not consistent •  Foundation for other services

Eberhard Wolff - @ewolff

Eureka Client in Spring Cloud•  @EnableDiscoveryClient:

generic •  @EnableEurekaClient:

more specific •  Dependency to

spring-cloud-starter-eureka •  Automatically registers application

Eberhard Wolff - @ewolff

application.properties

eureka.client.serviceUrl.defaultZone=http://host:8761/eureka/<

eureka.instance.leaseRenewalIntervalInSeconds=5<spring.application.name=catalog<eureka.instance.metadataMap.instanceId=$

{spring.application.name}:${random.value}<eureka.instance.preferIpAddress=true<

Eureka server Can include user / password

Need unique ID Load balancing

Faster updates

Docker won’t resolve host names

Used for registration In CAPITAL caps

Eberhard Wolff - @ewolff

Eureka Server

@EnableEurekaServer<@EnableAutoConfiguration<public'class'EurekaApplication'{'<<public'static'void'main(String[]'args)'{'<<SpringApplication.run(EurekaApplication.class,'args);'<}<

<}<

Add dependency to spring-cloud-starter-eureka-server

Eberhard Wolff - @ewolff

Eberhard Wolff - @ewolff

Eureka Demo

Eberhard Wolff - @ewolff

Microservice Microservice

Must find each other

Route calls to a service

Eberhard Wolff - @ewolff

Zuul Routing

Eberhard Wolff - @ewolff

Routing•  One URL to the outside

•  Internal: Many Microservices

•  REST

•  Or HTML GUI

Eberhard Wolff - @ewolff

Customer Order Catalog

Zuul Proxy

Automatically maps route to server registered on Eureka i.e. /customer/** to CUSTOMER No configuration

Can add filters etc

Eberhard Wolff - @ewolff

Zuul Proxy

@SpringBootApplication@EnableZuulProxypublic class ZuulApplication {

public static void main(String[] args) { new SpringApplicationBuilder(ZuulApplication.class).

web(true).run(args);}

}

Enable Zuul Proxy

Can change route Also routing to external services possible

Eberhard Wolff - @ewolff

lokaler Rechner

Vagrant VM

eureka zuul

customer-app

catalog-apporder-app

172.17.0.0/16 Netzwerk

8761

8761

8080

8080

18761 18080

Eberhard Wolff - @ewolff

Zuul Demo

Eberhard Wolff - @ewolff

Microservice Microservice

Must find each other

Configuration

Route calls to a service

Eberhard Wolff - @ewolff

Configuration•  Spring Cloud Config •  Central configuration •  Dynamic updates •  Can use git backend

•  I prefer immutable server •  & DevOps tools (Docher, Chef…)

Eberhard Wolff - @ewolff

Microservice Microservice

Must find each other

Configuration

Route calls to a service

Communication

Eberhard Wolff - @ewolff

Spring Cloud Bus

Eberhard Wolff - @ewolff

Spring Cloud Bus•  Pushed config updates •  …or individual message

•  I prefer a messaging solution •  Independent from Spring

Eberhard Wolff - @ewolff

Microservice Microservice

Must find each other

Configuration

Route calls to a service

Communication

Security

Eberhard Wolff - @ewolff

Spring Cloud Security

Eberhard Wolff - @ewolff

Spring Cloud Security•  Single Sign On via OAuth2 •  Forward token e.g. via

RestTemplate •  Support for Zuul

•  Very valuable!

Eberhard Wolff - @ewolff

ImplementingMicroservices

Eberhard Wolff - @ewolff

Microservice Microservice

Load Balancing

Eberhard Wolff - @ewolff

Load BalancingRibbon

Eberhard Wolff - @ewolff

Ribbon: Client Side Load Balancing

•  Decentralized Load Balancing •  No bottle neck •  Resilient •  Hard to consider metrics / health •  Data might be inconsistent

Load Balancer

Server Client

Eberhard Wolff - @ewolff

RestTemplate & Load Balancing

@RibbonClient(name = "ribbonApp")…public class RibbonApp {

@Autowiredprivate RestTemplate restTemplate;

public void callMicroService() {Store store = restTemplate. getForObject("http://stores/store/1",Store.class);}

}

Enable Ribbon

Left out other annotations

Eureka name or server list

Standard Spring REST client

Can also use Ribbon API

Eberhard Wolff - @ewolff

Microservice Microservice

Load Balancing

Resilience

Eberhard Wolff - @ewolff

Hystrix Resilience

Eberhard Wolff - @ewolff

Hystrix•  Enable resilient applications

•  Do call in other thread pool •  Won’t block request handler •  Can implement timeout

Eberhard Wolff - @ewolff

Hystrix•  Circuit Breaker •  If call system fail open •  If open do not forward call •  Forward calls after a time window

•  System won’t be swamped with requests

Eberhard Wolff - @ewolff

Hystrix / Spring Cloud•  Annotation based approach •  Java Proxies automatically created •  Annotations of javanica libraries

•  Simplifies Hystrix dramatically •  No commands etc

Eberhard Wolff - @ewolff

@HystrixCommand(fallbackMethod = "getItemsCache")public Collection<Item> findAll() {

…this.itemsCache = pagedResources.getContent();return itemsCache;

}

private Collection<Item> getItemsCache() {return itemsCache;

}<

Fallback

Eberhard Wolff - @ewolff

lokaler Rechner

Vagrant VM

eureka zuul

customer-app

catalog-apporder-app

172.17.0.0/16 Netzwerk

8761

8761

8080

8080

18761 18080

Eberhard Wolff - @ewolff

lokaler Rechner

Vagrant VM

eureka zuul

customer-app

catalog-app

turbine

order-app

172.17.0.0/16 Netzwerk

8761

8761

8989

8989

8080

8080

18761 18989 18080

Eberhard Wolff - @ewolff

Hystrix DashboardStream via http

Circuit Breaker status

Thread Pool status

Eberhard Wolff - @ewolff

Conclusion

Eberhard Wolff - @ewolff

Spring Boot for Microservices Easy to create a new project REST integrated Messaging supported Simple deployment Uniform operations

✓ ✓

✓ ✓ ✓

Eberhard Wolff - @ewolff

Hystrix Demo

Eberhard Wolff - @ewolff

Must find each other: Service Discovery

Configuration

Route calls to a service

Communication

Load Balancing

Resilience

Spring Cloud for Microservices

Eberhard Wolff - @ewolff

Linkshttp://projects.spring.io/spring-boot/ http://projects.spring.io/spring-cloud https://github.com/ewolff/spring-boot-demos https://github.com/ewolff/microservices https://spring.io/guides/

Eberhard Wolff - @ewolff

Thank You!!