SlideShare a Scribd company logo
‹#›© 2016 Pivotal Software, Inc. All rights reserved. ‹#›© 2016 Pivotal Software, Inc. All rights reserved.
Event Driven Microservices
with Spring Cloud Stream
Toshiaki Maki (@making)
2016-12-03 JJUG CCC 2016 Fall
#jjug_ccc #ccc_ab3
http://bit.ly/making_ccc_a3 (source code)
© 2016 Pivotal Software, Inc. All rights reserved.
Who am I ?
• Toshiaki Maki (@making) http://blog.ik.am
• Sr. Solutions Architect @Pivotal
• Spring Framework enthusiast
bit.ly/hajiboot2
© 2016 Pivotal Software, Inc. All rights reserved.
Contents
•Spring Cloud Stream (25min)
•Advanced Topic (20min)
•Spring Cloud Data Flow (2min)
•Deploy Stream Apps to Cloud Foundry (3min)
© 2016 Pivotal Software, Inc. All rights reserved.
Microservices
Frontend
Customer
Service
Email
Service
Point
Service
Post
Service
© 2016 Pivotal Software, Inc. All rights reserved.
Microservices
Frontend
Customer
Service
Email
Service
Point
Service
Post
Service
HTTP / REST?
© 2016 Pivotal Software, Inc. All rights reserved.
Microservices
Frontend
Customer
Service
Email
Service
Point
Service
Post
Service
ABC
Service
XYZ
Service
© 2016 Pivotal Software, Inc. All rights reserved.
Microservices
Frontend
Customer
Service
Email
Service
Point
Service
Post
Service
ABC
Service
XYZ
Service
© 2016 Pivotal Software, Inc. All rights reserved.
Microservices
Frontend
Customer
Service
Email
Service
Point
Service
Post
Service
ABC
Service
XYZ
Service
© 2016 Pivotal Software, Inc. All rights reserved.
Microservices
Frontend
Customer
Service
Email
Service
Point
Service
Post
Service
ABC
Service
XYZ
Service😩
© 2016 Pivotal Software, Inc. All rights reserved.
Microservices
Frontend
Customer
Service
Email
Service
Point
Service
Post
Service
ABC
Service
XYZ
Service😩
Orchestration Style
© 2016 Pivotal Software, Inc. All rights reserved.
Read Failure
Frontend
Customer
Service
Email
Service
HTTP GET
© 2016 Pivotal Software, Inc. All rights reserved.
Read Failure
Frontend
Customer
Service
Email
Service
🔥
HTTP GET
© 2016 Pivotal Software, Inc. All rights reserved.
Read Failure
Frontend
Customer
Service
Email
Service
🔥
HTTP GET
Circuit Breaker
© 2016 Pivotal Software, Inc. All rights reserved.
Read Failure
Frontend
Customer
Service
Email
Service
🔥
HTTP GET
Circuit Breaker
© 2016 Pivotal Software, Inc. All rights reserved.
Write Failure
Frontend
Customer
Service
Email
Service
HTTP POST
© 2016 Pivotal Software, Inc. All rights reserved.
Write Failure
🔥
Frontend
Customer
Service
Email
Service
HTTP POST
© 2016 Pivotal Software, Inc. All rights reserved.
Write Failure
🔥
Frontend
Customer
Service
Email
Service
😲
HTTP POST
© 2016 Pivotal Software, Inc. All rights reserved.
Event Driven MicroServices
Frontend
Customer
Service
Email
Service
Point
Service
Post
Service
© 2016 Pivotal Software, Inc. All rights reserved.
Event Driven MicroServices
Frontend
Customer
Service
Email
Service
Point
Service
Post
Service
© 2016 Pivotal Software, Inc. All rights reserved.
Event Driven MicroServices
Frontend
Customer
Service
Email
Service
Point
Service
Post
Service
Subscribe
© 2016 Pivotal Software, Inc. All rights reserved.
Event Driven MicroServices
Frontend
Customer
Service
Email
Service
Point
Service
Post
Service
Subscribe
Publish
© 2016 Pivotal Software, Inc. All rights reserved.
Event Driven MicroServices
Frontend
Customer
Service
Email
Service
Point
Service
Post
Service
Subscribe
ABC
Service
XYZ
Service
Publish
© 2016 Pivotal Software, Inc. All rights reserved.
Event Driven MicroServices
Frontend
Customer
Service
Email
Service
Point
Service
Post
Service
Subscribe
ABC
Service
XYZ
Service
Publish
© 2016 Pivotal Software, Inc. All rights reserved.
Event Driven MicroServices
Frontend
Customer
Service
Email
Service
Point
Service
Post
Service
Subscribe
ABC
Service
XYZ
Service
🤓
Publish
© 2016 Pivotal Software, Inc. All rights reserved.
Choreography Style
https://www.thoughtworks.com/insights/blog/scaling-microservices-event-stream
‹#›© 2016 Pivotal Software, Inc. All rights reserved.
Spring Cloud Stream
© 2016 Pivotal Software, Inc. All rights reserved.
Spring Cloud Stream
• Event-driven microservice framework
• Built on battle-tested components (Spring Boot / Spring
Integration)
• Opinionated primitives for streaming applications
• Persistent Pub/Sub
• Consumer Groups
• Partitioning Support
• Pluggable messaging middleware bindings
source | processor | sink
© 2016 Pivotal Software, Inc. All rights reserved.
Source | Sink
Sink
input
Source
output
© 2016 Pivotal Software, Inc. All rights reserved.
Source | Processor | Sink
Source output Processor
output
input
Sink
input
© 2016 Pivotal Software, Inc. All rights reserved.
Spring Cloud Stream Applications
Twitter Stream
Cassandra
java -jar twittersource.jar --server.port=8080
--consumerKey=XYZ --consumerSecret=ABC
--spring.cloud.stream.bindings.
output.destination=ingest
Source
Sink java -jar cassandrasink.jar --server.port=8081
--spring.cassandra.keyspace=tweet
--spring.cloud.stream.bindings.
input.destination=ingest
© 2016 Pivotal Software, Inc. All rights reserved.
Spring Cloud Stream Applications
Twitter Stream
Cassandra
java -jar twittersource.jar --server.port=8080
--consumerKey=XYZ --consumerSecret=ABC
--spring.cloud.stream.bindings.
output.destination=ingest
Source
Sink java -jar cassandrasink.jar --server.port=8081
--spring.cassandra.keyspace=tweet
--spring.cloud.stream.bindings.
input.destination=ingest
Twitter
Stream Cassandraingest
© 2016 Pivotal Software, Inc. All rights reserved.
Message Binders
• @EnableBinding
• Binder Implementations
• Production-Ready
• Rabbit MQ
• Apache Kafka
• Experimental
• JMS
• Google PubSub
© 2016 Pivotal Software, Inc. All rights reserved.
Programming Model (Sink)
@SpringBootApplication

@EnableBinding(Sink.class)

public class DemoSinkApp {
@StreamListener(Sink.INPUT)

void receive(Message<String> message) {

System.out.println("Received " + message.getPayload());

}

public static void main(String[] args) {

SpringApplication.run(DemoSinkApp.class, args);

}

}
© 2016 Pivotal Software, Inc. All rights reserved.
Programming Model (Sink)
@SpringBootApplication

@EnableBinding(Sink.class)

public class DemoSinkApp {
@StreamListener(Sink.INPUT)

void receive(Message<String> message) {

System.out.println("Received " + message.getPayload());

}

public static void main(String[] args) {

SpringApplication.run(DemoSinkApp.class, args);

}

}
public interface Sink {
String INPUT = "input";
@Input(Sink.INPUT)
SubscribableChannel input();

}
© 2016 Pivotal Software, Inc. All rights reserved.
Sink
Properties (Sink)
spring.cloud.stream.bindings.input.destination=demo-strm
demo-
strm
input
© 2016 Pivotal Software, Inc. All rights reserved.
Programming Model (Source)
@SpringBootApplication @RestController
@EnableBinding(Source.class)

public class DemoSourceApp {

@Autowired @Output(Source.OUTPUT)
MessageChannel output;
@GetMapping void send(@RequestParam String text) {

output.send(MessageBuilder.withPayload(text).build());

}

public static void main(String[] args) {

SpringApplication.run(DemoSourceApp.class, args);

}

}
© 2016 Pivotal Software, Inc. All rights reserved.
Programming Model (Source)
@SpringBootApplication @RestController
@EnableBinding(Source.class)

public class DemoSourceApp {

@Autowired @Output(Source.OUTPUT)
MessageChannel output;
@GetMapping void send(@RequestParam String text) {

output.send(MessageBuilder.withPayload(text).build());

}

public static void main(String[] args) {

SpringApplication.run(DemoSourceApp.class, args);

}

}
public interface Source {
String OUTPUT = "output";
@Output(Source.OUTPUT)
MessageChannel output();

}
© 2016 Pivotal Software, Inc. All rights reserved.
Programming Model (Source)
@SpringBootApplication @RestController
@EnableBinding(Source.class)

public class DemoSourceApp {

@Autowired Source source;
@GetMapping void send(@RequestParam String text) {

source.output()
.send(MessageBuilder.withPayload(text).build());

}

public static void main(String[] args) {

SpringApplication.run(DemoSourceApp.class, args);

}

}
© 2016 Pivotal Software, Inc. All rights reserved.
Properties (Source)
spring.cloud.stream.bindings.output.destination=demo-strm
demo-
strm
Source
output
© 2016 Pivotal Software, Inc. All rights reserved.
Properties (Source)
spring.cloud.stream.bindings.output.destination=demo-strm
spring.cloud.stream.bindings.output.contentType=applicati
on/json
demo-
strm
Source
output
© 2016 Pivotal Software, Inc. All rights reserved.
Binder (RabbitMQ)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
demo-
strm
© 2016 Pivotal Software, Inc. All rights reserved.
Binder (Apache Kafka)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-kafka</artifactId>
</dependency>
demo-
strm
© 2016 Pivotal Software, Inc. All rights reserved.
Sink
Pipeline
demo-
strm
input
Source
output
source | sink
© 2016 Pivotal Software, Inc. All rights reserved.
RabbitMQ
demo-strm
© 2016 Pivotal Software, Inc. All rights reserved.
RabbitMQ
demo-strm
Source
© 2016 Pivotal Software, Inc. All rights reserved.
RabbitMQ
demo-strm
Topic
Exchange
demo-strm
Source
© 2016 Pivotal Software, Inc. All rights reserved.
RabbitMQ
demo-strm
Topic
Exchange
demo-strm
Source
© 2016 Pivotal Software, Inc. All rights reserved.
RabbitMQ
demo-strm
Topic
Exchange
demo-strm
Source Sink
© 2016 Pivotal Software, Inc. All rights reserved.
RabbitMQ
demo-strm
Topic
Exchange
demo-strm
.anonymous.x
Queue
demo-strm
Source Sink
© 2016 Pivotal Software, Inc. All rights reserved.
RabbitMQ
demo-strm
Topic
Exchange
demo-strm
.anonymous.x
Queue
demo-strm
Source Sink
© 2016 Pivotal Software, Inc. All rights reserved.
Programming Model (Processor)
@SpringBootApplication

@EnableBinding(Processor.class)

public class DemoProcessorApp {
@StreamListener(Processor.INPUT)
@SendTo(Processor.OUTPUT)

void receive(String text) {

return "[[" + text + "]]";

}

public static void main(String[] args) {

SpringApplication.run(DemoProcessorApp.class, args);

}

}
© 2016 Pivotal Software, Inc. All rights reserved.
Properties (Processor)
spring.cloud.stream.bindings.output.destination=my-source
spring.cloud.stream.bindings.input.destination=my-source
spring.cloud.stream.bindings.output.destination=my-proc
spring.cloud.stream.bindings.input.destination=my-proc
Source
Processor
Sink
© 2016 Pivotal Software, Inc. All rights reserved.
Pipeline
my-
source
Source
output source | processor | sink
Processor
output
input
my-proc
Sink
input
© 2016 Pivotal Software, Inc. All rights reserved.
Reactive API Support by Reactor
@SpringBootApplication

@EnableBinding(Processor.class)

public class DemoProcessorRxApp {
@StreamListener @Output(Processor.OUTPUT)

public Flux<String> receive(@Input(Processor.INPUT)
Flux<String> stream) {

return stream.map(text -> "[[" + text + "]]");

}

public static void main(String[] args) {

SpringApplication.run(DemoProcessorRxApp.class, args);

}

}
© 2016 Pivotal Software, Inc. All rights reserved.
Reactive API Support by Reactor
@StreamListener @Output(Processor.OUTPUT)

public Flux<AverageData> receive(@Input(Processor.INPUT)
Flux<SensorData> stream) {

return stream.window(Duration.ofSecond(20),
Duration.ofSecond(10))
.flatMap(win -> win.groupBy(sensor -> sensor.id))
.flatMap(group -> calcAverage(group));

}
© 2016 Pivotal Software, Inc. All rights reserved.
Stream Core Features
•Persistent Pub-Sub
•Consumer Group
•Partitioning Support
© 2016 Pivotal Software, Inc. All rights reserved.
Persistent Pub-Sub
HTTP Average Top Ns1.http s1.ave
Message Broker
© 2016 Pivotal Software, Inc. All rights reserved.
Persistent Pub-Sub
HTTP Average
HDFS
Top Ns1.http s1.ave
Message Broker
© 2016 Pivotal Software, Inc. All rights reserved.
Persistent Pub-Sub
HTTP Average
HDFS
Top N
Fault
Detection
s1.http s1.ave
Message Broker
© 2016 Pivotal Software, Inc. All rights reserved.
Persistent Pub-Sub
HTTP Average
HDFS
Top N
Fault
Detection
s1.http s1.ave
Message Broker
{"id":1, "temperature":38}
© 2016 Pivotal Software, Inc. All rights reserved.
Persistent Pub-Sub
HTTP Average
HDFS
Top N
Fault
Detection
s1.http s1.ave
Message Broker
{"id":1, "temperature":38}{"id":1, "temperature":38}
© 2016 Pivotal Software, Inc. All rights reserved.
Persistent Pub-Sub
HTTP Average
HDFS
Top N
Fault
Detection
s1.http s1.ave
Message Broker
{"id":1, "temperature":38}
{"id":1, "temperature":38}
{"id":1, "temperature":38}
© 2016 Pivotal Software, Inc. All rights reserved.
Persistent Pub-Sub
HTTP Average
HDFS
Top N
Fault
Detection
s1.http s1.ave
Message Broker
{"id":1, "temperature":
{"id":1, "temperature":38} {"id":1, "temperature":38}
© 2016 Pivotal Software, Inc. All rights reserved.
HTTP Average
HDFS
Top N
Fault
Detection
s1.http s1.ave
Message Broker
Average
Average
HDFS
HDFS
© 2016 Pivotal Software, Inc. All rights reserved.
HTTP Average
HDFS
Top N
Fault
Detection
s1.http s1.ave
Message Broker
{"id":1, "temperature":38}
Average
Average
HDFS
HDFS
© 2016 Pivotal Software, Inc. All rights reserved.
HTTP Average
HDFS
Top N
Fault
Detection
s1.http s1.ave
Message Broker
{"id":1, "temperature":38}{"id":1, "temperature":38}
Average
Average
HDFS
HDFS
© 2016 Pivotal Software, Inc. All rights reserved.
HTTP Average
HDFS
Top N
Fault
Detection
s1.http s1.ave
Message Broker
{"id":1, "temperature":38}
{"id":1, "temperature":38}
Average
Average
HDFS
HDFS
{"id":1, "temperature":38}
{"id":1, "temperature":38}
{"id":1, "temperature":38}
{"id":1, "temperature":38}
© 2016 Pivotal Software, Inc. All rights reserved.
HTTP Average
HDFS
Top N
Fault
Detection
s1.http s1.ave
Message Broker
{"id":1, "temperature":38}
{"id":1, "temperature":38}
Average
Average
HDFS
HDFS
{"id":1, "temperature":38}
{"id":1, "temperature":38}
{"id":1, "temperature":38}
{"id":1, "temperature":38}
😩
© 2016 Pivotal Software, Inc. All rights reserved.
Topic
Exchange
demo-strm
demo-strm
.anonymous.1
Queue
© 2016 Pivotal Software, Inc. All rights reserved.
Topic
Exchange
demo-strm
demo-strm
.anonymous.1
Queue
© 2016 Pivotal Software, Inc. All rights reserved.
Topic
Exchange
demo-strm
demo-strm
.anonymous.1
Queue
demo-strm
.anonymous.2
© 2016 Pivotal Software, Inc. All rights reserved.
Topic
Exchange
demo-strm
demo-strm
.anonymous.1
Queue
demo-strm
.anonymous.2
Consumer Group
© 2016 Pivotal Software, Inc. All rights reserved.
Topic
Exchange
demo-strm
demo-strm
.anonymous.1
Queue
demo-strm
.anonymous.2
spring.cloud.stream.bindings.<channelName>.group=ave
Consumer Group
© 2016 Pivotal Software, Inc. All rights reserved.
Consumer Group
demo-strm
demo-strm
.ave
QueueTopic
Exchange
© 2016 Pivotal Software, Inc. All rights reserved.
Consumer Group
HTTP Average
HDFS
Top N
Fault
Detection
s1.http s1.ave
Message Broker
Average
Average
HDFS
HDFS
group=ave
group=hdfs
© 2016 Pivotal Software, Inc. All rights reserved.
Consumer Group
HTTP Average
HDFS
Top N
Fault
Detection
s1.http s1.ave
Message Broker
Average
Average
HDFS
HDFS
group=ave
group=hdfs
{"id":1, "temperature":38}
© 2016 Pivotal Software, Inc. All rights reserved.
Consumer Group
HTTP Average
HDFS
Top N
Fault
Detection
s1.http s1.ave
Message Broker
Average
Average
HDFS
HDFS
group=ave
group=hdfs
{"id":1, "temperature":38}{"id":1, "temperature":38}
© 2016 Pivotal Software, Inc. All rights reserved.
Consumer Group
HTTP Average
HDFS
Top N
Fault
Detection
s1.http s1.ave
Message Broker
Average
Average
HDFS
HDFS
group=ave
group=hdfs
{"id":1, "temperature":38}
{"id":1, "temperature":38}
© 2016 Pivotal Software, Inc. All rights reserved.
Consumer Group
HTTP Average
HDFS
Top N
Fault
Detection
s1.http s1.ave
Message Broker
Average
Average
HDFS
HDFS
group=ave
group=hdfs
{"id":1, "temperature":38}
{"id":1, "temperature":38} 🤓
© 2016 Pivotal Software, Inc. All rights reserved.
Consumer Group
HTTP Average
HDFS
Top N
Fault
Detection
s1.http s1.ave
Message Broker
Average
Average
HDFS
HDFS
group=ave
group=hdfs
{"id":1, "temperature":38}
{"id":1, "temperature":38} 🤓
consumer group subscriptions
are durable 😁
© 2016 Pivotal Software, Inc. All rights reserved.
Durability
demo-strm
demo-strm
.ave
QueueTopic
Exchange
© 2016 Pivotal Software, Inc. All rights reserved.
Durability
demo-strm
demo-strm
.ave
QueueTopic
Exchange
© 2016 Pivotal Software, Inc. All rights reserved.
Durability
demo-strm
demo-strm
.ave
Queue
🏀
Topic
Exchange
© 2016 Pivotal Software, Inc. All rights reserved.
Durability
demo-strm
demo-strm
.ave
Queue
🏀
Topic
Exchange
© 2016 Pivotal Software, Inc. All rights reserved.
Durability
demo-strm
demo-strm
.ave
Queue
🚑
🏀
Topic
Exchange
© 2016 Pivotal Software, Inc. All rights reserved.
Durability
demo-strm
demo-strm
.ave
Queue
🚑
🏀
Topic
Exchange
© 2016 Pivotal Software, Inc. All rights reserved.
Durability
demo-strm
demo-strm
.ave
Queue
🏀
Topic
Exchange
© 2016 Pivotal Software, Inc. All rights reserved.
Customer
Service
Email
Service
Point
Service
Post
Service
Source
Sink
© 2016 Pivotal Software, Inc. All rights reserved.
Customer
Service
Email
Service
Point
Service
Post
Service
Source
Sink
spring.cloud.stream.bindings.output.destination=customer
spring.cloud.stream.bindings.output.contentType=applicatio
n/json
© 2016 Pivotal Software, Inc. All rights reserved.
Customer
Service
Email
Service
Point
Service
Post
Service
Subscribe
Source
Sink
© 2016 Pivotal Software, Inc. All rights reserved.
Customer
Service
Email
Service
Point
Service
Post
Service
Subscribe
Source
Sink
group=point-service
group=email-service
group=post-service
© 2016 Pivotal Software, Inc. All rights reserved.
Customer
Service
Email
Service
Point
Service
Post
Service
Subscribe
Source
Sink
group=point-service
group=email-service
group=post-service
spring.cloud.stream.bindings.input.destination=customer
spring.cloud.stream.bindings.input.group=point-service
© 2016 Pivotal Software, Inc. All rights reserved.
Customer
Service
Email
Service
Point
Service
Post
Service
Subscribe
Source
Sink
group=point-service
group=email-service
group=post-service
spring.cloud.stream.bindings.input.destination=customer
spring.cloud.stream.bindings.input.group=point-service
spring.cloud.stream.bindings.input.destination=customer
spring.cloud.stream.bindings.input.group=email-service
© 2016 Pivotal Software, Inc. All rights reserved.
Customer
Service
Email
Service
Point
Service
Post
Service
Subscribe
Source
Sink
group=point-service
group=email-service
group=post-service
spring.cloud.stream.bindings.input.destination=customer
spring.cloud.stream.bindings.input.group=point-service
spring.cloud.stream.bindings.input.destination=customer
spring.cloud.stream.bindings.input.group=email-service
spring.cloud.stream.bindings.input.destination=customer
spring.cloud.stream.bindings.input.group=post-service
© 2016 Pivotal Software, Inc. All rights reserved.
customer
Customer Service
output
Point Service
input
Email Service
input
Post Service
input
© 2016 Pivotal Software, Inc. All rights reserved.
customer
customer
.point-
service
Queue
Consumer Group
customer
.email-
service
customer
.post-
service
Topic
Exchange
© 2016 Pivotal Software, Inc. All rights reserved.
HTTP
Average
s1.http
Average
© 2016 Pivotal Software, Inc. All rights reserved.
HTTP
Average
s1.http
Average
{"id":1, "temperature":38}
{"id":2, "temperature":41}
{"id":2, "temperature":42}
{"id":1, "temperature":37}
© 2016 Pivotal Software, Inc. All rights reserved.
HTTP
Average
s1.http
Average
{"id":1, "temperature":38}
{"id":2, "temperature":41}
{"id":2, "temperature":42}
{"id":1, "temperature":37}
© 2016 Pivotal Software, Inc. All rights reserved.
HTTP
Average
s1.http
Average
{"id":1, "temperature":38}
{"id":2, "temperature":41}
{"id":2, "temperature":42}
{"id":1, "temperature":37}
© 2016 Pivotal Software, Inc. All rights reserved.
HTTP
Average
s1.http
Average
{"id":1, "temperature":38}
{"id":2, "temperature":41}
{"id":2, "temperature":42}
{"id":1, "temperature":37}
© 2016 Pivotal Software, Inc. All rights reserved.
HTTP
Average
s1.http
Average
{"id":1, "temperature":38}
{"id":2, "temperature":41}
{"id":2, "temperature":42}
{"id":1, "temperature":37}
© 2016 Pivotal Software, Inc. All rights reserved.
HTTP
Average
s1.http
Average
{"id":1, "temperature":38}
{"id":2, "temperature":41}
{"id":2, "temperature":42}
{"id":1, "temperature":37}
😩
© 2016 Pivotal Software, Inc. All rights reserved.
HTTP
Average
s1.http
Average
{"id":1, "temperature":38}
{"id":2, "temperature":41}
{"id":2, "temperature":42}
{"id":1, "temperature":37}
😩
Partitioning Support(Stateful Stream)
© 2016 Pivotal Software, Inc. All rights reserved.
HTTP
Average
s1.http
Average
{"id":1, "temperature":38}
{"id":2, "temperature":41}
{"id":2, "temperature":42}
{"id":1, "temperature":37}
😩
spring.cloud.stream.bindings.<channelName>.producer.par
titionKeyExpression=payload.id
Partitioning Support(Stateful Stream)
© 2016 Pivotal Software, Inc. All rights reserved.
Partitioning Support(Stateful Stream)
HTTP
Average
s1.http
Average
© 2016 Pivotal Software, Inc. All rights reserved.
Partitioning Support(Stateful Stream)
HTTP
Average
s1.http
Average
{"id":1, "temperature":38}
{"id":2, "temperature":41}
{"id":2, "temperature":42}
{"id":1, "temperature":37}
© 2016 Pivotal Software, Inc. All rights reserved.
Partitioning Support(Stateful Stream)
HTTP
Average
s1.http
Average
{"id":1, "temperature":38}
{"id":2, "temperature":41}
{"id":2, "temperature":42}
{"id":1, "temperature":37}
© 2016 Pivotal Software, Inc. All rights reserved.
Partitioning Support(Stateful Stream)
HTTP
Average
s1.http
Average
{"id":1, "temperature":38}
{"id":2, "temperature":41}
{"id":2, "temperature":42}
{"id":1, "temperature":37}
© 2016 Pivotal Software, Inc. All rights reserved.
Partitioning Support(Stateful Stream)
HTTP
Average
s1.http
Average
{"id":1, "temperature":38}
{"id":2, "temperature":41}
{"id":2, "temperature":42}
{"id":1, "temperature":37}
© 2016 Pivotal Software, Inc. All rights reserved.
Partitioning Support(Stateful Stream)
HTTP
Average
s1.http
Average
{"id":1, "temperature":38}
{"id":2, "temperature":41}
{"id":2, "temperature":42}
{"id":1, "temperature":37}
© 2016 Pivotal Software, Inc. All rights reserved.
Partitioning Support(Stateful Stream)
HTTP
Average
s1.http
Average
{"id":1, "temperature":38}
{"id":2, "temperature":41}
{"id":2, "temperature":42}
{"id":1, "temperature":37}
🤓
© 2016 Pivotal Software, Inc. All rights reserved.
Test Support
Source
output
Sink
input
© 2016 Pivotal Software, Inc. All rights reserved.
Test Support
Source
output
Sink
input
TestSupportBinder
© 2016 Pivotal Software, Inc. All rights reserved.
Test Support
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-test-support</artifactId>
<scope>test</scope>
</dependency>
© 2016 Pivotal Software, Inc. All rights reserved.
Unit Test (Sink)
@RunWith(SpringRunner.class)

@SpringBootTest(webEnvironment = WebEnvironment.NONE)

public class DemoSinkAppTest {
@Autowired Sink sink;
@Rule public OutputCapture capture = new OutputCapture();
@Test public void testReceive() {
sink.input()
.send(MessageBuilder.withPayload("foo").build());
assertThat(capture.toString())
.isEqualsTo("Received foo");

}
}
© 2016 Pivotal Software, Inc. All rights reserved.
Unit Test (Source)
@RunWith(SpringRunner.class)

@SpringBootTest(webEnvironment = WebEnvironment.NONE)

public class DemoSourceAppTest {
@Autowired DemoSourceApp app;
@Autowired MessageCollector collector;
@Autowired Source source;
@Test public void testSend() {
app.send("foo");
Message<String> message = collector
.forChannel(source.output()).poll();
assertThat(message.getPayload()).isEqualsTo("foo"); 

}}
‹#›© 2016 Pivotal Software, Inc. All rights reserved.
Advanced Topics
© 2016 Pivotal Software, Inc. All rights reserved.
Advanced Topics
•Multi Binding
•Distributed Tracing
•Error Handling
•Consumer Driven Contract
© 2016 Pivotal Software, Inc. All rights reserved.
Multi Bindings
© 2016 Pivotal Software, Inc. All rights reserved.
customer
Customer Service
output
Email Service
input
© 2016 Pivotal Software, Inc. All rights reserved.
customer
Customer Service
output
Email Service
input
CustomerCreateEvent
© 2016 Pivotal Software, Inc. All rights reserved.
customer
Customer Service
output
Email Service
input
© 2016 Pivotal Software, Inc. All rights reserved.
customer
Customer Service
output
Email Service
input
CustomerDeleteEvent
© 2016 Pivotal Software, Inc. All rights reserved.
customer
Customer Service
output
Email Service
input
CustomerDeleteEvent
ClassCastException!!
© 2016 Pivotal Software, Inc. All rights reserved.
create
Email Service
create-
input
delete-
input
Customer Service
create-
output
delete-
output
delete
CustomerCreateEvent
CustomerDeleteEvent
© 2016 Pivotal Software, Inc. All rights reserved.
public interface CustomerEventSource {
String CREATE_OUTPUT = "create-output";
String DELETE_OUTPUT = "delete-output";
@Output(CustomerEventSource.CREATE_OUTPUT)
MessageChannel createOutput();
@Output(CustomerEventSource.DELETE_OUTPUT)
MessageChannel deleteOutput();

}
Multi Bindings
© 2016 Pivotal Software, Inc. All rights reserved.
@Component

public class CustomerService {

@Autowired CustomerEventSource source;
public void create(...) {
source.createOutput().send(...);
}
public void delete() {
source.deleteOutput().send(...);
}

}
@SpringBootApplication
@EnableBinding(CustomerEventSource.class)

public class CustomerServiceApplication { /* ... */ }
© 2016 Pivotal Software, Inc. All rights reserved.
@Component

public class CustomerService {

@Autowired CustomerEventSource source;
public void create(...) {
source.createOutput().send(...);
}
public void delete() {
source.deleteOutput().send(...);
}

}
@SpringBootApplication
@EnableBinding(CustomerEventSource.class)

public class CustomerServiceApplication { /* ... */ }
spring.cloud.stream.bindings.create-output.destination
=create
spring.cloud.stream.bindings.delete-output.destination
=delete
© 2016 Pivotal Software, Inc. All rights reserved.
public interface CustomerEventSink {
String CREATE_INPUT = "create-input";
String DELETE_INPUT = "delete-input";
@Input(CustomerEventSink.CREATE_INPUT)
SubscribableChannel createInput();
@Input(CustomerEventSink.DELETE_INPUT)
SubscribableChannel deleteInput();

}
Multi Bindings
© 2016 Pivotal Software, Inc. All rights reserved.
@Component

public class PointService {
@StreamListener(CustomerEventSink.CREATE_INPUT)
public void handleCreate(CustomerCreateEvent event) {
}
@StreamListener(CustomerEventSink.DELETE_INPUT)
public void handleDelete(CustomerDeleteEvent event) {
}

}
@SpringBootApplication
@EnableBinding(CustomerEventSink.class)

public class PointServiceApplication { /* ... */ }
© 2016 Pivotal Software, Inc. All rights reserved.
@Component

public class PointService {
@StreamListener(CustomerEventSink.CREATE_INPUT)
public void handleCreate(CustomerCreateEvent event) {
}
@StreamListener(CustomerEventSink.DELETE_INPUT)
public void handleDelete(CustomerDeleteEvent event) {
}

}
@SpringBootApplication
@EnableBinding(CustomerEventSink.class)

public class PointServiceApplication { /* ... */ }
spring.cloud.stream.bindings.create-input.destination
=create
spring.cloud.stream.bindings.create-input.group
=point-service
spring.cloud.stream.bindings.delete-intput.destination
=delete
spring.cloud.stream.bindings.delete-input.group
=point-service
© 2016 Pivotal Software, Inc. All rights reserved.
create
create
.point-
service
Queue
delete delete
.point-
service
Topic
Exchange
© 2016 Pivotal Software, Inc. All rights reserved.
Frontend
Customer
Service
Email
Service
Point
Service
Post
Service
Subscribe
ABC
Service
XYZ
Service
© 2016 Pivotal Software, Inc. All rights reserved.
Frontend
Customer
Service
Email
Service
Point
Service
Post
Service
Subscribe
ABC
Service
XYZ
Service
🕝
© 2016 Pivotal Software, Inc. All rights reserved.
Frontend
Customer
Service
Email
Service
Point
Service
Post
Service
Subscribe
ABC
Service
XYZ
Service🤔
🕝
© 2016 Pivotal Software, Inc. All rights reserved.
Frontend
Customer
Service
Email
Service
Point
Service
Post
Service
Subscribe
ABC
Service
XYZ
Service🤔
🕝
🕵 🕵
🕵
🕵 🕵
🕵🕵
© 2016 Pivotal Software, Inc. All rights reserved.
Frontend
Customer
Service
Email
Service
Point
Service
Post
Service
Subscribe
ABC
Service
XYZ
Service🤔
🕝
🕵 🕵
🕵
🕵 🕵
🕵🕵
© 2016 Pivotal Software, Inc. All rights reserved.
Frontend
Customer
Service
Email
Service
Point
Service
Post
Service
Subscribe
ABC
Service
XYZ
Service🤔
🕝
🕵 🕵
🕵
🕵 🕵
🕵🕵
TraceID, SpanID
© 2016 Pivotal Software, Inc. All rights reserved.
Spring Cloud Sleuth
• Distributed tracing solution for Spring Cloud
• Interactions with external systems should be instrumented
automatically
• Capture data simply in logs, or by sending it to Zipkin via
RestTemplate / Spring Cloud Stream / ...
© 2016 Pivotal Software, Inc. All rights reserved.
Spring Cloud Sleuth Stream
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-slueth</artifactId>
</dependency>
© 2016 Pivotal Software, Inc. All rights reserved.
Spring Cloud Sleuth Stream
customer
Customer Service
output
Email Service
input
© 2016 Pivotal Software, Inc. All rights reserved.
Spring Cloud Sleuth Stream
customer
Customer Service
output
Email Service
input
sleuth sleuth
© 2016 Pivotal Software, Inc. All rights reserved.
Zipkin Stream Server
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin-stream</artifactId>
</dependency>
© 2016 Pivotal Software, Inc. All rights reserved.
Zipkin Stream Server
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin-stream</artifactId>
</dependency>
@SpringBootApplication

@EnableZipkinStreamServer

public class ZipkinStreamServer {

public static void main(String[] args) {

SpringApplication.run(DemoSinkApp.class, args);

}

}
© 2016 Pivotal Software, Inc. All rights reserved.
Zipkin Stream Server
customer
Customer Service
output
Email Service
input
sleuth sleuth
© 2016 Pivotal Software, Inc. All rights reserved.
Zipkin Stream Server
customer
Customer Service
output
Email Service
input
sleuth sleuth
sleuth
sleuth
© 2016 Pivotal Software, Inc. All rights reserved.
Zipkin Stream Server
customer
Customer Service
output
Email Service
input
sleuth sleuth
sleuth
sleuth
© 2016 Pivotal Software, Inc. All rights reserved.
Zipkin Stream Server
customer
Customer Service
output
Email Service
input
sleuth sleuth
sleuth
sleuth
© 2016 Pivotal Software, Inc. All rights reserved.
Zipkin Stream Server
customer
Customer Service
output
Email Service
input
sleuth sleuth
sleuth
sleuth
TraceID,SpanID TraceID,SpanID
© 2016 Pivotal Software, Inc. All rights reserved.
Zipkin Stream Server
customer
Customer Service
output
Email Service
input
sleuth sleuth
sleuth
sleuth
© 2016 Pivotal Software, Inc. All rights reserved.
Zipkin UI
© 2016 Pivotal Software, Inc. All rights reserved.
Zipkin UI
Trace
© 2016 Pivotal Software, Inc. All rights reserved.
Zipkin UI
Trace
Span
© 2016 Pivotal Software, Inc. All rights reserved.
© 2016 Pivotal Software, Inc. All rights reserved.
Error Handling
•Depends on the message binder
implementation
•(Ex.) RabbitMQ binder routes the failed
message to the Dead-Letter
Queue(DLQ). No mechanism to handle
DLQs.
© 2016 Pivotal Software, Inc. All rights reserved.
Dead-Letter Queue Processing
demo-strm
Topic
Exchange
demo-strm
.ave
Source Sink
RabbitMQBinder
© 2016 Pivotal Software, Inc. All rights reserved.
Dead-Letter Queue Processing
demo-strm
Topic
Exchange
demo-strm
.ave
Source Sink
DLX
RabbitMQBinder
© 2016 Pivotal Software, Inc. All rights reserved.
Dead-Letter Queue Processing
demo-strm
Topic
Exchange
demo-strm
.ave
Source Sink
DLX
RabbitMQBinder
spring.cloud.stream.bindings.input.destination=demo-strm
spring.cloud.stream.bindings.input.group=ave
spring.cloud.stream.rabbit.bindings.input.consumer.autoBi
ndDlq=true
© 2016 Pivotal Software, Inc. All rights reserved.
Dead-Letter Queue Processing
demo-strm
Topic
Exchange
demo-strm
.ave
Source Sink
DLX
demo-strm
.ave.dlq
RabbitMQBinder
spring.cloud.stream.bindings.input.destination=demo-strm
spring.cloud.stream.bindings.input.group=ave
spring.cloud.stream.rabbit.bindings.input.consumer.autoBi
ndDlq=true
© 2016 Pivotal Software, Inc. All rights reserved.
Dead-Letter Queue Processing
demo-strm
Topic
Exchange
demo-strm
.ave
Source Sink
DLX
demo-strm
.ave.dlq
RabbitMQBinder
© 2016 Pivotal Software, Inc. All rights reserved.
Dead-Letter Queue Processing
demo-strm
Topic
Exchange
demo-strm
.ave
Source Sink
DLX
demo-strm
.ave.dlq
RabbitMQBinder
© 2016 Pivotal Software, Inc. All rights reserved.
Dead-Letter Queue Processing
demo-strm
Topic
Exchange
demo-strm
.ave
Source Sink
DLX
demo-strm
.ave.dlq
RabbitMQBinder
© 2016 Pivotal Software, Inc. All rights reserved.
Dead-Letter Queue Processing
demo-strm
Topic
Exchange
demo-strm
.ave
Source Sink
DLX
demo-strm
.ave.dlq
RabbitMQBinder
🔥
© 2016 Pivotal Software, Inc. All rights reserved.
Dead-Letter Queue Processing
demo-strm
Topic
Exchange
demo-strm
.ave
Source Sink
DLX
demo-strm
.ave.dlq
RabbitMQBinder
🔥 Retry 3 times
by default
© 2016 Pivotal Software, Inc. All rights reserved.
Dead-Letter Queue Processing
demo-strm
Topic
Exchange
demo-strm
.ave
Source Sink
DLX
demo-strm
.ave.dlq
RabbitMQBinder
🔥 Retry 3 times
by default
© 2016 Pivotal Software, Inc. All rights reserved.
© 2016 Pivotal Software, Inc. All rights reserved.
© 2016 Pivotal Software, Inc. All rights reserved.
© 2016 Pivotal Software, Inc. All rights reserved.
© 2016 Pivotal Software, Inc. All rights reserved.
© 2016 Pivotal Software, Inc. All rights reserved.
Handling DLQ
@Component

public class DlqHander {
@RabbitListener(queues = "customer.email-service.dlq")
public void handle(Message event) {
// Re-deliver if you want
}

}
© 2016 Pivotal Software, Inc. All rights reserved.
DLQ Recovery Center 😛
https://github.com/making-demo-scst/dlq-recover-service
© 2016 Pivotal Software, Inc. All rights reserved.
Trace everything
© 2016 Pivotal Software, Inc. All rights reserved.
customer
Customer Service
output
Point Service
input
Email Service
input
Post Service
input
© 2016 Pivotal Software, Inc. All rights reserved.
customer
Customer Service
output
Point Service
input
Email Service
input
Post Service
input
© 2016 Pivotal Software, Inc. All rights reserved.
customer
Customer Service
output
Point Service
input
Email Service
input
Post Service
input
© 2016 Pivotal Software, Inc. All rights reserved.
customer
Customer Service
output
Point Service
input
Email Service
input
Post Service
input
© 2016 Pivotal Software, Inc. All rights reserved.
customer
Customer Service
output
Point Service
input
Email Service
input
Post Service
input
© 2016 Pivotal Software, Inc. All rights reserved.
customer
Customer Service
output
Point Service
input
Email Service
input
Post Service
input
😗Breaking Change
© 2016 Pivotal Software, Inc. All rights reserved.
customer
Customer Service
output
Point Service
input
Email Service
input
Post Service
input
😗Breaking Change
© 2016 Pivotal Software, Inc. All rights reserved.
customer
Customer Service
output
Point Service
input
Email Service
input
Post Service
input
😗Breaking Change
© 2016 Pivotal Software, Inc. All rights reserved.
customer
Customer Service
output
Point Service
input
Email Service
input
Post Service
input
😗Breaking Change
© 2016 Pivotal Software, Inc. All rights reserved.
customer
Customer Service
output
😗Breaking Change 😡
😡
😡
😨
© 2016 Pivotal Software, Inc. All rights reserved.
Consumer Driven Contracts
•Consumer shares "expectation" with
Producer via "Contract" (≈ DSL)
•The contract violation should be detected by
generated tests on the producer side.
© 2016 Pivotal Software, Inc. All rights reserved.
Consumer Driven Contracts
•Consumer shares "expectation" with
Producer via "Contract" (≈ DSL)
•The contract violation should be detected by
generated tests on the producer side.
ContractConsumer Producer
© 2016 Pivotal Software, Inc. All rights reserved.
Flow of Consumer Driven Contracts
Consumer Producer
© 2016 Pivotal Software, Inc. All rights reserved.
Flow of Consumer Driven Contracts
Consumer Producer
Contract
© 2016 Pivotal Software, Inc. All rights reserved.
Flow of Consumer Driven Contracts
Consumer Producer
Contract
© 2016 Pivotal Software, Inc. All rights reserved.
Flow of Consumer Driven Contracts
Consumer Producer
Contract
Acceptance
Test
© 2016 Pivotal Software, Inc. All rights reserved.
Flow of Consumer Driven Contracts
Consumer Producer
Contract
Acceptance
Test
© 2016 Pivotal Software, Inc. All rights reserved.
Flow of Consumer Driven Contracts
Consumer Producer
Contract
Acceptance
Test
✅
© 2016 Pivotal Software, Inc. All rights reserved.
Flow of Consumer Driven Contracts
Consumer Producer
Contract
Acceptance
Test
Stub
✅
© 2016 Pivotal Software, Inc. All rights reserved.
Flow of Consumer Driven Contracts
Consumer Producer
Contract
Acceptance
Test
Stub
✅
© 2016 Pivotal Software, Inc. All rights reserved.
Flow of Consumer Driven Contracts
Consumer Producer
Contract
Acceptance
Test
Stub
Unit Test
✅
© 2016 Pivotal Software, Inc. All rights reserved.
Flow of Consumer Driven Contracts
Consumer Producer
Contract
Acceptance
Test
Stub
Unit Test
✅✅
© 2016 Pivotal Software, Inc. All rights reserved.
Spring Cloud Contract
•A CDC Solution for JVM apps (especially Spring)
•Contract DSL using Groovy
•Generates Acceptance test (JUnit or Spock) for producer
•Generates Stub for consumer
•WireMock Support for REST Test
•Messaging Support (Spring Integration, Spring Cloud
Stream and Apache Camel)
© 2016 Pivotal Software, Inc. All rights reserved.
Contract DSL
Contract.make {
label 'create-customer'
input {
}
outputMessage {
sentTo('demo-strm')
headers({header('Content-Type':'...')})

body('''{"name":"@making"}''')
}}
shouldCreateCustomer.groovy
© 2016 Pivotal Software, Inc. All rights reserved.
Contract DSL
Contract.make {
label 'create-customer'
input {
}
outputMessage {
sentTo('demo-strm')
headers({header('Content-Type':'...')})

body('''{"name":"@making"}''')
}}
shouldCreateCustomer.groovy
Created by
Consumer
© 2016 Pivotal Software, Inc. All rights reserved.
Prepare Parent Test Class
@RunWith(SpringRunner.class)

@SpringBootTest(webEnvironment = WebEnvironment.NONE)
@AutoConfigureMessageVerifier

public abstract class MsgTestBase {
@Autowired CustomerService service;
protected void create() {
service.create("@making"); 

}
}
© 2016 Pivotal Software, Inc. All rights reserved.
Prepare Parent Test Class
@RunWith(SpringRunner.class)

@SpringBootTest(webEnvironment = WebEnvironment.NONE)
@AutoConfigureMessageVerifier

public abstract class MsgTestBase {
@Autowired CustomerService service;
protected void create() {
service.create("@making"); 

}
}
Created by
Producer
© 2016 Pivotal Software, Inc. All rights reserved.
Contract DSL
Contract.make {
label 'create-customer'
input {
triggeredBy('create()')
}
outputMessage {
sentTo('demo-strm')
headers({header('Content-Type':'...')})

body('''{"name":"@making"}''')
}}
shouldCreateCustomer.groovy
© 2016 Pivotal Software, Inc. All rights reserved.
Contract DSL
Contract.make {
label 'create-customer'
input {
triggeredBy('create()')
}
outputMessage {
sentTo('demo-strm')
headers({header('Content-Type':'...')})

body('''{"name":"@making"}''')
}}
shouldCreateCustomer.groovy
Updated by
Producer
© 2016 Pivotal Software, Inc. All rights reserved.
Generated Acceptance Test
public class ContractVerifierTest extends MsgTestBase {
// ...
@Test public void validate_shouldCreateCustomer() {
create();
ContractVerifierMessage res = verifierMessaging
.receive("customer");

assertThat(res).isNotNull();
DocumentContext parsedJson = JsonPath.parse(
objectMapper.writeValueAsString(res.getPayload()));
assertThatJson(parsedJson).field("name")
.isEqualTo("@making");

}}
© 2016 Pivotal Software, Inc. All rights reserved.
Spring Cloud Contract Maven Plugin
mvn spring-cloud-contract:generateTests
mvn spring-cloud-contract:convert
mvn spring-cloud-contract:generateStubs
Acceptance Test
WireMock stub file (only for REST)
Stub jar file
© 2016 Pivotal Software, Inc. All rights reserved.
Consumer Side Test
@RunWith(SpringRunner.class)

@SpringBootTest(webEnvironment = WebEnvironment.NONE)
@AutoConfigureStubRunner(ids = "com.example:customer-
service", workOffline = true)

public class PointServiceConsumerTest {
@Autowired StubTrigger stubTrigger;
// ...
@Test public void testCreateCustomer() {
stubTrigger.trigger("create-customer");
// assert that the message is received ...

}
}
© 2016 Pivotal Software, Inc. All rights reserved.
Check sample code
•http://bit.ly/making_ccc_a3
© 2016 Pivotal Software, Inc. All rights reserved.
(FYI) CQRS and Event Sourcing
• https://spring.io/blog/2016/11/08/cqrs-and-event-sourcing-
with-jakub-pilimon
• https://github.com/pilloPl/event-source-cqrs-sample
‹#›© 2016 Pivotal Software, Inc. All rights reserved.
Data Microservices
with Spring Cloud Data Flow
© 2016 Pivotal Software, Inc. All rights reserved.
Data Microservices
$ cat book.txt | tr ' ' '¥ ' | tr '[:upper:]' '[:lower:]' |
tr -d '[:punct:]' |
grep -v '[^a-z]‘ |
sort | uniq -c | sort -rn | head
© 2016 Pivotal Software, Inc. All rights reserved.
Data Microservices
$ cat book.txt | tr ' ' '¥ ' | tr '[:upper:]' '[:lower:]' |
tr -d '[:punct:]' |
grep -v '[^a-z]‘ |
sort | uniq -c | sort -rn | head
© 2016 Pivotal Software, Inc. All rights reserved.
Data Microservices
$ cat book.txt | tr ' ' '¥ ' | tr '[:upper:]' '[:lower:]' |
tr -d '[:punct:]' |
grep -v '[^a-z]‘ |
sort | uniq -c | sort -rn | head
Microservice for each data processing
© 2016 Pivotal Software, Inc. All rights reserved.
Data Microservices
$ cat book.txt | tr ' ' '¥ ' | tr '[:upper:]' '[:lower:]' |
tr -d '[:punct:]' |
grep -v '[^a-z]‘ |
sort | uniq -c | sort -rn | head
Microservice for each data processing
© 2016 Pivotal Software, Inc. All rights reserved.
Data Microservices
$ cat book.txt | tr ' ' '¥ ' | tr '[:upper:]' '[:lower:]' |
tr -d '[:punct:]' |
grep -v '[^a-z]‘ |
sort | uniq -c | sort -rn | head
Microservice for each data processing
bound with
Message Brokers
© 2016 Pivotal Software, Inc. All rights reserved.
Data Microservices
$ cat book.txt | tr ' ' '¥ ' | tr '[:upper:]' '[:lower:]' |
tr -d '[:punct:]' |
grep -v '[^a-z]‘ |
sort | uniq -c | sort -rn | head
Microservice for each data processing
bound with
Message Brokers
© 2016 Pivotal Software, Inc. All rights reserved.
Data Microservices
$ cat book.txt | tr ' ' '¥ ' | tr '[:upper:]' '[:lower:]' |
tr -d '[:punct:]' |
grep -v '[^a-z]‘ |
sort | uniq -c | sort -rn | head
Microservice for each data processing
bound with
Message Brokers
on the modern platform such as Cloud Foundry
© 2016 Pivotal Software, Inc. All rights reserved.
Data Microservices
$ cat book.txt | tr ' ' '¥ ' | tr '[:upper:]' '[:lower:]' |
tr -d '[:punct:]' |
grep -v '[^a-z]‘ |
sort | uniq -c | sort -rn | head
Microservice for each data processing
bound with
Message Brokers
on the modern platform such as Cloud Foundry
© 2016 Pivotal Software, Inc. All rights reserved.
Data Microservices
$ cat book.txt | tr ' ' '¥ ' | tr '[:upper:]' '[:lower:]' |
tr -d '[:punct:]' |
grep -v '[^a-z]‘ |
sort | uniq -c | sort -rn | head
Microservice for each data processing
bound with
Message Brokers
on the modern platform such as Cloud Foundry
© 2016 Pivotal Software, Inc. All rights reserved.
Spring Cloud Data Flow
• Microservices-based Distributed Data Pipelines
•Long Lived Stream Applications
•Short Lived Task Applications
© 2016 Pivotal Software, Inc. All rights reserved.
Spring Cloud Data Flow
• Microservices-based Distributed Data Pipelines
•Long Lived Stream Applications
•Short Lived Task Applications
Spring Cloud Stream
© 2016 Pivotal Software, Inc. All rights reserved.
Spring Cloud Data Flow
• Microservices-based Distributed Data Pipelines
•Long Lived Stream Applications
•Short Lived Task Applications
Spring Cloud Stream
Spring Cloud Task
© 2016 Pivotal Software, Inc. All rights reserved.
Spring Cloud Data Flow
• Microservices-based Distributed Data Pipelines
•Long Lived Stream Applications
•Short Lived Task Applications
Spring Cloud Stream
Spring Cloud Task
Orchestration
Layer
© 2016 Pivotal Software, Inc. All rights reserved.
Check my slide
• http://www.slideshare.net/makingx/data-microservices-with-
spring-cloud-stream-task-and-data-flow-jsug-springday
‹#›© 2016 Pivotal Software, Inc. All rights reserved.
Deploy Stream Apps
to Cloud Foundry
© 2016 Pivotal Software, Inc. All rights reserved.
Cloud Foundry
•https://www.cloudfoundry.org/
•Cloud Native Platform
•OSS
•Spring ❤ Cloud Foundry
•Support Multi IaaS 

(AWS, Azure, GCP, vSphere, OpenStack)
© 2016 Pivotal Software, Inc. All rights reserved.
Cloud Foundry everywhere
Public Cloud Foundry
Private Cloud Foundry
Development
OSS ver Pivotal
Cloud Foundry
on
Premise
on
Public Cloud
© 2016 Pivotal Software, Inc. All rights reserved.
PCF Dev
• https://docs.pivotal.io/pcf-dev
• Cloud Foundry on your laptop
• Included
• Redis / RabbitMQ / MySQL
• Spring Cloud Services
• Install with cf dev start
© 2016 Pivotal Software, Inc. All rights reserved.
Pivotal Web Services
•https://run.pivotal.io/
•Public Cloud Foundry managed by Pivotal
•$0.03/GB-hr (≈ ¥2200/GB-month)
•$87 of free trial credit.
© 2016 Pivotal Software, Inc. All rights reserved.
Deploy Spring Cloud Stream Apps
cf push my-source my-source.jar --no-start
cf bind-service my-source my-binder
cf start my-source
cf push my-sink my-sink.jar --no-start
cf bind-service my-sink my-binder
cf start my-sink
# in case of PCF Dev
cf create-service p-rabbitmq standard my-binder
# in case of Pivotal Web Services
cf create-service cloudamqp lemur my-binder
© 2016 Pivotal Software, Inc. All rights reserved.
Sample Application http://bit.ly/making_ccc_a3
Pivotal Web Services / PCF Dev
Frontend
Customer
Service
Email
Service
Point
Service
Post
ServiceZipkin
Server
MySQL
SendGrid
MySQL
MySQL
DLQ
Recovery
RabbitMQ
HTTP
© 2016 Pivotal Software, Inc. All rights reserved.
Tutorial
https://github.com/Pivotal-Japan/spring-cloud-stream-tutorial
© 2016 Pivotal Software, Inc. All rights reserved.
Thanks!!
• https://cloud.spring.io/spring-cloud-stream/
• https://cloud.spring.io/spring-cloud-dataflow/
• https://cloud.spring.io/spring-cloud-sleuth/
• http://zipkin.io/
• https://cloud.spring.io/spring-cloud-contract/
• https://projects.spring.io/spring-amqp/
• https://run.pivotal.io/

More Related Content

PDF
Introduction to Kubernetes Workshop
PPTX
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
PDF
MHA for MySQLとDeNAのオープンソースの話
PDF
Introduction to GitHub Actions
PDF
Azure DevOps Tutorial | Developing CI/ CD Pipelines On Azure | Edureka
PDF
Open shift 4 infra deep dive
PDF
Scaling your Data Pipelines with Apache Spark on Kubernetes
PDF
Azure DevOps Presentation
Introduction to Kubernetes Workshop
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
MHA for MySQLとDeNAのオープンソースの話
Introduction to GitHub Actions
Azure DevOps Tutorial | Developing CI/ CD Pipelines On Azure | Edureka
Open shift 4 infra deep dive
Scaling your Data Pipelines with Apache Spark on Kubernetes
Azure DevOps Presentation

What's hot (20)

PDF
Argo Workflows 3.0, a detailed look at what’s new from the Argo Team
PPTX
Docker Kubernetes Istio
PDF
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
PDF
Gitops Hands On
PPTX
Exposing services with Azure API Management
PPTX
Ceph and Openstack in a Nutshell
PDF
Dockerfile Tutorial with Example | Creating your First Dockerfile | Docker Tr...
PDF
Why we chose Argo Workflow to scale DevOps at InVision
PDF
Kubernetes Architecture | Understanding Kubernetes Components | Kubernetes Tu...
PDF
Gitops: the kubernetes way
PDF
Spring Cloud Function: Where We Were, Where We Are, and Where We’re Going
PDF
CI、CD、Automation你還沒準備好!?(Agile Tour Kaohsiung 2017)
PPTX
CI/CD Overview
PDF
Low Code Integration with Apache Camel.pdf
PDF
Introduction to GitHub Actions
PDF
Best Practices for ETL with Apache NiFi on Kubernetes - Albert Lewandowski, G...
PDF
ZabbixのAPIを使って運用を楽しくする話
PDF
"Kong Summit, Japan 2022" パートナーセッション:Kong on AWS で実現するスケーラブルな API 基盤の構築
PDF
Kubeflow Pipelines (with Tekton)
PPTX
MSA ( Microservices Architecture ) 발표 자료 다운로드
Argo Workflows 3.0, a detailed look at what’s new from the Argo Team
Docker Kubernetes Istio
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
Gitops Hands On
Exposing services with Azure API Management
Ceph and Openstack in a Nutshell
Dockerfile Tutorial with Example | Creating your First Dockerfile | Docker Tr...
Why we chose Argo Workflow to scale DevOps at InVision
Kubernetes Architecture | Understanding Kubernetes Components | Kubernetes Tu...
Gitops: the kubernetes way
Spring Cloud Function: Where We Were, Where We Are, and Where We’re Going
CI、CD、Automation你還沒準備好!?(Agile Tour Kaohsiung 2017)
CI/CD Overview
Low Code Integration with Apache Camel.pdf
Introduction to GitHub Actions
Best Practices for ETL with Apache NiFi on Kubernetes - Albert Lewandowski, G...
ZabbixのAPIを使って運用を楽しくする話
"Kong Summit, Japan 2022" パートナーセッション:Kong on AWS で実現するスケーラブルな API 基盤の構築
Kubeflow Pipelines (with Tekton)
MSA ( Microservices Architecture ) 발표 자료 다운로드
Ad

Viewers also liked (19)

PDF
SpringOne 2GX 2014 参加報告 & Spring 4.1について #jsug
PDF
Data Microservices with Spring Cloud Stream, Task, and Data Flow #jsug #spri...
PDF
ビッグじゃなくても使えるSpark Streaming
PPTX
Java トラブル解析支援ツール HeapStats のご紹介
PDF
サーバーレスでシステムを開発する時に⼤切な事
PPTX
Spring Cloud Netflixを使おう #jsug
PPTX
マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07
PDF
AWSでアプリ開発するなら 知っておくべこと
PPTX
ぱぱっと理解するSpring Cloudの基本
PDF
SIerもはじめる わたしたちのDevOps #jjug_ccc
PDF
形式手法で捗る!インフラ構成の設計と検証
PPTX
Spring 5に備えるリアクティブプログラミング入門
PDF
形態素解析
PDF
3000社の業務データ絞り込みを支える技術
PPTX
WalB: Real-time and Incremental Backup System for Block Devices
PDF
離れた場所でも最高のチームワークを実現する方法 ーサイボウズ開発チームのリモートワーク事例ー
PDF
Jenkins 2.0 最新事情 〜Make Jenkins Great Again〜
PDF
あなたの開発チームには、チームワークがあふれていますか?
PDF
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
SpringOne 2GX 2014 参加報告 & Spring 4.1について #jsug
Data Microservices with Spring Cloud Stream, Task, and Data Flow #jsug #spri...
ビッグじゃなくても使えるSpark Streaming
Java トラブル解析支援ツール HeapStats のご紹介
サーバーレスでシステムを開発する時に⼤切な事
Spring Cloud Netflixを使おう #jsug
マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07
AWSでアプリ開発するなら 知っておくべこと
ぱぱっと理解するSpring Cloudの基本
SIerもはじめる わたしたちのDevOps #jjug_ccc
形式手法で捗る!インフラ構成の設計と検証
Spring 5に備えるリアクティブプログラミング入門
形態素解析
3000社の業務データ絞り込みを支える技術
WalB: Real-time and Incremental Backup System for Block Devices
離れた場所でも最高のチームワークを実現する方法 ーサイボウズ開発チームのリモートワーク事例ー
Jenkins 2.0 最新事情 〜Make Jenkins Great Again〜
あなたの開発チームには、チームワークがあふれていますか?
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Ad

Similar to Event Driven Microservices with Spring Cloud Stream #jjug_ccc #ccc_ab3 (20)

PDF
Spring Cloud Servicesの紹介 #pcf_tokyo
PDF
How to Architect and Develop Cloud Native Applications
PDF
Cloud Foundy Java Client V 2.0 #cf_tokyo
PDF
From Zero to Hero with REST and OAuth2 #jjug
PDF
今すぐ始めるCloud Foundry #hackt #hackt_k
PDF
Pivotal Cloud Foundry: A Technical Overview
PDF
Pivotal Cloud Foundry: A Technical Overview
PDF
Pivotal microservices spring_pcf_skillsmatter.pptx
PDF
To Microservices and Beyond
PDF
Spring Framework 5.0による Reactive Web Application #JavaDayTokyo
PDF
How to build unified Batch & Streaming Pipelines with Apache Beam and Dataflow
PDF
Product Release Webinar- WSO2 Developer Studio 3.5
PDF
Cloud-Native Streaming and Event-Driven Microservices
PPTX
Grow your SharePoint development platform with SharePoint Framework
PPTX
Spring on PAS - Fabio Marinelli
PDF
Microservices, Containers, Docker and a Cloud-Native Architecture in the Midd...
PPT
Platform as Art: A Developer’s Perspective
PDF
Manchester geek night pcf 101
PDF
Managing your Docker image continuously with Concourse CI
PDF
Spring Boot & Spring Cloud on Pivotal Application Service
Spring Cloud Servicesの紹介 #pcf_tokyo
How to Architect and Develop Cloud Native Applications
Cloud Foundy Java Client V 2.0 #cf_tokyo
From Zero to Hero with REST and OAuth2 #jjug
今すぐ始めるCloud Foundry #hackt #hackt_k
Pivotal Cloud Foundry: A Technical Overview
Pivotal Cloud Foundry: A Technical Overview
Pivotal microservices spring_pcf_skillsmatter.pptx
To Microservices and Beyond
Spring Framework 5.0による Reactive Web Application #JavaDayTokyo
How to build unified Batch & Streaming Pipelines with Apache Beam and Dataflow
Product Release Webinar- WSO2 Developer Studio 3.5
Cloud-Native Streaming and Event-Driven Microservices
Grow your SharePoint development platform with SharePoint Framework
Spring on PAS - Fabio Marinelli
Microservices, Containers, Docker and a Cloud-Native Architecture in the Midd...
Platform as Art: A Developer’s Perspective
Manchester geek night pcf 101
Managing your Docker image continuously with Concourse CI
Spring Boot & Spring Cloud on Pivotal Application Service

More from Toshiaki Maki (20)

PDF
From Spring Boot 2.2 to Spring Boot 2.3 #jsug
PDF
Concourse x Spinnaker #concourse_tokyo
PDF
Serverless with Spring Cloud Function, Knative and riff #SpringOneTour #s1t
PDF
決済システムの内製化への旅 - SpringとPCFで作るクラウドネイティブなシステム開発 #jsug #sf_h1
PDF
Spring Boot Actuator 2.0 & Micrometer #jjug_ccc #ccc_a1
PDF
Spring Boot Actuator 2.0 & Micrometer
PDF
Open Service Broker APIとKubernetes Service Catalog #k8sjp
PDF
Spring Cloud Function & Project riff #jsug
PDF
Introduction to Spring WebFlux #jsug #sf_a1
PDF
BOSH / CF Deployment in modern ways #cf_tokyo
PDF
Why PCF is the best platform for Spring Boot
PDF
Zipkin Components #zipkin_jp
PDF
実例で学ぶ、明日から使えるSpring Boot Tips #jsug
PDF
Spring ❤️ Kotlin #jjug
PDF
Short Lived Tasks in Cloud Foundry #cfdtokyo
PDF
Team Support in Concourse CI 2.0 #concourse_tokyo
PDF
Consumer Driven Contractsで REST API/マイクロサービスをテスト #m3tech
PDF
Implement Service Broker with Spring Boot #cf_tokyo
PDF
#jjug_ccc #ccc_gh5 What's new in Spring Framework 4.3 / Boot 1.4 + Pivotal's ...
PDF
Concourse CI Meetup Demo
From Spring Boot 2.2 to Spring Boot 2.3 #jsug
Concourse x Spinnaker #concourse_tokyo
Serverless with Spring Cloud Function, Knative and riff #SpringOneTour #s1t
決済システムの内製化への旅 - SpringとPCFで作るクラウドネイティブなシステム開発 #jsug #sf_h1
Spring Boot Actuator 2.0 & Micrometer #jjug_ccc #ccc_a1
Spring Boot Actuator 2.0 & Micrometer
Open Service Broker APIとKubernetes Service Catalog #k8sjp
Spring Cloud Function & Project riff #jsug
Introduction to Spring WebFlux #jsug #sf_a1
BOSH / CF Deployment in modern ways #cf_tokyo
Why PCF is the best platform for Spring Boot
Zipkin Components #zipkin_jp
実例で学ぶ、明日から使えるSpring Boot Tips #jsug
Spring ❤️ Kotlin #jjug
Short Lived Tasks in Cloud Foundry #cfdtokyo
Team Support in Concourse CI 2.0 #concourse_tokyo
Consumer Driven Contractsで REST API/マイクロサービスをテスト #m3tech
Implement Service Broker with Spring Boot #cf_tokyo
#jjug_ccc #ccc_gh5 What's new in Spring Framework 4.3 / Boot 1.4 + Pivotal's ...
Concourse CI Meetup Demo

Recently uploaded (20)

PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PDF
Empathic Computing: Creating Shared Understanding
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PPTX
A Presentation on Artificial Intelligence
PDF
Unlocking AI with Model Context Protocol (MCP)
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
Per capita expenditure prediction using model stacking based on satellite ima...
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
NewMind AI Weekly Chronicles - August'25 Week I
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
The Rise and Fall of 3GPP – Time for a Sabbatical?
Empathic Computing: Creating Shared Understanding
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Building Integrated photovoltaic BIPV_UPV.pdf
Dropbox Q2 2025 Financial Results & Investor Presentation
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
Spectral efficient network and resource selection model in 5G networks
Agricultural_Statistics_at_a_Glance_2022_0.pdf
A Presentation on Artificial Intelligence
Unlocking AI with Model Context Protocol (MCP)
20250228 LYD VKU AI Blended-Learning.pptx
Mobile App Security Testing_ A Comprehensive Guide.pdf
Advanced methodologies resolving dimensionality complications for autism neur...
Reach Out and Touch Someone: Haptics and Empathic Computing

Event Driven Microservices with Spring Cloud Stream #jjug_ccc #ccc_ab3

  • 1. ‹#›© 2016 Pivotal Software, Inc. All rights reserved. ‹#›© 2016 Pivotal Software, Inc. All rights reserved. Event Driven Microservices with Spring Cloud Stream Toshiaki Maki (@making) 2016-12-03 JJUG CCC 2016 Fall #jjug_ccc #ccc_ab3 http://bit.ly/making_ccc_a3 (source code)
  • 2. © 2016 Pivotal Software, Inc. All rights reserved. Who am I ? • Toshiaki Maki (@making) http://blog.ik.am • Sr. Solutions Architect @Pivotal • Spring Framework enthusiast bit.ly/hajiboot2
  • 3. © 2016 Pivotal Software, Inc. All rights reserved. Contents •Spring Cloud Stream (25min) •Advanced Topic (20min) •Spring Cloud Data Flow (2min) •Deploy Stream Apps to Cloud Foundry (3min)
  • 4. © 2016 Pivotal Software, Inc. All rights reserved. Microservices Frontend Customer Service Email Service Point Service Post Service
  • 5. © 2016 Pivotal Software, Inc. All rights reserved. Microservices Frontend Customer Service Email Service Point Service Post Service HTTP / REST?
  • 6. © 2016 Pivotal Software, Inc. All rights reserved. Microservices Frontend Customer Service Email Service Point Service Post Service ABC Service XYZ Service
  • 7. © 2016 Pivotal Software, Inc. All rights reserved. Microservices Frontend Customer Service Email Service Point Service Post Service ABC Service XYZ Service
  • 8. © 2016 Pivotal Software, Inc. All rights reserved. Microservices Frontend Customer Service Email Service Point Service Post Service ABC Service XYZ Service
  • 9. © 2016 Pivotal Software, Inc. All rights reserved. Microservices Frontend Customer Service Email Service Point Service Post Service ABC Service XYZ Service😩
  • 10. © 2016 Pivotal Software, Inc. All rights reserved. Microservices Frontend Customer Service Email Service Point Service Post Service ABC Service XYZ Service😩 Orchestration Style
  • 11. © 2016 Pivotal Software, Inc. All rights reserved. Read Failure Frontend Customer Service Email Service HTTP GET
  • 12. © 2016 Pivotal Software, Inc. All rights reserved. Read Failure Frontend Customer Service Email Service 🔥 HTTP GET
  • 13. © 2016 Pivotal Software, Inc. All rights reserved. Read Failure Frontend Customer Service Email Service 🔥 HTTP GET Circuit Breaker
  • 14. © 2016 Pivotal Software, Inc. All rights reserved. Read Failure Frontend Customer Service Email Service 🔥 HTTP GET Circuit Breaker
  • 15. © 2016 Pivotal Software, Inc. All rights reserved. Write Failure Frontend Customer Service Email Service HTTP POST
  • 16. © 2016 Pivotal Software, Inc. All rights reserved. Write Failure 🔥 Frontend Customer Service Email Service HTTP POST
  • 17. © 2016 Pivotal Software, Inc. All rights reserved. Write Failure 🔥 Frontend Customer Service Email Service 😲 HTTP POST
  • 18. © 2016 Pivotal Software, Inc. All rights reserved. Event Driven MicroServices Frontend Customer Service Email Service Point Service Post Service
  • 19. © 2016 Pivotal Software, Inc. All rights reserved. Event Driven MicroServices Frontend Customer Service Email Service Point Service Post Service
  • 20. © 2016 Pivotal Software, Inc. All rights reserved. Event Driven MicroServices Frontend Customer Service Email Service Point Service Post Service Subscribe
  • 21. © 2016 Pivotal Software, Inc. All rights reserved. Event Driven MicroServices Frontend Customer Service Email Service Point Service Post Service Subscribe Publish
  • 22. © 2016 Pivotal Software, Inc. All rights reserved. Event Driven MicroServices Frontend Customer Service Email Service Point Service Post Service Subscribe ABC Service XYZ Service Publish
  • 23. © 2016 Pivotal Software, Inc. All rights reserved. Event Driven MicroServices Frontend Customer Service Email Service Point Service Post Service Subscribe ABC Service XYZ Service Publish
  • 24. © 2016 Pivotal Software, Inc. All rights reserved. Event Driven MicroServices Frontend Customer Service Email Service Point Service Post Service Subscribe ABC Service XYZ Service 🤓 Publish
  • 25. © 2016 Pivotal Software, Inc. All rights reserved. Choreography Style https://www.thoughtworks.com/insights/blog/scaling-microservices-event-stream
  • 26. ‹#›© 2016 Pivotal Software, Inc. All rights reserved. Spring Cloud Stream
  • 27. © 2016 Pivotal Software, Inc. All rights reserved. Spring Cloud Stream • Event-driven microservice framework • Built on battle-tested components (Spring Boot / Spring Integration) • Opinionated primitives for streaming applications • Persistent Pub/Sub • Consumer Groups • Partitioning Support • Pluggable messaging middleware bindings source | processor | sink
  • 28. © 2016 Pivotal Software, Inc. All rights reserved. Source | Sink Sink input Source output
  • 29. © 2016 Pivotal Software, Inc. All rights reserved. Source | Processor | Sink Source output Processor output input Sink input
  • 30. © 2016 Pivotal Software, Inc. All rights reserved. Spring Cloud Stream Applications Twitter Stream Cassandra java -jar twittersource.jar --server.port=8080 --consumerKey=XYZ --consumerSecret=ABC --spring.cloud.stream.bindings. output.destination=ingest Source Sink java -jar cassandrasink.jar --server.port=8081 --spring.cassandra.keyspace=tweet --spring.cloud.stream.bindings. input.destination=ingest
  • 31. © 2016 Pivotal Software, Inc. All rights reserved. Spring Cloud Stream Applications Twitter Stream Cassandra java -jar twittersource.jar --server.port=8080 --consumerKey=XYZ --consumerSecret=ABC --spring.cloud.stream.bindings. output.destination=ingest Source Sink java -jar cassandrasink.jar --server.port=8081 --spring.cassandra.keyspace=tweet --spring.cloud.stream.bindings. input.destination=ingest Twitter Stream Cassandraingest
  • 32. © 2016 Pivotal Software, Inc. All rights reserved. Message Binders • @EnableBinding • Binder Implementations • Production-Ready • Rabbit MQ • Apache Kafka • Experimental • JMS • Google PubSub
  • 33. © 2016 Pivotal Software, Inc. All rights reserved. Programming Model (Sink) @SpringBootApplication
 @EnableBinding(Sink.class)
 public class DemoSinkApp { @StreamListener(Sink.INPUT)
 void receive(Message<String> message) {
 System.out.println("Received " + message.getPayload());
 }
 public static void main(String[] args) {
 SpringApplication.run(DemoSinkApp.class, args);
 }
 }
  • 34. © 2016 Pivotal Software, Inc. All rights reserved. Programming Model (Sink) @SpringBootApplication
 @EnableBinding(Sink.class)
 public class DemoSinkApp { @StreamListener(Sink.INPUT)
 void receive(Message<String> message) {
 System.out.println("Received " + message.getPayload());
 }
 public static void main(String[] args) {
 SpringApplication.run(DemoSinkApp.class, args);
 }
 } public interface Sink { String INPUT = "input"; @Input(Sink.INPUT) SubscribableChannel input();
 }
  • 35. © 2016 Pivotal Software, Inc. All rights reserved. Sink Properties (Sink) spring.cloud.stream.bindings.input.destination=demo-strm demo- strm input
  • 36. © 2016 Pivotal Software, Inc. All rights reserved. Programming Model (Source) @SpringBootApplication @RestController @EnableBinding(Source.class)
 public class DemoSourceApp {
 @Autowired @Output(Source.OUTPUT) MessageChannel output; @GetMapping void send(@RequestParam String text) {
 output.send(MessageBuilder.withPayload(text).build());
 }
 public static void main(String[] args) {
 SpringApplication.run(DemoSourceApp.class, args);
 }
 }
  • 37. © 2016 Pivotal Software, Inc. All rights reserved. Programming Model (Source) @SpringBootApplication @RestController @EnableBinding(Source.class)
 public class DemoSourceApp {
 @Autowired @Output(Source.OUTPUT) MessageChannel output; @GetMapping void send(@RequestParam String text) {
 output.send(MessageBuilder.withPayload(text).build());
 }
 public static void main(String[] args) {
 SpringApplication.run(DemoSourceApp.class, args);
 }
 } public interface Source { String OUTPUT = "output"; @Output(Source.OUTPUT) MessageChannel output();
 }
  • 38. © 2016 Pivotal Software, Inc. All rights reserved. Programming Model (Source) @SpringBootApplication @RestController @EnableBinding(Source.class)
 public class DemoSourceApp {
 @Autowired Source source; @GetMapping void send(@RequestParam String text) {
 source.output() .send(MessageBuilder.withPayload(text).build());
 }
 public static void main(String[] args) {
 SpringApplication.run(DemoSourceApp.class, args);
 }
 }
  • 39. © 2016 Pivotal Software, Inc. All rights reserved. Properties (Source) spring.cloud.stream.bindings.output.destination=demo-strm demo- strm Source output
  • 40. © 2016 Pivotal Software, Inc. All rights reserved. Properties (Source) spring.cloud.stream.bindings.output.destination=demo-strm spring.cloud.stream.bindings.output.contentType=applicati on/json demo- strm Source output
  • 41. © 2016 Pivotal Software, Inc. All rights reserved. Binder (RabbitMQ) <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-stream-rabbit</artifactId> </dependency> demo- strm
  • 42. © 2016 Pivotal Software, Inc. All rights reserved. Binder (Apache Kafka) <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-stream-kafka</artifactId> </dependency> demo- strm
  • 43. © 2016 Pivotal Software, Inc. All rights reserved. Sink Pipeline demo- strm input Source output source | sink
  • 44. © 2016 Pivotal Software, Inc. All rights reserved. RabbitMQ demo-strm
  • 45. © 2016 Pivotal Software, Inc. All rights reserved. RabbitMQ demo-strm Source
  • 46. © 2016 Pivotal Software, Inc. All rights reserved. RabbitMQ demo-strm Topic Exchange demo-strm Source
  • 47. © 2016 Pivotal Software, Inc. All rights reserved. RabbitMQ demo-strm Topic Exchange demo-strm Source
  • 48. © 2016 Pivotal Software, Inc. All rights reserved. RabbitMQ demo-strm Topic Exchange demo-strm Source Sink
  • 49. © 2016 Pivotal Software, Inc. All rights reserved. RabbitMQ demo-strm Topic Exchange demo-strm .anonymous.x Queue demo-strm Source Sink
  • 50. © 2016 Pivotal Software, Inc. All rights reserved. RabbitMQ demo-strm Topic Exchange demo-strm .anonymous.x Queue demo-strm Source Sink
  • 51. © 2016 Pivotal Software, Inc. All rights reserved. Programming Model (Processor) @SpringBootApplication
 @EnableBinding(Processor.class)
 public class DemoProcessorApp { @StreamListener(Processor.INPUT) @SendTo(Processor.OUTPUT)
 void receive(String text) {
 return "[[" + text + "]]";
 }
 public static void main(String[] args) {
 SpringApplication.run(DemoProcessorApp.class, args);
 }
 }
  • 52. © 2016 Pivotal Software, Inc. All rights reserved. Properties (Processor) spring.cloud.stream.bindings.output.destination=my-source spring.cloud.stream.bindings.input.destination=my-source spring.cloud.stream.bindings.output.destination=my-proc spring.cloud.stream.bindings.input.destination=my-proc Source Processor Sink
  • 53. © 2016 Pivotal Software, Inc. All rights reserved. Pipeline my- source Source output source | processor | sink Processor output input my-proc Sink input
  • 54. © 2016 Pivotal Software, Inc. All rights reserved. Reactive API Support by Reactor @SpringBootApplication
 @EnableBinding(Processor.class)
 public class DemoProcessorRxApp { @StreamListener @Output(Processor.OUTPUT)
 public Flux<String> receive(@Input(Processor.INPUT) Flux<String> stream) {
 return stream.map(text -> "[[" + text + "]]");
 }
 public static void main(String[] args) {
 SpringApplication.run(DemoProcessorRxApp.class, args);
 }
 }
  • 55. © 2016 Pivotal Software, Inc. All rights reserved. Reactive API Support by Reactor @StreamListener @Output(Processor.OUTPUT)
 public Flux<AverageData> receive(@Input(Processor.INPUT) Flux<SensorData> stream) {
 return stream.window(Duration.ofSecond(20), Duration.ofSecond(10)) .flatMap(win -> win.groupBy(sensor -> sensor.id)) .flatMap(group -> calcAverage(group));
 }
  • 56. © 2016 Pivotal Software, Inc. All rights reserved. Stream Core Features •Persistent Pub-Sub •Consumer Group •Partitioning Support
  • 57. © 2016 Pivotal Software, Inc. All rights reserved. Persistent Pub-Sub HTTP Average Top Ns1.http s1.ave Message Broker
  • 58. © 2016 Pivotal Software, Inc. All rights reserved. Persistent Pub-Sub HTTP Average HDFS Top Ns1.http s1.ave Message Broker
  • 59. © 2016 Pivotal Software, Inc. All rights reserved. Persistent Pub-Sub HTTP Average HDFS Top N Fault Detection s1.http s1.ave Message Broker
  • 60. © 2016 Pivotal Software, Inc. All rights reserved. Persistent Pub-Sub HTTP Average HDFS Top N Fault Detection s1.http s1.ave Message Broker {"id":1, "temperature":38}
  • 61. © 2016 Pivotal Software, Inc. All rights reserved. Persistent Pub-Sub HTTP Average HDFS Top N Fault Detection s1.http s1.ave Message Broker {"id":1, "temperature":38}{"id":1, "temperature":38}
  • 62. © 2016 Pivotal Software, Inc. All rights reserved. Persistent Pub-Sub HTTP Average HDFS Top N Fault Detection s1.http s1.ave Message Broker {"id":1, "temperature":38} {"id":1, "temperature":38} {"id":1, "temperature":38}
  • 63. © 2016 Pivotal Software, Inc. All rights reserved. Persistent Pub-Sub HTTP Average HDFS Top N Fault Detection s1.http s1.ave Message Broker {"id":1, "temperature": {"id":1, "temperature":38} {"id":1, "temperature":38}
  • 64. © 2016 Pivotal Software, Inc. All rights reserved. HTTP Average HDFS Top N Fault Detection s1.http s1.ave Message Broker Average Average HDFS HDFS
  • 65. © 2016 Pivotal Software, Inc. All rights reserved. HTTP Average HDFS Top N Fault Detection s1.http s1.ave Message Broker {"id":1, "temperature":38} Average Average HDFS HDFS
  • 66. © 2016 Pivotal Software, Inc. All rights reserved. HTTP Average HDFS Top N Fault Detection s1.http s1.ave Message Broker {"id":1, "temperature":38}{"id":1, "temperature":38} Average Average HDFS HDFS
  • 67. © 2016 Pivotal Software, Inc. All rights reserved. HTTP Average HDFS Top N Fault Detection s1.http s1.ave Message Broker {"id":1, "temperature":38} {"id":1, "temperature":38} Average Average HDFS HDFS {"id":1, "temperature":38} {"id":1, "temperature":38} {"id":1, "temperature":38} {"id":1, "temperature":38}
  • 68. © 2016 Pivotal Software, Inc. All rights reserved. HTTP Average HDFS Top N Fault Detection s1.http s1.ave Message Broker {"id":1, "temperature":38} {"id":1, "temperature":38} Average Average HDFS HDFS {"id":1, "temperature":38} {"id":1, "temperature":38} {"id":1, "temperature":38} {"id":1, "temperature":38} 😩
  • 69. © 2016 Pivotal Software, Inc. All rights reserved. Topic Exchange demo-strm demo-strm .anonymous.1 Queue
  • 70. © 2016 Pivotal Software, Inc. All rights reserved. Topic Exchange demo-strm demo-strm .anonymous.1 Queue
  • 71. © 2016 Pivotal Software, Inc. All rights reserved. Topic Exchange demo-strm demo-strm .anonymous.1 Queue demo-strm .anonymous.2
  • 72. © 2016 Pivotal Software, Inc. All rights reserved. Topic Exchange demo-strm demo-strm .anonymous.1 Queue demo-strm .anonymous.2 Consumer Group
  • 73. © 2016 Pivotal Software, Inc. All rights reserved. Topic Exchange demo-strm demo-strm .anonymous.1 Queue demo-strm .anonymous.2 spring.cloud.stream.bindings.<channelName>.group=ave Consumer Group
  • 74. © 2016 Pivotal Software, Inc. All rights reserved. Consumer Group demo-strm demo-strm .ave QueueTopic Exchange
  • 75. © 2016 Pivotal Software, Inc. All rights reserved. Consumer Group HTTP Average HDFS Top N Fault Detection s1.http s1.ave Message Broker Average Average HDFS HDFS group=ave group=hdfs
  • 76. © 2016 Pivotal Software, Inc. All rights reserved. Consumer Group HTTP Average HDFS Top N Fault Detection s1.http s1.ave Message Broker Average Average HDFS HDFS group=ave group=hdfs {"id":1, "temperature":38}
  • 77. © 2016 Pivotal Software, Inc. All rights reserved. Consumer Group HTTP Average HDFS Top N Fault Detection s1.http s1.ave Message Broker Average Average HDFS HDFS group=ave group=hdfs {"id":1, "temperature":38}{"id":1, "temperature":38}
  • 78. © 2016 Pivotal Software, Inc. All rights reserved. Consumer Group HTTP Average HDFS Top N Fault Detection s1.http s1.ave Message Broker Average Average HDFS HDFS group=ave group=hdfs {"id":1, "temperature":38} {"id":1, "temperature":38}
  • 79. © 2016 Pivotal Software, Inc. All rights reserved. Consumer Group HTTP Average HDFS Top N Fault Detection s1.http s1.ave Message Broker Average Average HDFS HDFS group=ave group=hdfs {"id":1, "temperature":38} {"id":1, "temperature":38} 🤓
  • 80. © 2016 Pivotal Software, Inc. All rights reserved. Consumer Group HTTP Average HDFS Top N Fault Detection s1.http s1.ave Message Broker Average Average HDFS HDFS group=ave group=hdfs {"id":1, "temperature":38} {"id":1, "temperature":38} 🤓 consumer group subscriptions are durable 😁
  • 81. © 2016 Pivotal Software, Inc. All rights reserved. Durability demo-strm demo-strm .ave QueueTopic Exchange
  • 82. © 2016 Pivotal Software, Inc. All rights reserved. Durability demo-strm demo-strm .ave QueueTopic Exchange
  • 83. © 2016 Pivotal Software, Inc. All rights reserved. Durability demo-strm demo-strm .ave Queue 🏀 Topic Exchange
  • 84. © 2016 Pivotal Software, Inc. All rights reserved. Durability demo-strm demo-strm .ave Queue 🏀 Topic Exchange
  • 85. © 2016 Pivotal Software, Inc. All rights reserved. Durability demo-strm demo-strm .ave Queue 🚑 🏀 Topic Exchange
  • 86. © 2016 Pivotal Software, Inc. All rights reserved. Durability demo-strm demo-strm .ave Queue 🚑 🏀 Topic Exchange
  • 87. © 2016 Pivotal Software, Inc. All rights reserved. Durability demo-strm demo-strm .ave Queue 🏀 Topic Exchange
  • 88. © 2016 Pivotal Software, Inc. All rights reserved. Customer Service Email Service Point Service Post Service Source Sink
  • 89. © 2016 Pivotal Software, Inc. All rights reserved. Customer Service Email Service Point Service Post Service Source Sink spring.cloud.stream.bindings.output.destination=customer spring.cloud.stream.bindings.output.contentType=applicatio n/json
  • 90. © 2016 Pivotal Software, Inc. All rights reserved. Customer Service Email Service Point Service Post Service Subscribe Source Sink
  • 91. © 2016 Pivotal Software, Inc. All rights reserved. Customer Service Email Service Point Service Post Service Subscribe Source Sink group=point-service group=email-service group=post-service
  • 92. © 2016 Pivotal Software, Inc. All rights reserved. Customer Service Email Service Point Service Post Service Subscribe Source Sink group=point-service group=email-service group=post-service spring.cloud.stream.bindings.input.destination=customer spring.cloud.stream.bindings.input.group=point-service
  • 93. © 2016 Pivotal Software, Inc. All rights reserved. Customer Service Email Service Point Service Post Service Subscribe Source Sink group=point-service group=email-service group=post-service spring.cloud.stream.bindings.input.destination=customer spring.cloud.stream.bindings.input.group=point-service spring.cloud.stream.bindings.input.destination=customer spring.cloud.stream.bindings.input.group=email-service
  • 94. © 2016 Pivotal Software, Inc. All rights reserved. Customer Service Email Service Point Service Post Service Subscribe Source Sink group=point-service group=email-service group=post-service spring.cloud.stream.bindings.input.destination=customer spring.cloud.stream.bindings.input.group=point-service spring.cloud.stream.bindings.input.destination=customer spring.cloud.stream.bindings.input.group=email-service spring.cloud.stream.bindings.input.destination=customer spring.cloud.stream.bindings.input.group=post-service
  • 95. © 2016 Pivotal Software, Inc. All rights reserved. customer Customer Service output Point Service input Email Service input Post Service input
  • 96. © 2016 Pivotal Software, Inc. All rights reserved. customer customer .point- service Queue Consumer Group customer .email- service customer .post- service Topic Exchange
  • 97. © 2016 Pivotal Software, Inc. All rights reserved. HTTP Average s1.http Average
  • 98. © 2016 Pivotal Software, Inc. All rights reserved. HTTP Average s1.http Average {"id":1, "temperature":38} {"id":2, "temperature":41} {"id":2, "temperature":42} {"id":1, "temperature":37}
  • 99. © 2016 Pivotal Software, Inc. All rights reserved. HTTP Average s1.http Average {"id":1, "temperature":38} {"id":2, "temperature":41} {"id":2, "temperature":42} {"id":1, "temperature":37}
  • 100. © 2016 Pivotal Software, Inc. All rights reserved. HTTP Average s1.http Average {"id":1, "temperature":38} {"id":2, "temperature":41} {"id":2, "temperature":42} {"id":1, "temperature":37}
  • 101. © 2016 Pivotal Software, Inc. All rights reserved. HTTP Average s1.http Average {"id":1, "temperature":38} {"id":2, "temperature":41} {"id":2, "temperature":42} {"id":1, "temperature":37}
  • 102. © 2016 Pivotal Software, Inc. All rights reserved. HTTP Average s1.http Average {"id":1, "temperature":38} {"id":2, "temperature":41} {"id":2, "temperature":42} {"id":1, "temperature":37}
  • 103. © 2016 Pivotal Software, Inc. All rights reserved. HTTP Average s1.http Average {"id":1, "temperature":38} {"id":2, "temperature":41} {"id":2, "temperature":42} {"id":1, "temperature":37} 😩
  • 104. © 2016 Pivotal Software, Inc. All rights reserved. HTTP Average s1.http Average {"id":1, "temperature":38} {"id":2, "temperature":41} {"id":2, "temperature":42} {"id":1, "temperature":37} 😩 Partitioning Support(Stateful Stream)
  • 105. © 2016 Pivotal Software, Inc. All rights reserved. HTTP Average s1.http Average {"id":1, "temperature":38} {"id":2, "temperature":41} {"id":2, "temperature":42} {"id":1, "temperature":37} 😩 spring.cloud.stream.bindings.<channelName>.producer.par titionKeyExpression=payload.id Partitioning Support(Stateful Stream)
  • 106. © 2016 Pivotal Software, Inc. All rights reserved. Partitioning Support(Stateful Stream) HTTP Average s1.http Average
  • 107. © 2016 Pivotal Software, Inc. All rights reserved. Partitioning Support(Stateful Stream) HTTP Average s1.http Average {"id":1, "temperature":38} {"id":2, "temperature":41} {"id":2, "temperature":42} {"id":1, "temperature":37}
  • 108. © 2016 Pivotal Software, Inc. All rights reserved. Partitioning Support(Stateful Stream) HTTP Average s1.http Average {"id":1, "temperature":38} {"id":2, "temperature":41} {"id":2, "temperature":42} {"id":1, "temperature":37}
  • 109. © 2016 Pivotal Software, Inc. All rights reserved. Partitioning Support(Stateful Stream) HTTP Average s1.http Average {"id":1, "temperature":38} {"id":2, "temperature":41} {"id":2, "temperature":42} {"id":1, "temperature":37}
  • 110. © 2016 Pivotal Software, Inc. All rights reserved. Partitioning Support(Stateful Stream) HTTP Average s1.http Average {"id":1, "temperature":38} {"id":2, "temperature":41} {"id":2, "temperature":42} {"id":1, "temperature":37}
  • 111. © 2016 Pivotal Software, Inc. All rights reserved. Partitioning Support(Stateful Stream) HTTP Average s1.http Average {"id":1, "temperature":38} {"id":2, "temperature":41} {"id":2, "temperature":42} {"id":1, "temperature":37}
  • 112. © 2016 Pivotal Software, Inc. All rights reserved. Partitioning Support(Stateful Stream) HTTP Average s1.http Average {"id":1, "temperature":38} {"id":2, "temperature":41} {"id":2, "temperature":42} {"id":1, "temperature":37} 🤓
  • 113. © 2016 Pivotal Software, Inc. All rights reserved. Test Support Source output Sink input
  • 114. © 2016 Pivotal Software, Inc. All rights reserved. Test Support Source output Sink input TestSupportBinder
  • 115. © 2016 Pivotal Software, Inc. All rights reserved. Test Support <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-stream-test-support</artifactId> <scope>test</scope> </dependency>
  • 116. © 2016 Pivotal Software, Inc. All rights reserved. Unit Test (Sink) @RunWith(SpringRunner.class)
 @SpringBootTest(webEnvironment = WebEnvironment.NONE)
 public class DemoSinkAppTest { @Autowired Sink sink; @Rule public OutputCapture capture = new OutputCapture(); @Test public void testReceive() { sink.input() .send(MessageBuilder.withPayload("foo").build()); assertThat(capture.toString()) .isEqualsTo("Received foo");
 } }
  • 117. © 2016 Pivotal Software, Inc. All rights reserved. Unit Test (Source) @RunWith(SpringRunner.class)
 @SpringBootTest(webEnvironment = WebEnvironment.NONE)
 public class DemoSourceAppTest { @Autowired DemoSourceApp app; @Autowired MessageCollector collector; @Autowired Source source; @Test public void testSend() { app.send("foo"); Message<String> message = collector .forChannel(source.output()).poll(); assertThat(message.getPayload()).isEqualsTo("foo"); 
 }}
  • 118. ‹#›© 2016 Pivotal Software, Inc. All rights reserved. Advanced Topics
  • 119. © 2016 Pivotal Software, Inc. All rights reserved. Advanced Topics •Multi Binding •Distributed Tracing •Error Handling •Consumer Driven Contract
  • 120. © 2016 Pivotal Software, Inc. All rights reserved. Multi Bindings
  • 121. © 2016 Pivotal Software, Inc. All rights reserved. customer Customer Service output Email Service input
  • 122. © 2016 Pivotal Software, Inc. All rights reserved. customer Customer Service output Email Service input CustomerCreateEvent
  • 123. © 2016 Pivotal Software, Inc. All rights reserved. customer Customer Service output Email Service input
  • 124. © 2016 Pivotal Software, Inc. All rights reserved. customer Customer Service output Email Service input CustomerDeleteEvent
  • 125. © 2016 Pivotal Software, Inc. All rights reserved. customer Customer Service output Email Service input CustomerDeleteEvent ClassCastException!!
  • 126. © 2016 Pivotal Software, Inc. All rights reserved. create Email Service create- input delete- input Customer Service create- output delete- output delete CustomerCreateEvent CustomerDeleteEvent
  • 127. © 2016 Pivotal Software, Inc. All rights reserved. public interface CustomerEventSource { String CREATE_OUTPUT = "create-output"; String DELETE_OUTPUT = "delete-output"; @Output(CustomerEventSource.CREATE_OUTPUT) MessageChannel createOutput(); @Output(CustomerEventSource.DELETE_OUTPUT) MessageChannel deleteOutput();
 } Multi Bindings
  • 128. © 2016 Pivotal Software, Inc. All rights reserved. @Component
 public class CustomerService {
 @Autowired CustomerEventSource source; public void create(...) { source.createOutput().send(...); } public void delete() { source.deleteOutput().send(...); }
 } @SpringBootApplication @EnableBinding(CustomerEventSource.class)
 public class CustomerServiceApplication { /* ... */ }
  • 129. © 2016 Pivotal Software, Inc. All rights reserved. @Component
 public class CustomerService {
 @Autowired CustomerEventSource source; public void create(...) { source.createOutput().send(...); } public void delete() { source.deleteOutput().send(...); }
 } @SpringBootApplication @EnableBinding(CustomerEventSource.class)
 public class CustomerServiceApplication { /* ... */ } spring.cloud.stream.bindings.create-output.destination =create spring.cloud.stream.bindings.delete-output.destination =delete
  • 130. © 2016 Pivotal Software, Inc. All rights reserved. public interface CustomerEventSink { String CREATE_INPUT = "create-input"; String DELETE_INPUT = "delete-input"; @Input(CustomerEventSink.CREATE_INPUT) SubscribableChannel createInput(); @Input(CustomerEventSink.DELETE_INPUT) SubscribableChannel deleteInput();
 } Multi Bindings
  • 131. © 2016 Pivotal Software, Inc. All rights reserved. @Component
 public class PointService { @StreamListener(CustomerEventSink.CREATE_INPUT) public void handleCreate(CustomerCreateEvent event) { } @StreamListener(CustomerEventSink.DELETE_INPUT) public void handleDelete(CustomerDeleteEvent event) { }
 } @SpringBootApplication @EnableBinding(CustomerEventSink.class)
 public class PointServiceApplication { /* ... */ }
  • 132. © 2016 Pivotal Software, Inc. All rights reserved. @Component
 public class PointService { @StreamListener(CustomerEventSink.CREATE_INPUT) public void handleCreate(CustomerCreateEvent event) { } @StreamListener(CustomerEventSink.DELETE_INPUT) public void handleDelete(CustomerDeleteEvent event) { }
 } @SpringBootApplication @EnableBinding(CustomerEventSink.class)
 public class PointServiceApplication { /* ... */ } spring.cloud.stream.bindings.create-input.destination =create spring.cloud.stream.bindings.create-input.group =point-service spring.cloud.stream.bindings.delete-intput.destination =delete spring.cloud.stream.bindings.delete-input.group =point-service
  • 133. © 2016 Pivotal Software, Inc. All rights reserved. create create .point- service Queue delete delete .point- service Topic Exchange
  • 134. © 2016 Pivotal Software, Inc. All rights reserved. Frontend Customer Service Email Service Point Service Post Service Subscribe ABC Service XYZ Service
  • 135. © 2016 Pivotal Software, Inc. All rights reserved. Frontend Customer Service Email Service Point Service Post Service Subscribe ABC Service XYZ Service 🕝
  • 136. © 2016 Pivotal Software, Inc. All rights reserved. Frontend Customer Service Email Service Point Service Post Service Subscribe ABC Service XYZ Service🤔 🕝
  • 137. © 2016 Pivotal Software, Inc. All rights reserved. Frontend Customer Service Email Service Point Service Post Service Subscribe ABC Service XYZ Service🤔 🕝 🕵 🕵 🕵 🕵 🕵 🕵🕵
  • 138. © 2016 Pivotal Software, Inc. All rights reserved. Frontend Customer Service Email Service Point Service Post Service Subscribe ABC Service XYZ Service🤔 🕝 🕵 🕵 🕵 🕵 🕵 🕵🕵
  • 139. © 2016 Pivotal Software, Inc. All rights reserved. Frontend Customer Service Email Service Point Service Post Service Subscribe ABC Service XYZ Service🤔 🕝 🕵 🕵 🕵 🕵 🕵 🕵🕵 TraceID, SpanID
  • 140. © 2016 Pivotal Software, Inc. All rights reserved. Spring Cloud Sleuth • Distributed tracing solution for Spring Cloud • Interactions with external systems should be instrumented automatically • Capture data simply in logs, or by sending it to Zipkin via RestTemplate / Spring Cloud Stream / ...
  • 141. © 2016 Pivotal Software, Inc. All rights reserved. Spring Cloud Sleuth Stream <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-stream-slueth</artifactId> </dependency>
  • 142. © 2016 Pivotal Software, Inc. All rights reserved. Spring Cloud Sleuth Stream customer Customer Service output Email Service input
  • 143. © 2016 Pivotal Software, Inc. All rights reserved. Spring Cloud Sleuth Stream customer Customer Service output Email Service input sleuth sleuth
  • 144. © 2016 Pivotal Software, Inc. All rights reserved. Zipkin Stream Server <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-sleuth-zipkin-stream</artifactId> </dependency>
  • 145. © 2016 Pivotal Software, Inc. All rights reserved. Zipkin Stream Server <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-sleuth-zipkin-stream</artifactId> </dependency> @SpringBootApplication
 @EnableZipkinStreamServer
 public class ZipkinStreamServer {
 public static void main(String[] args) {
 SpringApplication.run(DemoSinkApp.class, args);
 }
 }
  • 146. © 2016 Pivotal Software, Inc. All rights reserved. Zipkin Stream Server customer Customer Service output Email Service input sleuth sleuth
  • 147. © 2016 Pivotal Software, Inc. All rights reserved. Zipkin Stream Server customer Customer Service output Email Service input sleuth sleuth sleuth sleuth
  • 148. © 2016 Pivotal Software, Inc. All rights reserved. Zipkin Stream Server customer Customer Service output Email Service input sleuth sleuth sleuth sleuth
  • 149. © 2016 Pivotal Software, Inc. All rights reserved. Zipkin Stream Server customer Customer Service output Email Service input sleuth sleuth sleuth sleuth
  • 150. © 2016 Pivotal Software, Inc. All rights reserved. Zipkin Stream Server customer Customer Service output Email Service input sleuth sleuth sleuth sleuth TraceID,SpanID TraceID,SpanID
  • 151. © 2016 Pivotal Software, Inc. All rights reserved. Zipkin Stream Server customer Customer Service output Email Service input sleuth sleuth sleuth sleuth
  • 152. © 2016 Pivotal Software, Inc. All rights reserved. Zipkin UI
  • 153. © 2016 Pivotal Software, Inc. All rights reserved. Zipkin UI Trace
  • 154. © 2016 Pivotal Software, Inc. All rights reserved. Zipkin UI Trace Span
  • 155. © 2016 Pivotal Software, Inc. All rights reserved.
  • 156. © 2016 Pivotal Software, Inc. All rights reserved. Error Handling •Depends on the message binder implementation •(Ex.) RabbitMQ binder routes the failed message to the Dead-Letter Queue(DLQ). No mechanism to handle DLQs.
  • 157. © 2016 Pivotal Software, Inc. All rights reserved. Dead-Letter Queue Processing demo-strm Topic Exchange demo-strm .ave Source Sink RabbitMQBinder
  • 158. © 2016 Pivotal Software, Inc. All rights reserved. Dead-Letter Queue Processing demo-strm Topic Exchange demo-strm .ave Source Sink DLX RabbitMQBinder
  • 159. © 2016 Pivotal Software, Inc. All rights reserved. Dead-Letter Queue Processing demo-strm Topic Exchange demo-strm .ave Source Sink DLX RabbitMQBinder spring.cloud.stream.bindings.input.destination=demo-strm spring.cloud.stream.bindings.input.group=ave spring.cloud.stream.rabbit.bindings.input.consumer.autoBi ndDlq=true
  • 160. © 2016 Pivotal Software, Inc. All rights reserved. Dead-Letter Queue Processing demo-strm Topic Exchange demo-strm .ave Source Sink DLX demo-strm .ave.dlq RabbitMQBinder spring.cloud.stream.bindings.input.destination=demo-strm spring.cloud.stream.bindings.input.group=ave spring.cloud.stream.rabbit.bindings.input.consumer.autoBi ndDlq=true
  • 161. © 2016 Pivotal Software, Inc. All rights reserved. Dead-Letter Queue Processing demo-strm Topic Exchange demo-strm .ave Source Sink DLX demo-strm .ave.dlq RabbitMQBinder
  • 162. © 2016 Pivotal Software, Inc. All rights reserved. Dead-Letter Queue Processing demo-strm Topic Exchange demo-strm .ave Source Sink DLX demo-strm .ave.dlq RabbitMQBinder
  • 163. © 2016 Pivotal Software, Inc. All rights reserved. Dead-Letter Queue Processing demo-strm Topic Exchange demo-strm .ave Source Sink DLX demo-strm .ave.dlq RabbitMQBinder
  • 164. © 2016 Pivotal Software, Inc. All rights reserved. Dead-Letter Queue Processing demo-strm Topic Exchange demo-strm .ave Source Sink DLX demo-strm .ave.dlq RabbitMQBinder 🔥
  • 165. © 2016 Pivotal Software, Inc. All rights reserved. Dead-Letter Queue Processing demo-strm Topic Exchange demo-strm .ave Source Sink DLX demo-strm .ave.dlq RabbitMQBinder 🔥 Retry 3 times by default
  • 166. © 2016 Pivotal Software, Inc. All rights reserved. Dead-Letter Queue Processing demo-strm Topic Exchange demo-strm .ave Source Sink DLX demo-strm .ave.dlq RabbitMQBinder 🔥 Retry 3 times by default
  • 167. © 2016 Pivotal Software, Inc. All rights reserved.
  • 168. © 2016 Pivotal Software, Inc. All rights reserved.
  • 169. © 2016 Pivotal Software, Inc. All rights reserved.
  • 170. © 2016 Pivotal Software, Inc. All rights reserved.
  • 171. © 2016 Pivotal Software, Inc. All rights reserved.
  • 172. © 2016 Pivotal Software, Inc. All rights reserved. Handling DLQ @Component
 public class DlqHander { @RabbitListener(queues = "customer.email-service.dlq") public void handle(Message event) { // Re-deliver if you want }
 }
  • 173. © 2016 Pivotal Software, Inc. All rights reserved. DLQ Recovery Center 😛 https://github.com/making-demo-scst/dlq-recover-service
  • 174. © 2016 Pivotal Software, Inc. All rights reserved. Trace everything
  • 175. © 2016 Pivotal Software, Inc. All rights reserved. customer Customer Service output Point Service input Email Service input Post Service input
  • 176. © 2016 Pivotal Software, Inc. All rights reserved. customer Customer Service output Point Service input Email Service input Post Service input
  • 177. © 2016 Pivotal Software, Inc. All rights reserved. customer Customer Service output Point Service input Email Service input Post Service input
  • 178. © 2016 Pivotal Software, Inc. All rights reserved. customer Customer Service output Point Service input Email Service input Post Service input
  • 179. © 2016 Pivotal Software, Inc. All rights reserved. customer Customer Service output Point Service input Email Service input Post Service input
  • 180. © 2016 Pivotal Software, Inc. All rights reserved. customer Customer Service output Point Service input Email Service input Post Service input 😗Breaking Change
  • 181. © 2016 Pivotal Software, Inc. All rights reserved. customer Customer Service output Point Service input Email Service input Post Service input 😗Breaking Change
  • 182. © 2016 Pivotal Software, Inc. All rights reserved. customer Customer Service output Point Service input Email Service input Post Service input 😗Breaking Change
  • 183. © 2016 Pivotal Software, Inc. All rights reserved. customer Customer Service output Point Service input Email Service input Post Service input 😗Breaking Change
  • 184. © 2016 Pivotal Software, Inc. All rights reserved. customer Customer Service output 😗Breaking Change 😡 😡 😡 😨
  • 185. © 2016 Pivotal Software, Inc. All rights reserved. Consumer Driven Contracts •Consumer shares "expectation" with Producer via "Contract" (≈ DSL) •The contract violation should be detected by generated tests on the producer side.
  • 186. © 2016 Pivotal Software, Inc. All rights reserved. Consumer Driven Contracts •Consumer shares "expectation" with Producer via "Contract" (≈ DSL) •The contract violation should be detected by generated tests on the producer side. ContractConsumer Producer
  • 187. © 2016 Pivotal Software, Inc. All rights reserved. Flow of Consumer Driven Contracts Consumer Producer
  • 188. © 2016 Pivotal Software, Inc. All rights reserved. Flow of Consumer Driven Contracts Consumer Producer Contract
  • 189. © 2016 Pivotal Software, Inc. All rights reserved. Flow of Consumer Driven Contracts Consumer Producer Contract
  • 190. © 2016 Pivotal Software, Inc. All rights reserved. Flow of Consumer Driven Contracts Consumer Producer Contract Acceptance Test
  • 191. © 2016 Pivotal Software, Inc. All rights reserved. Flow of Consumer Driven Contracts Consumer Producer Contract Acceptance Test
  • 192. © 2016 Pivotal Software, Inc. All rights reserved. Flow of Consumer Driven Contracts Consumer Producer Contract Acceptance Test ✅
  • 193. © 2016 Pivotal Software, Inc. All rights reserved. Flow of Consumer Driven Contracts Consumer Producer Contract Acceptance Test Stub ✅
  • 194. © 2016 Pivotal Software, Inc. All rights reserved. Flow of Consumer Driven Contracts Consumer Producer Contract Acceptance Test Stub ✅
  • 195. © 2016 Pivotal Software, Inc. All rights reserved. Flow of Consumer Driven Contracts Consumer Producer Contract Acceptance Test Stub Unit Test ✅
  • 196. © 2016 Pivotal Software, Inc. All rights reserved. Flow of Consumer Driven Contracts Consumer Producer Contract Acceptance Test Stub Unit Test ✅✅
  • 197. © 2016 Pivotal Software, Inc. All rights reserved. Spring Cloud Contract •A CDC Solution for JVM apps (especially Spring) •Contract DSL using Groovy •Generates Acceptance test (JUnit or Spock) for producer •Generates Stub for consumer •WireMock Support for REST Test •Messaging Support (Spring Integration, Spring Cloud Stream and Apache Camel)
  • 198. © 2016 Pivotal Software, Inc. All rights reserved. Contract DSL Contract.make { label 'create-customer' input { } outputMessage { sentTo('demo-strm') headers({header('Content-Type':'...')})
 body('''{"name":"@making"}''') }} shouldCreateCustomer.groovy
  • 199. © 2016 Pivotal Software, Inc. All rights reserved. Contract DSL Contract.make { label 'create-customer' input { } outputMessage { sentTo('demo-strm') headers({header('Content-Type':'...')})
 body('''{"name":"@making"}''') }} shouldCreateCustomer.groovy Created by Consumer
  • 200. © 2016 Pivotal Software, Inc. All rights reserved. Prepare Parent Test Class @RunWith(SpringRunner.class)
 @SpringBootTest(webEnvironment = WebEnvironment.NONE) @AutoConfigureMessageVerifier
 public abstract class MsgTestBase { @Autowired CustomerService service; protected void create() { service.create("@making"); 
 } }
  • 201. © 2016 Pivotal Software, Inc. All rights reserved. Prepare Parent Test Class @RunWith(SpringRunner.class)
 @SpringBootTest(webEnvironment = WebEnvironment.NONE) @AutoConfigureMessageVerifier
 public abstract class MsgTestBase { @Autowired CustomerService service; protected void create() { service.create("@making"); 
 } } Created by Producer
  • 202. © 2016 Pivotal Software, Inc. All rights reserved. Contract DSL Contract.make { label 'create-customer' input { triggeredBy('create()') } outputMessage { sentTo('demo-strm') headers({header('Content-Type':'...')})
 body('''{"name":"@making"}''') }} shouldCreateCustomer.groovy
  • 203. © 2016 Pivotal Software, Inc. All rights reserved. Contract DSL Contract.make { label 'create-customer' input { triggeredBy('create()') } outputMessage { sentTo('demo-strm') headers({header('Content-Type':'...')})
 body('''{"name":"@making"}''') }} shouldCreateCustomer.groovy Updated by Producer
  • 204. © 2016 Pivotal Software, Inc. All rights reserved. Generated Acceptance Test public class ContractVerifierTest extends MsgTestBase { // ... @Test public void validate_shouldCreateCustomer() { create(); ContractVerifierMessage res = verifierMessaging .receive("customer");
 assertThat(res).isNotNull(); DocumentContext parsedJson = JsonPath.parse( objectMapper.writeValueAsString(res.getPayload())); assertThatJson(parsedJson).field("name") .isEqualTo("@making");
 }}
  • 205. © 2016 Pivotal Software, Inc. All rights reserved. Spring Cloud Contract Maven Plugin mvn spring-cloud-contract:generateTests mvn spring-cloud-contract:convert mvn spring-cloud-contract:generateStubs Acceptance Test WireMock stub file (only for REST) Stub jar file
  • 206. © 2016 Pivotal Software, Inc. All rights reserved. Consumer Side Test @RunWith(SpringRunner.class)
 @SpringBootTest(webEnvironment = WebEnvironment.NONE) @AutoConfigureStubRunner(ids = "com.example:customer- service", workOffline = true)
 public class PointServiceConsumerTest { @Autowired StubTrigger stubTrigger; // ... @Test public void testCreateCustomer() { stubTrigger.trigger("create-customer"); // assert that the message is received ...
 } }
  • 207. © 2016 Pivotal Software, Inc. All rights reserved. Check sample code •http://bit.ly/making_ccc_a3
  • 208. © 2016 Pivotal Software, Inc. All rights reserved. (FYI) CQRS and Event Sourcing • https://spring.io/blog/2016/11/08/cqrs-and-event-sourcing- with-jakub-pilimon • https://github.com/pilloPl/event-source-cqrs-sample
  • 209. ‹#›© 2016 Pivotal Software, Inc. All rights reserved. Data Microservices with Spring Cloud Data Flow
  • 210. © 2016 Pivotal Software, Inc. All rights reserved. Data Microservices $ cat book.txt | tr ' ' '¥ ' | tr '[:upper:]' '[:lower:]' | tr -d '[:punct:]' | grep -v '[^a-z]‘ | sort | uniq -c | sort -rn | head
  • 211. © 2016 Pivotal Software, Inc. All rights reserved. Data Microservices $ cat book.txt | tr ' ' '¥ ' | tr '[:upper:]' '[:lower:]' | tr -d '[:punct:]' | grep -v '[^a-z]‘ | sort | uniq -c | sort -rn | head
  • 212. © 2016 Pivotal Software, Inc. All rights reserved. Data Microservices $ cat book.txt | tr ' ' '¥ ' | tr '[:upper:]' '[:lower:]' | tr -d '[:punct:]' | grep -v '[^a-z]‘ | sort | uniq -c | sort -rn | head Microservice for each data processing
  • 213. © 2016 Pivotal Software, Inc. All rights reserved. Data Microservices $ cat book.txt | tr ' ' '¥ ' | tr '[:upper:]' '[:lower:]' | tr -d '[:punct:]' | grep -v '[^a-z]‘ | sort | uniq -c | sort -rn | head Microservice for each data processing
  • 214. © 2016 Pivotal Software, Inc. All rights reserved. Data Microservices $ cat book.txt | tr ' ' '¥ ' | tr '[:upper:]' '[:lower:]' | tr -d '[:punct:]' | grep -v '[^a-z]‘ | sort | uniq -c | sort -rn | head Microservice for each data processing bound with Message Brokers
  • 215. © 2016 Pivotal Software, Inc. All rights reserved. Data Microservices $ cat book.txt | tr ' ' '¥ ' | tr '[:upper:]' '[:lower:]' | tr -d '[:punct:]' | grep -v '[^a-z]‘ | sort | uniq -c | sort -rn | head Microservice for each data processing bound with Message Brokers
  • 216. © 2016 Pivotal Software, Inc. All rights reserved. Data Microservices $ cat book.txt | tr ' ' '¥ ' | tr '[:upper:]' '[:lower:]' | tr -d '[:punct:]' | grep -v '[^a-z]‘ | sort | uniq -c | sort -rn | head Microservice for each data processing bound with Message Brokers on the modern platform such as Cloud Foundry
  • 217. © 2016 Pivotal Software, Inc. All rights reserved. Data Microservices $ cat book.txt | tr ' ' '¥ ' | tr '[:upper:]' '[:lower:]' | tr -d '[:punct:]' | grep -v '[^a-z]‘ | sort | uniq -c | sort -rn | head Microservice for each data processing bound with Message Brokers on the modern platform such as Cloud Foundry
  • 218. © 2016 Pivotal Software, Inc. All rights reserved. Data Microservices $ cat book.txt | tr ' ' '¥ ' | tr '[:upper:]' '[:lower:]' | tr -d '[:punct:]' | grep -v '[^a-z]‘ | sort | uniq -c | sort -rn | head Microservice for each data processing bound with Message Brokers on the modern platform such as Cloud Foundry
  • 219. © 2016 Pivotal Software, Inc. All rights reserved. Spring Cloud Data Flow • Microservices-based Distributed Data Pipelines •Long Lived Stream Applications •Short Lived Task Applications
  • 220. © 2016 Pivotal Software, Inc. All rights reserved. Spring Cloud Data Flow • Microservices-based Distributed Data Pipelines •Long Lived Stream Applications •Short Lived Task Applications Spring Cloud Stream
  • 221. © 2016 Pivotal Software, Inc. All rights reserved. Spring Cloud Data Flow • Microservices-based Distributed Data Pipelines •Long Lived Stream Applications •Short Lived Task Applications Spring Cloud Stream Spring Cloud Task
  • 222. © 2016 Pivotal Software, Inc. All rights reserved. Spring Cloud Data Flow • Microservices-based Distributed Data Pipelines •Long Lived Stream Applications •Short Lived Task Applications Spring Cloud Stream Spring Cloud Task Orchestration Layer
  • 223. © 2016 Pivotal Software, Inc. All rights reserved. Check my slide • http://www.slideshare.net/makingx/data-microservices-with- spring-cloud-stream-task-and-data-flow-jsug-springday
  • 224. ‹#›© 2016 Pivotal Software, Inc. All rights reserved. Deploy Stream Apps to Cloud Foundry
  • 225. © 2016 Pivotal Software, Inc. All rights reserved. Cloud Foundry •https://www.cloudfoundry.org/ •Cloud Native Platform •OSS •Spring ❤ Cloud Foundry •Support Multi IaaS 
 (AWS, Azure, GCP, vSphere, OpenStack)
  • 226. © 2016 Pivotal Software, Inc. All rights reserved. Cloud Foundry everywhere Public Cloud Foundry Private Cloud Foundry Development OSS ver Pivotal Cloud Foundry on Premise on Public Cloud
  • 227. © 2016 Pivotal Software, Inc. All rights reserved. PCF Dev • https://docs.pivotal.io/pcf-dev • Cloud Foundry on your laptop • Included • Redis / RabbitMQ / MySQL • Spring Cloud Services • Install with cf dev start
  • 228. © 2016 Pivotal Software, Inc. All rights reserved. Pivotal Web Services •https://run.pivotal.io/ •Public Cloud Foundry managed by Pivotal •$0.03/GB-hr (≈ ¥2200/GB-month) •$87 of free trial credit.
  • 229. © 2016 Pivotal Software, Inc. All rights reserved. Deploy Spring Cloud Stream Apps cf push my-source my-source.jar --no-start cf bind-service my-source my-binder cf start my-source cf push my-sink my-sink.jar --no-start cf bind-service my-sink my-binder cf start my-sink # in case of PCF Dev cf create-service p-rabbitmq standard my-binder # in case of Pivotal Web Services cf create-service cloudamqp lemur my-binder
  • 230. © 2016 Pivotal Software, Inc. All rights reserved. Sample Application http://bit.ly/making_ccc_a3 Pivotal Web Services / PCF Dev Frontend Customer Service Email Service Point Service Post ServiceZipkin Server MySQL SendGrid MySQL MySQL DLQ Recovery RabbitMQ HTTP
  • 231. © 2016 Pivotal Software, Inc. All rights reserved. Tutorial https://github.com/Pivotal-Japan/spring-cloud-stream-tutorial
  • 232. © 2016 Pivotal Software, Inc. All rights reserved. Thanks!! • https://cloud.spring.io/spring-cloud-stream/ • https://cloud.spring.io/spring-cloud-dataflow/ • https://cloud.spring.io/spring-cloud-sleuth/ • http://zipkin.io/ • https://cloud.spring.io/spring-cloud-contract/ • https://projects.spring.io/spring-amqp/ • https://run.pivotal.io/