IBM _ Java EE Microservices by Example: from Raspberry Pis to the Cloud Holly Cummins September 2016 @holly_cummins 1

http://ibm.biz/bluemixgaragelondon http://ibm.biz/bluemixgaragelondon http://ibm.biz/bluemixgaragelondon @holly_cummins @holly_cummins

http://ibm.biz/bluemixgaragelondon http://ibm.biz/bluemixgaragelondon http://ibm.biz/bluemixgaragelondon @holly_cummins @holly_cummins

http://ibm.biz/bluemixgaragelondon @holly_cummins

Microservices make your colleagues less annoying. Microservices are guaranteed bug-free. Microservices: Good design built-in! Kittens love microservices. Microservices vaporize unclean code. Microservices. The best thing since sliced bread. Every microservice comes with a free puppy. http://ibm.biz/bluemixgaragelondon @holly_cummins

Wait. What problem are we actually trying to solve? http://ibm.biz/bluemixgaragelondon @holly_cummins

http://ibm.biz/bluemixgaragelondon @holly_cummins

Monolithic Modularity http://ibm.biz/bluemixgaragelondon @holly_cummins

http://ibm.biz/bluemixgaragelondon @holly_cummins

Monolithic Scaling http://ibm.biz/bluemixgaragelondon @holly_cummins

http://ibm.biz/bluemixgaragelondon @holly_cummins

Monolithic Failing http://ibm.biz/bluemixgaragelondon @holly_cummins

Monolithic Failing http://ibm.biz/bluemixgaragelondon @holly_cummins

Monolithic Failing http://ibm.biz/bluemixgaragelondon @holly_cummins

Monolithic Failing http://ibm.biz/bluemixgaragelondon @holly_cummins

Monolithic Failure http://ibm.biz/bluemixgaragelondon @holly_cummins

Monolithic Update http://ibm.biz/bluemixgaragelondon @holly_cummins

Monolithic Update http://ibm.biz/bluemixgaragelondon @holly_cummins

Monolithic Update http://ibm.biz/bluemixgaragelondon @holly_cummins

Monolithic Update http://ibm.biz/bluemixgaragelondon @holly_cummins

Monolithic Update http://ibm.biz/bluemixgaragelondon @holly_cummins

Monolithic Update http://ibm.biz/bluemixgaragelondon @holly_cummins

Monolithic Update http://ibm.biz/bluemixgaragelondon @holly_cummins

Monolithic Redesign http://ibm.biz/bluemixgaragelondon @holly_cummins

Monolithic Redesign http://ibm.biz/bluemixgaragelondon @holly_cummins

Monolithic Redesign (Revolution required.) http://ibm.biz/bluemixgaragelondon @holly_cummins

http://ibm.biz/bluemixgaragelondon @holly_cummins

Microservice Modularity http://ibm.biz/bluemixgaragelondon @holly_cummins

http://ibm.biz/bluemixgaragelondon @holly_cummins

Microservice Interactions http://ibm.biz/bluemixgaragelondon @holly_cummins

http://ibm.biz/bluemixgaragelondon @holly_cummins

Microservices Scaled http://ibm.biz/bluemixgaragelondon @holly_cummins

Microservices Scaled http://ibm.biz/bluemixgaragelondon @holly_cummins

Microservices Scaled http://ibm.biz/bluemixgaragelondon @holly_cummins

Microservices Scaled http://ibm.biz/bluemixgaragelondon @holly_cummins

http://ibm.biz/bluemixgaragelondon @holly_cummins

Microservices Redesign http://ibm.biz/bluemixgaragelondon @holly_cummins

Microservices Redesign (Evolution reduces risk.) http://ibm.biz/bluemixgaragelondon @holly_cummins

All good demos involve cats. … http://ibm.biz/bluemixgaragelondon @holly_cummins

All good demos involve cats. http://ibm.biz/bluemixgaragelondon @holly_cummins

http://ibm.biz/bluemixgaragelondon @holly_cummins

http://ibm.biz/bluemixgaragelondon @holly_cummins

http://ibm.biz/bluemixgaragelondon @holly_cummins

… All good demos involve cats and raspberry pis. http://ibm.biz/bluemixgaragelondon @holly_cummins

All good demos involve cats and raspberry pis. http://ibm.biz/bluemixgaragelondon @holly_cummins

http://ibm.biz/bluemixgaragelondon @holly_cummins

Datacentre in a handbag http://ibm.biz/bluemixgaragelondon @holly_cummins

What, no Docker? http://ibm.biz/bluemixgaragelondon @holly_cummins

http://ibm.biz/bluemixgaragelondon @holly_cummins

http://ibm.biz/bluemixgaragelondon @holly_cummins

Cat-astrophe http://ibm.biz/bluemixgaragelondon @holly_cummins

Powered by WebSphere Liberty … of course http://ibm.biz/bluemixgaragelondon @holly_cummins

http://ibm.biz/bluemixgaragelondon @holly_cummins

http://raspberrypi.local:8080/ http://ibm.biz/bluemixgaragelondon @holly_cummins

What happens if things fail? http://ibm.biz/bluemixgaragelondon @holly_cummins

http://ibm.biz/bluemixgaragelondon @holly_cummins

Refactoring your way to the microservices dream http://ibm.biz/bluemixgaragelondon @holly_cummins

http://github.com/holly-cummins/catastrophe-microservices Slice it up! http://ibm.biz/bluemixgaragelondon @holly_cummins

http://github.com/holly-cummins/catastrophe-microservices Slice it up! http://ibm.biz/bluemixgaragelondon @holly_cummins

http://github.com/holly-cummins/catastrophe-microservices HTTP HTTP HT TP Slice it up! http://ibm.biz/bluemixgaragelondon @holly_cummins

http://github.com/holly-cummins/catastrophe-microservices HTTP HTTP HT TP Peel it off. http://ibm.biz/bluemixgaragelondon @holly_cummins

Should we decompose the front-end? http://ibm.biz/bluemixgaragelondon @holly_cummins

• Probably not. Should we decompose the front-end? http://ibm.biz/bluemixgaragelondon @holly_cummins

• Probably not. • Single Origin headaches Should we decompose the front-end? http://ibm.biz/bluemixgaragelondon @holly_cummins

• Probably not. • Single Origin headaches • Page composition headaches Should we decompose the front-end? http://ibm.biz/bluemixgaragelondon @holly_cummins

REST REST http://ibm.biz/bluemixgaragelondon RE ST @holly_cummins

Message REST http://ibm.biz/bluemixgaragelondon RE ST @holly_cummins

REST REST http://ibm.biz/bluemixgaragelondon RE ST @holly_cummins

• Synchronous is convenient • Asynchronous has scalability advantages • Consider reactive architectures REST != synchronous (well, not necessarily) http://ibm.biz/bluemixgaragelondon @holly_cummins

How hard the refactoring is depends on where you started http://ibm.biz/bluemixgaragelondon @holly_cummins

@ApplicationScoped public class CatRepository { public Set<Cat> getAllCats() { Exposing a service in a monolith http://ibm.biz/bluemixgaragelondon @holly_cummins

@Path(“cat”) public class CatRepository { @Path(“allcats”) @Produces(MediaType.APPLICATION_JSON) @GET public Set<Cat> getAllCats() { … Exposing a microservice http://ibm.biz/bluemixgaragelondon @holly_cummins

@Path(“cat”) public class CatRepository { @Path(“allcats”) @Produces(MediaType.APPLICATION_JSON) @GET public Set<Cat> getAllCats() { … JAXRS=magic http://ibm.biz/bluemixgaragelondon @holly_cummins

@Path(“allcats”) @Asynchronous @GET public void getAllCats(@Suspended final AsyncResponse response) { // stuff response.resume(stuff) Go asynchronous for scalability http://ibm.biz/bluemixgaragelondon @holly_cummins

@Path(“allcats”) @Asynchronous @GET public void getAllCats(@Suspended final AsyncResponse response) { // stuff response.resume(stuff) http://ibm.biz/bluemixgaragelondon @holly_cummins

@Inject CatRepository catRepo; … Set<Cat> cats = catRepo.getAllCats(); Consuming a service in a monolith http://ibm.biz/bluemixgaragelondon @holly_cummins

Client client = ClientBuilder.newClient(); WebTarget target = client.target(“http://localhost:9080”) .path(“/rest/cat/cats”); Set<Cat> cats = target.request(MediaType.APPLICATION_JSON) .get(new GenericType<>(Set.class)); Consuming a REST microservice http://ibm.biz/bluemixgaragelondon @holly_cummins

Don’t forget to slice up the database too http://ibm.biz/bluemixgaragelondon @holly_cummins

REST REST http://ibm.biz/bluemixgaragelondon RE ST @holly_cummins

REST REST http://ibm.biz/bluemixgaragelondon RE ST @holly_cummins

Are we done? http://ibm.biz/bluemixgaragelondon @holly_cummins

Don’t forget to slice up the data model too http://ibm.biz/bluemixgaragelondon @holly_cummins

Don’t do what I did :) http://ibm.biz/bluemixgaragelondon @holly_cummins

compile project(“:catastrophe-interfaces”) Don’t do what I did :) http://ibm.biz/bluemixgaragelondon @holly_cummins

compile project(“:catastrophe-interfaces”) mymac:~ holly$ git submodule add ../catastrophe-interfaces Don’t do what I did :) http://ibm.biz/bluemixgaragelondon @holly_cummins

An anti-pattern compile project(“:catastrophe-interfaces”) mymac:~ holly$ git submodule add ../catastrophe-interfaces Don’t do what I did :) http://ibm.biz/bluemixgaragelondon @holly_cummins

An anti-pattern compile project(“:catastrophe-interfaces”) mymac:~ holly$ git submodule add ../catastrophe-interfaces Don’t do what I did :) http://ibm.biz/bluemixgaragelondon This is a code-layout description, not a functional one @holly_cummins

Duplication of code Decoupling The tradeoff http://ibm.biz/bluemixgaragelondon @holly_cummins

Duplication of code Compile-time independence The tradeoff http://ibm.biz/bluemixgaragelondon @holly_cummins

If this tradeoff is hurting, your domain model is too coupled. http://ibm.biz/bluemixgaragelondon @holly_cummins

If this tradeoff is hurting, your domain model is too coupled. Have your microservices got the right granularity? http://ibm.biz/bluemixgaragelondon @holly_cummins

http://ibm.biz/bluemixgaragelondon @holly_cummins

“Does this domain model make sense?” http://ibm.biz/bluemixgaragelondon @holly_cummins

“Does this domain model make sense?” “Not really.” http://ibm.biz/bluemixgaragelondon @holly_cummins

“Does this domain model make sense?” “Not really.” “Does decomposing a system of this size into microservices actually make sense?” http://ibm.biz/bluemixgaragelondon @holly_cummins

“Does this domain model make sense?” “Not really.” “Does decomposing a system of this size into microservices actually make sense?” “Well, no.” http://ibm.biz/bluemixgaragelondon @holly_cummins

“Does this domain model make sense?” “Not really.” “Does decomposing a system of this size into microservices actually make sense?” “Well, no.” The right granularity may be “monolith.” http://ibm.biz/bluemixgaragelondon @holly_cummins

http://ibm.biz/bluemixgaragelondon @holly_cummins

HTTP HTTP http://ibm.biz/bluemixgaragelondon HT TP @holly_cummins

HTTP Remember the distributed computing fallacies. http://ibm.biz/bluemixgaragelondon HTTP HT TP @holly_cummins

HTTP Really Remember the distributed computing fallacies. http://ibm.biz/bluemixgaragelondon HTTP HT TP @holly_cummins

http://ibm.biz/bluemixgaragelondon @holly_cummins

http://ibm.biz/bluemixgaragelondon @holly_cummins

http://ibm.biz/bluemixgaragelondon @holly_cummins

Complexity http://ibm.biz/bluemixgaragelondon @holly_cummins

WebTarget cat = client.target(“http://raspberrypiclearcase.local”); WebTarget auth = client.target(“http://raspberrypi2.local”); WebTarget scoring = client.target(“http://raspberrypiredcase.local”);

WebTarget cat = client.target(“http://raspberrypiclearcase.local”); WebTarget auth = client.target(“http://raspberrypi2.local”); WebTarget scoring = client.target(“http://raspberrypiredcase.local”); This is robust code, right?

ip add r ess: ? .?.?.? ip address: ?.?.?.? ip address: ?.?.?.? ip add r ess: ? .?.?.? ip address: ?.?.?.? Network topology http://ibm.biz/bluemixgaragelondon @holly_cummins

ip add r ess: s pecial ip address: bespoke ip address: precious ip add r ess: lo vely ip address: fave Network topology http://ibm.biz/bluemixgaragelondon @holly_cummins

http://ibm.biz/bluemixgaragelondon @holly_cummins

Disposability http://ibm.biz/bluemixgaragelondon @holly_cummins

Disposability Say no to snowflake servers http://ibm.biz/bluemixgaragelondon @holly_cummins

Disposability Say no to snowflake servers http://ibm.biz/bluemixgaragelondon @holly_cummins

ip add r ess: s pecial ip address: bespoke ip address: precious ip add r ess: lo vely ip address: fave Scaling http://ibm.biz/bluemixgaragelondon @holly_cummins

ip add r ess: s pecial ip address: bespoke ip address: precious ip add r ess: lo vely ip address: fave Scaling http://ibm.biz/bluemixgaragelondon ip add r ess: lo nely @holly_cummins

ip add r ess: s pecial ip address: bespoke ip address: precious ip add r ess: lo vely ip address: fave Scaling http://ibm.biz/bluemixgaragelondon ip add r ess: lo nely @holly_cummins

• Kubernetes • Apache Zookeeper + Curator • Eureka • etcd • Consul • Bluemix Service Discovery Service discovery http://ibm.biz/bluemixgaragelondon @holly_cummins

• Docker Kubernetes • Apache Zookeeper + Curator • Eureka • etcd • Consul • Bluemix Service Discovery Service discovery http://ibm.biz/bluemixgaragelondon @holly_cummins

• Docker Kubernetes • Apache Zookeeper + Curator Java • Eureka • etcd • Consul • Bluemix Service Discovery Service discovery http://ibm.biz/bluemixgaragelondon @holly_cummins

• Docker Kubernetes • Apache Zookeeper + Curator Java • EurekaAWSSoftLayer • etcd • Consul • Bluemix Service Discovery Service discovery http://ibm.biz/bluemixgaragelondon @holly_cummins

• Docker Kubernetes • Apache Zookeeper + Curator Java • EurekaAWSSoftLayer • etcd CoreOS • Consul • Bluemix Service Discovery Service discovery http://ibm.biz/bluemixgaragelondon @holly_cummins

• Docker Kubernetes • Apache Zookeeper + Curator Java • EurekaAWSSoftLayer • etcd CoreOS • ConsulDNS HTTP Java • Bluemix Service Discovery Service discovery http://ibm.biz/bluemixgaragelondon @holly_cummins

• Docker Kubernetes • Apache Zookeeper + Curator Java • EurekaAWSSoftLayer • etcd CoreOS • ConsulDNS HTTP Java • Bluemix Service Discovery Bluemix :) Service discovery http://ibm.biz/bluemixgaragelondon @holly_cummins

Cat-astrophe http://ibm.biz/bluemixgaragelondon @holly_cummins

REST REST RE ST Cat-astrophe http://ibm.biz/bluemixgaragelondon @holly_cummins

Consul REST REST RE ST Cat-astrophe http://ibm.biz/bluemixgaragelondon @holly_cummins

Consul Discovery REST Dis cov Discovery REST ery RE ST Cat-astrophe http://ibm.biz/bluemixgaragelondon @holly_cummins

http://ibm.biz/bluemixgaragelondon @holly_cummins

<featureManager> <feature>jaxrs-1.0</feature> http://ibm.biz/bluemixgaragelondon @holly_cummins

Server configuration <featureManager> <feature>jaxrs-1.0</feature> http://ibm.biz/bluemixgaragelondon @holly_cummins

Server configuration <featureManager> <feature>jaxrs-1.0</feature> <feature>usr:discovery</feature> … <consul server=”catastrophe.consul” /> http://ibm.biz/bluemixgaragelondon @holly_cummins

Server configuration <featureManager> <feature>jaxrs-1.0</feature> <feature>usr:discovery</feature> … Wouldn’t this be nice? <consul server=”catastrophe.consul” /> http://ibm.biz/bluemixgaragelondon @holly_cummins

http://ibm.biz/bluemixgaragelondon @holly_cummins

http://ibm.biz/bluemixgaragelondon @holly_cummins

Liberty extension (“user feature”) http://ibm.biz/bluemixgaragelondon @holly_cummins

Liberty extension (“user feature”) http://ibm.biz/bluemixgaragelondon @holly_cummins

Autopublishes REST endpoints Liberty extension (“user feature”) http://ibm.biz/bluemixgaragelondon @holly_cummins

Autopublishes REST endpoints I WebSphere Liberty extensibility Liberty https://github.com/WASdev/sample.consulservicediscovery extension (“user feature”) http://ibm.biz/bluemixgaragelondon @holly_cummins

“Type a quote here.” –Johnny Appleseed Consul view of the Catastrophe services http://ibm.biz/bluemixgaragelondon @holly_cummins

http://ibm.biz/bluemixgaragelondon @holly_cummins

http://ibm.biz/bluemixgaragelondon @holly_cummins

You need DevOps http://ibm.biz/bluemixgaragelondon @holly_cummins

An SD card is not devops :) You need 100% automation http://ibm.biz/bluemixgaragelondon @holly_cummins

“Type a quote here.” –Johnny Appleseed http://ibm.biz/bluemixgaragelondon @holly_cummins

“Type a quote here.” –Johnny Appleseed http://ibm.biz/bluemixgaragelondon @holly_cummins

http://ibm.biz/bluemixgaragelondon @holly_cummins

http://catastrophe-web.mybluemix.net/

Who can draw the best cat? http://catastrophe-web.mybluemix.net/ (I have THINK hats for the highest scores!)

What if I want to run on both pis and the cloud?

What if I want to run on both pis and the cloud? You need Hybrid Cloud!

What if I want to run on both pis and the cloud? “Type a quote here.” –Johnny Appleseed You need Hybrid Cloud!

Are we done? http://ibm.biz/bluemixgaragelondon @holly_cummins

Consul Discovery REST Dis cov Discovery REST ery RE ST Are we done? http://ibm.biz/bluemixgaragelondon @holly_cummins

Have we tested it? http://ibm.biz/bluemixgaragelondon @holly_cummins

How de we handle failures? http://ibm.biz/bluemixgaragelondon @holly_cummins

Are we actually decoupled? http://ibm.biz/bluemixgaragelondon @holly_cummins

Are we actually decoupled? http://ibm.biz/bluemixgaragelondon @holly_cummins

So remember… http://ibm.biz/bluemixgaragelondon • Decoupling is more than just HTTP communication • Some of your microservices will fail. Be resilient. • I ♥ WebSphere Liberty • JEE is great for microservices (especially with microprofile) • Hybrid cloud makes a lot of cool stuff possible @holly_cummins

IBM _ 74 Thank You! http://ibm.biz/bluemixgaragelondon http://github.com/holly-cummins/catastrophe-microservices Holly Cummins | @holly_cummins