Page 1
© 2015 IBM Corporation
Holly Cummins @holly_cummins
Microservices
Page 2
© 2015 IBM Corporation
Holly Cummins @holly_cummins
Microservices
Page 3
@holly_cummins#microservicesdream
Page 4
@holly_cummins#microservicesdream
?
Page 5
@holly_cummins#microservicesdream
Page 6
@holly_cummins#microservicesdream
Page 7
@holly_cummins#microservicesdream
Page 8
@holly_cummins#microservicesdream
Page 9
@holly_cummins#microservicesdream
Page 10
@holly_cummins#microservicesdream
Page 11
@holly_cummins#microservicesdream
Page 12
Monolithic application
Page 13
ModularityMonolithic application
Page 14
Monolithic application
Page 15
Monolithic application
Scaling
Page 16
Monolithic application
Page 17
Monolithic application
Failing
Page 18
Monolithic application
Failing
Page 19
Monolithic application
Failing
Page 20
Monolithic application
Failing
Page 21
Monolithic application
Failed
Page 22
Monolithic application
Update
Page 23
Monolithic application
Update
Page 24
Monolithic application
Update
Page 25
Monolithic application
Update
Page 26
Monolithic application
Update
Page 27
Monolithic application
Update
Page 28
Monolithic application
Update
Page 29
Monolithic application
Revolution
Page 30
Monolithic application
Revolution
Page 32
http://localhost:9090/catastrophe.monolith
Page 35
Microservices application
Page 36
ModularityMicroservices application
Page 37
Microservices application
Page 38
InteractionsMicroservices application
Page 39
Microservices application
Page 40
ScaledMicroservices application
Page 41
ScaledMicroservices application
Page 42
ScaledMicroservices application
Page 43
ScaledMicroservices application
Page 44
Microservices application
Page 45
EvolutionMicroservices application
Page 46
EvolutionMicroservices application
Page 47
EvolutionMicroservices application
Page 48
EvolutionMicroservices application
Page 55
Datacentre in a handbag
Page 57
Distributed computing fallacies
Page 58
Distributed computing fallacies
“Inconceivable!”
Page 59
Distributed computing fallacies
“Inconceivable!”
“You keep saying that. I dinna think it means what you think it means.”
Page 62
You need 100% automation
Page 63
#microservicesdream @holly_cummins
–Holly Cummins
“…die Codebasis aufbrechen, ohne sie zu zerbrechen…”
Page 66
Slice it up!HTTP HTTP
HTTP
Page 67
HTTP HTTP
HTTP
Peel it off.
Page 69
REST REST
Message
Page 71
Exposing a service in a monolith
@ApplicationScopedpublic class CatRepository {!
public Set<MiniCat> getAllCats() {
Page 72
Exposing a microservice
@Path("cat")public class CatRepository {!
@Path("allcats") @Produces(MediaType.APPLICATION_JSON) @GET public Set<Cat> getAllCats() { …
Page 73
@Path("cat")public class CatRepository {!
@Path("allcats") @Produces(MediaType.APPLICATION_JSON) @GET public Set<Cat> getAllCats() { …
JAXRS=magic
Page 74
Consuming a service in a monolith
!
@Inject CatRepository catRepo; ... Set<Cat> cats = catRepo.getAllCats();
Page 75
Client client = ClientBuilder.newClient();WebTarget target = client.target(“http://localhost:9080") .path(“catastrophe.cats/rest/cat/cats");Set<Cat> cats = target.request(MediaType.APPLICATION_JSON) .get(new GenericType<Set<Cat>>(Set.class));
Consuming a microservice
Page 76
@holly_cummins#microservicesdream
Very nice. Does it actually work?
Page 77
@holly_cummins#microservicesdream
Very nice. Does it actually work?
http://raspberrypiclearcase.local:9083/catastrophe.scoring.auth/rest/auth/leaderboard
Page 78
Don’t forget to slice up the database too
Page 82
Network topology
ip address: ?.?.?.?
Page 83
Network topology
ip address: ?.?.?.?
ip address: ?.?.?.?
Page 84
Network topology
ip address: ?.?.?.?
ip address: ?.?.?.?
ip address: ?.?.?.?
Page 85
Network topology
ip address: ?.?.?.?
ip address: ?.?.?.?
ip address: ?.?.?.?
ip address: ?.?.?.?
Page 86
Network topology
ip address: ?.?.?.?
ip address: ?.?.?.?
ip address: ?.?.?.?
ip address: ?.?.?.?
ip address: ?.?.?.?
Page 87
Network topology
ip address: special
ip address: precious
ip address: bespoke
ip address: lovely
ip address: fave
Page 88
Network topology
ip address: special
ip address: precious
ip address: bespoke
ip address: fave
Page 92
Scaling
ip address: special
ip address: precious
ip address: bespoke
ip address: fave
ip address: lovely
Page 93
Scaling
ip address: special
ip address: precious
ip address: bespoke
ip address: fave
ip address: lovely
ip address: lonely
Page 94
Scaling
ip address: special
ip address: precious
ip address: bespoke
ip address: fave
ip address: lovely
ip address: lonely
Page 95
Service discovery
• Kubernetes
• Apache Zookeeper + Curator
• Eureka
• etcd
• Consul
Page 96
Service discovery
• Kubernetes
• Apache Zookeeper + Curator
• Eureka
• etcd
• Consul
Docker
Page 97
Service discovery
• Kubernetes
• Apache Zookeeper + Curator
• Eureka
• etcd
• Consul
Docker
Java
Page 98
Service discovery
• Kubernetes
• Apache Zookeeper + Curator
• Eureka
• etcd
• Consul
AWS
Docker
Java
SoftLayer
Page 99
Service discovery
• Kubernetes
• Apache Zookeeper + Curator
• Eureka
• etcd
• Consul
AWS
CoreOS
Docker
Java
SoftLayer
Page 100
Service discovery
• Kubernetes
• Apache Zookeeper + Curator
• Eureka
• etcd
• Consul
AWS
CoreOS
Docker
Java
DNS HTTP Java
SoftLayer
Page 102
Cat-astropheREST REST
REST
Page 103
Cat-astrophe
Consul
REST REST
REST
Page 104
Cat-astrophe
Discovery
Discovery
Discovery
Consul
REST REST
REST
Page 106
<featureManager> <feature>jaxrs-1.0</feature>
Page 107
<featureManager> <feature>jaxrs-1.0</feature>
Server configuration
Page 108
<featureManager> <feature>jaxrs-1.0</feature> <feature>usr:discovery</feature> …
<consul server="catastrophe.cat" />
Server configuration
Page 109
<featureManager> <feature>jaxrs-1.0</feature> <feature>usr:discovery</feature> …
<consul server="catastrophe.cat" />
Wouldn’t this be nice?
Server configuration
Page 112
Liberty extension
(“user feature”)
Page 113
Liberty extension
(“user feature”)
Page 114
Auto-publishes REST
endpoints
Liberty extension
(“user feature”)
Page 115
Auto-publishes REST
endpoints
Liberty extension
(“user feature”)
I
WebSphere Liberty extensibility
Page 116
@holly_cummins#microservicesdream
http://consul.cat:8500
Page 117
public String getHostAndPort(String serviceName) {! List<CatalogService> services = client.getCatalogService(serviceName, QUERY_PARAMS).getValue(); int numServices = services.size(); if (numServices > 0) { // Do a simple random-robin :) int index = RANDOM.nextInt(numServices); CatalogService service = services.get(index); return service.getServiceAddress() + ":" + service.getServicePort(); } else { System.out.println("No services available with name " + serviceName); }
Page 118
@holly_cummins#microservicesdream
http://raspberrypi.local:9080/catastrophe.web
Page 119
#microservicesdream @holly_cummins
–Johnny Appleseed
“Type a quote here.”
Page 120
@holly_cummins#microservicesdream
https://console.eu-gb.bluemix.net
Page 121
@holly_cummins#microservicesdream
http://catastropheweb.eu-gb.mybluemix.net/catastrophe.web/
Page 123
@holly_cummins#microservicesdream
www.wasdev.net
!
Any questions? !
!bluemix.net
@holly_cummins