Microservices from dream to reality in an hour - Dr. Holly Cummins

126
© 2015 IBM Corporation Holly Cummins @holly_cummins Microservices

Transcript of Microservices from dream to reality in an hour - Dr. Holly Cummins

© 2015 IBM Corporation

Holly Cummins @holly_cummins

Microservices

© 2015 IBM Corporation

Holly Cummins @holly_cummins

Microservices

@holly_cummins#microservicesdream

@holly_cummins#microservicesdream

?

@holly_cummins#microservicesdream

@holly_cummins#microservicesdream

@holly_cummins#microservicesdream

@holly_cummins#microservicesdream

@holly_cummins#microservicesdream

@holly_cummins#microservicesdream

@holly_cummins#microservicesdream

Monolithic application

ModularityMonolithic application

Monolithic application

Monolithic application

Scaling

Monolithic application

Monolithic application

Failing

Monolithic application

Failing

Monolithic application

Failing

Monolithic application

Failing

Monolithic application

Failed

Monolithic application

Update

Monolithic application

Update

Monolithic application

Update

Monolithic application

Update

Monolithic application

Update

Monolithic application

Update

Monolithic application

Update

Monolithic application

Revolution

Monolithic application

Revolution

Cat-astrophe

http://localhost:9090/catastrophe.monolith

Oops.

Oops.

Microservices application

ModularityMicroservices application

Microservices application

InteractionsMicroservices application

Microservices application

ScaledMicroservices application

ScaledMicroservices application

ScaledMicroservices application

ScaledMicroservices application

Microservices application

EvolutionMicroservices application

EvolutionMicroservices application

EvolutionMicroservices application

EvolutionMicroservices application

Datacentre in a handbag

What, no Docker?

Distributed computing fallacies

Distributed computing fallacies

“Inconceivable!”

Distributed computing fallacies

“Inconceivable!”

“You keep saying that. I dinna think it means what you think it means.”

Complexity

You need DevOps

You need 100% automation

#microservicesdream @holly_cummins

–Holly Cummins

“…die Codebasis aufbrechen, ohne sie zu zerbrechen…”

Slice it up!

Slice it up!

Slice it up!HTTP HTTP

HTTP

HTTP HTTP

HTTP

Peel it off.

REST REST

REST

REST REST

Message

REST REST

REST

Exposing a service in a monolith

@ApplicationScopedpublic class CatRepository {!

public Set<MiniCat> getAllCats() {

Exposing a microservice

@Path("cat")public class CatRepository {!

@Path("allcats") @Produces(MediaType.APPLICATION_JSON) @GET public Set<Cat> getAllCats() { …

@Path("cat")public class CatRepository {!

@Path("allcats") @Produces(MediaType.APPLICATION_JSON) @GET public Set<Cat> getAllCats() { …

JAXRS=magic

Consuming a service in a monolith

!

@Inject CatRepository catRepo; ... Set<Cat> cats = catRepo.getAllCats();

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

@holly_cummins#microservicesdream

Very nice. Does it actually work?

@holly_cummins#microservicesdream

Very nice. Does it actually work?

http://raspberrypiclearcase.local:9083/catastrophe.scoring.auth/rest/auth/leaderboard

Don’t forget to slice up the database too

REST REST

REST

REST REST

REST

Network topology

Network topology

ip address: ?.?.?.?

Network topology

ip address: ?.?.?.?

ip address: ?.?.?.?

Network topology

ip address: ?.?.?.?

ip address: ?.?.?.?

ip address: ?.?.?.?

Network topology

ip address: ?.?.?.?

ip address: ?.?.?.?

ip address: ?.?.?.?

ip address: ?.?.?.?

Network topology

ip address: ?.?.?.?

ip address: ?.?.?.?

ip address: ?.?.?.?

ip address: ?.?.?.?

ip address: ?.?.?.?

Network topology

ip address: special

ip address: precious

ip address: bespoke

ip address: lovely

ip address: fave

Network topology

ip address: special

ip address: precious

ip address: bespoke

ip address: fave

Disposability

Disposability

Scaling

ip address: special

ip address: precious

ip address: bespoke

ip address: fave

ip address: lovely

Scaling

ip address: special

ip address: precious

ip address: bespoke

ip address: fave

ip address: lovely

ip address: lonely

Scaling

ip address: special

ip address: precious

ip address: bespoke

ip address: fave

ip address: lovely

ip address: lonely

Service discovery

• Kubernetes

• Apache Zookeeper + Curator

• Eureka

• etcd

• Consul

Service discovery

• Kubernetes

• Apache Zookeeper + Curator

• Eureka

• etcd

• Consul

Docker

Service discovery

• Kubernetes

• Apache Zookeeper + Curator

• Eureka

• etcd

• Consul

Docker

Java

Service discovery

• Kubernetes

• Apache Zookeeper + Curator

• Eureka

• etcd

• Consul

AWS

Docker

Java

SoftLayer

Service discovery

• Kubernetes

• Apache Zookeeper + Curator

• Eureka

• etcd

• Consul

AWS

CoreOS

Docker

Java

SoftLayer

Service discovery

• Kubernetes

• Apache Zookeeper + Curator

• Eureka

• etcd

• Consul

AWS

CoreOS

Docker

Java

DNS HTTP Java

SoftLayer

Cat-astrophe

Cat-astropheREST REST

REST

Cat-astrophe

Consul

REST REST

REST

Cat-astrophe

Discovery

Discovery

Discovery

Consul

REST REST

REST

<featureManager> <feature>jaxrs-1.0</feature>

<featureManager> <feature>jaxrs-1.0</feature>

Server configuration

<featureManager> <feature>jaxrs-1.0</feature> <feature>usr:discovery</feature> …

<consul server="catastrophe.cat" />

Server configuration

<featureManager> <feature>jaxrs-1.0</feature> <feature>usr:discovery</feature> …

<consul server="catastrophe.cat" />

Wouldn’t this be nice?

Server configuration

Liberty extension

(“user feature”)

Liberty extension

(“user feature”)

Auto-publishes REST

endpoints

Liberty extension

(“user feature”)

Auto-publishes REST

endpoints

Liberty extension

(“user feature”)

I

WebSphere Liberty extensibility

@holly_cummins#microservicesdream

http://consul.cat:8500

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); }

@holly_cummins#microservicesdream

http://raspberrypi.local:9080/catastrophe.web

#microservicesdream @holly_cummins

–Johnny Appleseed

“Type a quote here.”

@holly_cummins#microservicesdream

https://console.eu-gb.bluemix.net

@holly_cummins#microservicesdream

http://catastropheweb.eu-gb.mybluemix.net/catastrophe.web/

Are we done?

@holly_cummins#microservicesdream

www.wasdev.net

!

Any questions? !

!bluemix.net

@holly_cummins