A presentation at JavaOne in in San Francisco, CA, USA by Holly Cummins
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
Are microservices a wonder-pattern for rescuing intractably complex applications? Or are they just a restatement of the software engineering best practices we all should be following anyway? Or something in between?
How do they work? How should they be written? What are the pitfalls? What are the underpinning technologies?
The following resources were mentioned during the presentation or are useful additional information.
Here’s what was said about this presentation on social media.
Leftovers from @holly_cummins in Market Street! pic.twitter.com/ugTk9JdsQO
— Erin Schnabel (@ebullientworks) September 22, 2016