Upload
fabrice-sznajderman
View
1.346
Download
2
Embed Size (px)
Citation preview
LagomReactive microservices framework
#NightClazz @Lagom12/05/16
Fabrice Sznajderman@fsznajderman
Agenda
● Core concepts
● Lagom framework
● Hands on Lagom
Who I am?
Fabrice Sznajderman ○ Java/Scala/Web developer
■ Java/Scala trainer■ Co-organizer of Scala IO 2016■ Contributor on Lagom
● BrownBagLunch.fr
Chapter 1
CoreConcepts
Agenda
● Microservices architecture
● CQRS
● Event Sourcing
Core concepts
Core concepts
MicroservicesArchitecture
Monolithic vs Microservices
Monolithic issues
● All features are concentrated in one app
● One technology used (silver bullet?)
● Complexity rising over time● new comers have difficulties to
dive into code base
Microservices-based Architecture
Reactive Microservices Architecture: Design Principles for Distributed Systems - James Boner http://www.oreilly.com/programming/free/reactive-microservices-architecture.html
Microservices-Based Architecture is a simple concept: it advocates creating a system from a collection of small, isolated services, each of which owns their data, and is independently isolated, scalable and resilient to failure. Services integrate with other services in order to form a cohesive system that’s far more flexible than the typical enterprise systems we build today.
What is a microservice?Standalone component
What is a microservice?Isolated
What is a microservice?Own its data
What is a microservice?Located microservice
What is a microservice?Communication by asynchronous message
What is a good microservice ?
Answer with 3 questions ...
Question 1Does my service do only one thing?
If you can state a microservice’s full purpose with a short sentence, your service is OK!
“This service manages users’ accounts”
Question 2Is my service autonomous?
A service should be responsible for its own behavior. It shouldn’t rely on other services to do its job.
“An autonomous service would accept the any request regardless of the status of others services.”
Question 3Does this service own its own data?
A service “owns” data if it is the sole writer and the sole reader of the database where the data lives
“Data can be accessed only throught the service interface, no directly”
Anti-pattern
● Adapted use-case?● Transactionnal● Distributed monolithic layers● “Don’t Repeat Yourself”● Shared data repository
That implies challenges
● Organisational impacts● Monitoring of services● Locating service● Test strategy● Distributed development
environment
Reading
Reactive Microservices Architecture by Jonas Boner
CQRS Core concepts
CQRS stands for
● Command● Query● Responsability● Segregation
Traditional approach
Traditional approach
● Using the same model for read and write
● Read & write have different needs○ Representation of data can
take several forms○ Update side contains
validation rules● All together rises complexity● Performance issues
Write : Normalization, consistency, transactional...
Read : Denormalization, scalability, performance...
Needs between read and write are not the same.
http://martinfowler.com/bliki/CommandQuerySeparation.html
Facts
Command : Change the state of a system but do not return a value
Queries : Return a result and do not change the observable state of the system (are free of side effects)
Principle is that we divide our model into two sharply separated categories:
http://martinfowler.com/bliki/CommandQuerySeparation.html
CQRS approach
CQRS approach
CQRS approah
● Each model are on ○ separate logicals processes○ separate hardware
● Database :○ shared ○ unique per model
● Unique model with differente interfaces
Several manners to implement
Other architecture
CQRS approah
● Not a silver bullet, every case doesn’t fit with this CQRS approach.
● Doesn’t apply CQRS on whole system, only be used on specific portions of system (bounded context - DDD)
Cautions
Next
CQRS design fits well with Event Sourcing pattern...
EventSourcing
Core concepts
Traditional approah Active record
Traditional approah Active record
Traditional approah
● Only final state is captured● Debugability & tracability not
really easy● Complexity with mapping O & R● Performance issue (update)
How we have reached this state?
Active record
Event Sourcing approach
● Don't update the current state of objects
● Save the events that lead to the current state
Different approach
Event Sourcing approach
● Complete log of every state change
● Debugability & tracability come easy
● Good performance (commit log)
and more …
Benefits
● Complete rebuild● Temporal query● Event replay
Event Sourcing approach More benefits
● Commands are going to change the state (or not)
● Each state change creates an event● Order of events must be preserved
Event Sourcing approachHow does it works?
● Command’s name describe an action to do (imperative)
● Event’s name describe an action in the past
Event Sourcing approachRemarks
Event Sourcing approachRestore state into model
Event Sourcing approachDeleting an object
Update the query side with deletion of bank account.
Event Sourcing approachSnapshot
● Several events will be created● Restore all events to reach one state
might be expensive● To avoid this, we use a snapshot
LagomFramework
Chapter 2
Agenda
● Big picture of Lagom
● Project structure
● My first microservice
Lagom framework
Big pictureof Lagom
Big picture of Lagom
First of all, … Lagom pronounce :
What is Lagom?
● Microservices framework for a
system of microservices
● Based on the Reactive principles
● A fully integrated development
environment
Which language?
● Core of framework written in
Scala
● Developments are in Java
● Scala version migth be available
soon
Main features
● Service API
● Persistence API
● Development Environment
● Production Environment
Service API
● Interface as descriptor
● Defined API of exposed services
● Synchronous request/response
● Asynchronous streaming
message
Persistence API
● Provides event-sourced
persisted entities
● CQRS Read side
● Entry point for events handlers
Development Environment
● One command to start all
services
● Hot reload of your code
● Several services provided out of
the box
● IDE Integration
Production Environment
● ConductR for production
environment
● Scaling
● Deployment
● Monitoring
Communication protocols
● Polyglot systems
● HTTP, WebSocket, JSON are
standards
● can consumed
● can be consumed
Component technologies
● Collection of technologies
● Some come from Lightbend
● Others are third-party and
open-source
Component technologies
● Java 8 (& Scala)● Immutables● SBT● Jackson● Cassandra● Play framework● Guice● Akka : Persistence, Pub/Sub,
cluster● Akka Stream : Streaming part● SLF4J & Logback
● Asynchronous & non blocking as
default
● Distributed persistence : ES /
CQRS as default
● Circuit breaker (as default)
● Productivity for developers :
Expressive service interface
Design philosophy
Project Structure
with Lagom
Activator
activator sampleProject lagom-java
● Engine provided by Lightbend
● Create project from template
● Template name for Lagom: lagom-java
● Activator must be installed apart
● Generated a new project :
Project tree
SBT build file
● Project configuration
● Describe all modules
● Describe all dependencies per module
● Host all parameters for project
○ cassandra
○ service locator
○ etc
Service declaration
● One service is composed of 2 sub-
projects
○ API
○ Implementation
● Implementation depends on API
SBT build fileorganization in ThisBuild := "sample.helloworld"
// the Scala version that will be used for cross-compiled librariesscalaVersion in ThisBuild := "2.11.7"
lazy val helloworldApi = project("helloworld-api") .settings( version := "1.0-SNAPSHOT", libraryDependencies += lagomJavadslApi )
lazy val helloworldImpl = project("helloworld-impl") .enablePlugins(LagomJava) .settings( version := "1.0-SNAPSHOT", libraryDependencies ++= Seq( lagomJavadslPersistence, lagomJavadslTestKit ) ) .settings(lagomForkedTestSettings: _*) .dependsOn(helloworldApi)
Service imported
● One service could be imported as
dependency
● Just declare it and it will start as others
Launch services
● One command to launch all Lagom’s
service : sbt runAll
● Several services are launched
○ Cassandra
○ Service locator
○ service gateway
○ All services that you declared
Launch one service
● One command to launch one Lagom’s
service : sbt project_name/run
● no more services are launched
● One service Locator must be available
apart.
Locator service
● All services register on this locator
● By default, one service locator is started
● It can be started apart
Cassandra embedded
● One instance of Cassandra is started by
default
● It can be unactivate if no persistence is
required
● It can be started apart
● Cassandra’s client can be used to
explore tables
Mapping of one Service
Write a servicewith Lagom
Demo
Here, we will see :
○ Global configuration of project
○ Service Interface - Descriptor
○ Related implementation
○ All stuffs linked with persistence (CQRS-EventSourcing)
Just an information !
● 5 days ago, the API has change !!!
ServiceCall<Id,Request, Response>
interface ServiceCall<Request, Response> {
CompletionStage<Response> invoke(Request request);
//others methods
}
Ok, now we can dive into dark side...code! ;)
Thank you!Next …
Hands on!Chapter 3