Slide 1

Slide 1 text

MANAGING BUSINESS PROCESSES IN MICROSERVICE ARCHITECTURE WITH SPRING ECOSYSTEM Bartłomiej Słota

Slide 2

Slide 2 text

BARTŁOMIEJ SŁOTA Consultant @ Speaker Blogger @bartekslota bartslota.blogspot.com [email protected] github.com/bslota linkedin.com/in/bslota

Slide 3

Slide 3 text

GOALS ➤ Know the motivation for BPM solutions ➤ How to bring BPM and microservices together ➤ How EventStorming can help us understand business processes ➤ Give insight into BPM from perspectives of: ➤ Business ➤ Architecture ➤ Development ➤ Tools

Slide 4

Slide 4 text

MICROSERVICES Autonomy Resilience Data Deployment Technology Scalability People

Slide 5

Slide 5 text

MICROSERVICES Autonomy Resilience Data Deployment Technology Scalability People Source: Robert C. Martin Clean Architecture

Slide 6

Slide 6 text

MICROSERVICES Autonomy Resilience Data Deployment Technology Scalability People App #1 Source: www.trunkbaseddevelopment.com App #2 Source: www.leanpub.com/git-flow/read

Slide 7

Slide 7 text

MICROSERVICES Autonomy Resilience Data Deployment Technology Scalability People App #1 App #2 App #3

Slide 8

Slide 8 text

MICROSERVICES Autonomy Resilience Data Deployment Technology Scalability People

Slide 9

Slide 9 text

MICROSERVICES Autonomy Resilience Data Deployment Technology Scalability People App #2 App #1

Slide 10

Slide 10 text

Resilience MICROSERVICES Autonomy Data Deployment Technology Scalability People BE FE QA PO

Slide 11

Slide 11 text

MICROSERVICES ARE PEOPLE

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

THE BUSINESS FLOW Source: Alberto Brandolini EventStorming

Slide 14

Slide 14 text

THE BUSINESS FLOW Based on: Alberto Brandolini EventStorming HARD TO SOLVE HARD TO DISCUSS HARD TO VISUALIZE

Slide 15

Slide 15 text

THE BUSINESS FLOW VS MICROSERVICES Source: Alberto Brandolini EventStorming App #2 App #3 App #4 App #1

Slide 16

Slide 16 text

BPM - THE BUSINESS PERSPECTIVE Process Modeler Common UI System integration Reporting Workflow Engine

Slide 17

Slide 17 text

BPM - ARCHITECTURE PERSPECTIVE

Slide 18

Slide 18 text

BPM - ARCHITECTURE PERSPECTIVE Autonomy Resilience Data Deployment Technology Scalability People

Slide 19

Slide 19 text

BPM - DEVELOPER PERSPECTIVE

Slide 20

Slide 20 text

BPM - TOOLS PERSPECTIVE

Slide 21

Slide 21 text

IS IT THAT BAD? ➤ Business first ➤ Strategy ➤ Cost ➤ Time limits ➤ Resources available ➤ Skillset ➤ … Never bite more than you can chew!

Slide 22

Slide 22 text

BUT WE WANT MICROSERVICES Source: Martin Fowler https://martinfowler.com/bliki/MicroservicePrerequisites.html RAPID PROVISIONING BASIC MONITORING RAPID APPLICATION DEPLOYMENT DEVOPS CULTURE

Slide 23

Slide 23 text

BUT WE WANT MICROSERVICES Source: Martin Fowler https://martinfowler.com/bliki/MicroservicePrerequisites.html What if we are here?

Slide 24

Slide 24 text

MONOLITH FIRST Source: Martin Fowler https://martinfowler.com/bliki/MonolithFirst.html

Slide 25

Slide 25 text

WE ALL CAN DO IT! Source: Martin Fowler https://martinfowler.com/bliki/MicroservicePrerequisites.html

Slide 26

Slide 26 text

SAMPLE PROCESS - EVENT STORMING

Slide 27

Slide 27 text

SAMPLE PROCESS

Slide 28

Slide 28 text

ASYNCHRONOUS CHOREOGRAPHY

Slide 29

Slide 29 text

ASYNCHRONOUS ORCHESTRATION

Slide 30

Slide 30 text

SAGAS

Slide 31

Slide 31 text

ARCHITECTURE

Slide 32

Slide 32 text

ARCHITECTURE

Slide 33

Slide 33 text

ARCHITECTURE

Slide 34

Slide 34 text

CONVENTION OVER CONFIGURATION @JsonSubTypes({ @JsonSubTypes.Type(name = „processInstanceCreated", value = ProcessInstanceCreated.class), @JsonSubTypes.Type(name = "processInstanceCancelled", value = ProcessInstanceCancelled.class), @JsonSubTypes.Type(name = "processInstanceCompleted", value = ProcessInstanceCompleted.class), @JsonSubTypes.Type(name = "taskCreated", value = TaskCreated.class), @JsonSubTypes.Type(name = "taskProcessingFailed", value = TaskProcessingFailed.class), @JsonSubTypes.Type(name = "taskCompleted", value = TaskCompleted.class), @JsonSubTypes.Type(name = "taskAssigned", value = TaskAssigned.class) }) public interface BPMEvent { }

Slide 35

Slide 35 text

PROCESS ORCHESTRATION public interface AccessVerificationChannels { String ACCESS_EVENTS = "accessEvents"; String ACCESS_COMMANDS = "accessCommands"; @Input(ACCESS_EVENTS) SubscribableChannel accessEvents(); @Output(ACCESS_COMMANDS) MessageChannel accessCommands(); } public interface AddressChangeProcessChannels { String ADDRESS_CHANGE_PROCESS_COMMANDS = "addressChangeProcessCommands"; String ADDRESS_CHANGE_PROCESS_EVENTS = "processEvents"; @Input(ADDRESS_CHANGE_PROCESS_COMMANDS) SubscribableChannel addressChangeProcessCommands(); @Output(ADDRESS_CHANGE_PROCESS_EVENTS) MessageChannel addressChangeProcessEvents(); } public interface AddressChannels { String ADDRESS_EVENTS = "addressEvents"; String ADDRESS_COMMANDS = "addressCommands"; @Input(ADDRESS_EVENTS) SubscribableChannel addressEvents(); @Output(ADDRESS_COMMANDS) MessageChannel addressCommands(); } public interface AMLChannels { String ADDRESS_EVENTS = "amlEvents"; String ADDRESS_COMMANDS = "amlCommands"; @Input(ADDRESS_EVENTS) SubscribableChannel amlEvents(); @Output(ADDRESS_COMMANDS) MessageChannel amlCommands(); }

Slide 36

Slide 36 text

HOW DO I KNOW THAT THE SERVICE ANSWERS TO MY PROCESS? ➤ Add the header to every message in process manager ➤ Copy the header back with the response ignoring the content @JsonCreator public ProcessMetadata(@JsonProperty("processInstanceId") String processInstanceId, @JsonProperty("parentId") String parentId, @JsonProperty("processDefinitionId") String processDefinitionId) { this.processInstanceId = processInstanceId; this.parentId = parentId; this.processDefinitionId = processDefinitionId; } class AccessVerification { private final MessageChannel accessCommands; . . . private void sendVerifyAccessCommand(ProcessMetadata metadata, String clientId, String masterPassword) { final VerifyAccess verifyAccess = new VerifyAccess(clientId, masterPassword); accessCommands.send(MessageBuilder.withPayload(verifyAccess).copyHeaders(metadata.toMap()).build()); } }

Slide 37

Slide 37 text

HOW DO I GET TASKS ASSIGNED TO A USER? KTable userTasks() { return streamsBuilder .stream(„processEvents”, Consumed.with(serdes.forA(String.class), serdes.forA(Task.class))) .groupBy((key, task) -> task.getUser(), Serialized.with(serdes.forA(User.class), serdes.forA(Task.class))) .aggregate(Tasks::empty, (TaskAggregator) (user, task, tasks) -> tasks.add(task), materializedAs(„userTasks”)); }

Slide 38

Slide 38 text

HOW DO I GET MY FANCY REPORTS?

Slide 39

Slide 39 text

HOW DO I MONITOR MY PROCESSES? ➤ Spring Cloud Sleuth ➤ Zipkin ➤ ELK ➤ Prometheus ➤ Semantic monitoring

Slide 40

Slide 40 text

PROCESS VS SERVICE OWNERSHIP PROCESS #3 PROCESS #2 PROCESS #1 BE FE QA PO ?

Slide 41

Slide 41 text

COMMON UI Source: Tom Söderlund https://bit.ly/2vJH8NJ

Slide 42

Slide 42 text

ENTERPRISE INTEGRATION PATTERNS YOU WILL USE (SUB)CONSCIOUSLY ➤ Command message ➤ Event message ➤ Message identifier ➤ Routing slip ➤ Process manager ➤ Transactional client ➤ Polling consumer ➤ Event driven consumer ➤ Idempotent receiver ➤ Message History ➤ Message Store ➤ Message Dispatcher

Slide 43

Slide 43 text

BPM - THE BUSINESS PERSPECTIVE REVISITED Process Modeler Common UI System integration Reporting Workflow Engine

Slide 44

Slide 44 text

BPM - DEVELOPER PERSPECTIVE REVISITED

Slide 45

Slide 45 text

BPM - TOOLS PERSPECTIVE REVISITED

Slide 46

Slide 46 text

BPM - ARCHITECTURE PERSPECTIVE REVISITED Autonomy Resilience Data Deployment Technology Scalability People

Slide 47

Slide 47 text

THANK YOU! @bartekslota bartslota.blogspot.com [email protected] github.com/bslota linkedin.com/in/bslota