MICROSERVICES, LA
RISPOSTA CHE (FORSE)
CERCAVI!
FIRENZE
22 MARZO 2018
!
I’M THOMAS
NICE TO MEET YOU!
MICHELE
FRANZIN
@REALFUZZY
AGENDA
INTEREST IN
#MICROSERVICES
DISCLAIMER
our personal experience
ideas, comment, etc… are welcome
subject is wide, so I’d love to hear your thoughts :-)
it’s not a code talk (some source showed)
THE
MONOLITH
THE (SOMETIMES EVIL) MONOLITH
http://www.infoq.com/articles/microservices-intro
easy to develop
IDEs & development
tools support
easy to test
simple to deploy
works well for
relatively small apps
AFTER A WHILE…
http://www.qcodemag.it/wp-content/uploads/2014/09/favela.jpg
growth overloads
everything
difficult to adopt new
technologies
often stuck with the
starting choices
doesn’t scale to
long-lived application
BUAHAHAHAHA!
I AM THE
MONOLITH!
COME TO THE
WORLD TO BRING
IMMOBILISM AND
COMPLEXITY!
MONOLITH
MONOLITH
ARCHITECTURE ARCHITECTURE
MICROSERVICEIC
ARCHITECTURE
is the keyword
WHY MICROSERVICES
• suite of small services
• running in its own process
• communicating with lightweight mechanisms
• built around business capabilities
• independently automated deployable
• technology agnostic
http://blog.arungupta.me/monolithic-microservices-refactoring-javaee-applications/
EXPECTATIONS
http://www.wallpaperawesome.com/wallpapers-awesome/
relatively small
easier to understand
easier to scale
development
improve fault isolation
develop & deploy
independently
no vendor lock
improves
tuning & scaling
- additional complexity of a distributed system
- tools/IDEs are monolithic applications oriented
- testing is more difficult
- must implement the inter-service communication
- increase memory consumption
1ST WEEK
Divide et Impera
"
"
"
"
2ND WEEK
IT WAS NOT SO GOOD
THE ONLY WAY TO MAKE
SOFTWARE SECURE,
RELIABLE, AND FAST IS
TO MAKE IT SMALL.
Andrew S. Tanenbaum
#
#
#
6TH MONTH
3 days * 2 people
=
6 workdays!
⬇
%
#
OUR MICROSERVICES TECHNOLOGY/TOOLS
&
& '
? days * ? people
=
? days!
(
Simulates isolate systems(like production)
Usable in more OS
Ready to use
Easy to install and use
(
)
)
*
Simulates isolate systems(like production)
Usable in more OS
Ready to use
Easy to install and use
(
DOCKER FOR MAC/WINDOWS
Docker for Mac/Windows is an easy-to-install
desktop app for building, debugging and testing
Dockerized apps on a Mac/PC. 
+
Docker platform
Docker compose
Docker CLI
Docker Notary CLI
Simulate isolate systems
Usable in more OS
Ready to use
Easy to install and use
,
Docker platform
Docker compose
Docker CLI
Docker Notary CLI
DEMO TIME
&
DEMO FILES
•Dockerfile
•docker-compose.yml
DOCKER IMAGE
DOCKER IMAGE
DOCKER IMAGE
FROM ruby
RUN apt-get update -qq && apt-get install -y build-essential
libpq-dev nodejs
RUN mkdir /my_app
WORKDIR /my_app
File: ./my_app/Dockerfile
DOCKER IMAGE
FROM ruby
RUN apt-get update -qq && apt-get install -y build-essential
libpq-dev nodejs
RUN mkdir /my_app
WORKDIR /my_app
File: ./my_app/Dockerfile
https://hub.docker.com/
DOCKER IMAGE
FROM ruby
RUN apt-get update -qq && apt-get install -y build-
essential libpq-dev nodejs
RUN mkdir /my_app
WORKDIR /my_app
File: ./my_app/Dockerfile
DOCKER IMAGE
FROM ruby
RUN apt-get update -qq && apt-get install -y build-essential
libpq-dev nodejs
RUN mkdir /my_app
WORKDIR /my_app
File: ./my_app/Dockerfile
CONTAINER AND MICROSERVICES: A ❤ STORY
DOCKER COMPOSE
version: '3'
services:
web:
build: ./my_local_app
command: bash -c "bundle install --path=/cache && rails s -p
3000 -b '0.0.0.0'"
ports:
- "4000:3000"
volumes:
- ./my_local_app/my_rails_app:/myapp
- ./my_local_app/gem_cache:/cache
depends_on:
- db
db:
image: postgres
DOCKER COMPOSE
File: ./docker-compose.yml
version: '3'
services:
web:
build: ./my_local_app
command: bash -c "bundle install --path=/cache && rails s -p
3000 -b '0.0.0.0'"
ports:
- "4000:3000"
volumes:
- ./my_local_app/my_rails_app:/my_app
- ./my_local_app/gem_cache:/cache
depends_on:
- db
db:
image: postgres
DOCKER COMPOSE
File: ./docker-compose.yml
version: '3'
services:
web:
build: ./my_local_app
command: bash -c "bundle install --path=/cache && rails s -p
3000 -b '0.0.0.0'"
ports:
- "4000:3000"
volumes:
- ./my_local_app/my_rails_app:/my_app
- ./my_local_app/gem_cache:/cache
depends_on:
- db
db:
image: postgres
DOCKER COMPOSE
File: ./docker-compose.yml
version: '3'
services:
web:
build: ./my_local_app
command: bash -c "bundle install --path=/cache && rails s -p
3000 -b '0.0.0.0'"
ports:
- "4000:3000"
volumes:
- ./my_local_app/my_rails_app:/my_app
- ./my_local_app/gem_cache:/cache
depends_on:
- db
db:
image: postgres
DOCKER COMPOSE
File: ./docker-compose.yml
version: '3'
services:
web:
build: ./my_local_app
command: bash -c "bundle install --path=/cache && rails s -p
3000 -b '0.0.0.0'"
ports:
- "4000:3000"
volumes:
- ./my_local_app/my_rails_app:/my_app
- ./my_local_app/gem_cache:/cache
depends_on:
- db
db:
image: postgres
DOCKER COMPOSE
File: ./docker-compose.yml
version: '3'
services:
web:
build: ./my_local_app
command: bash -c "bundle install --path=/cache && rails s
-p 3000 -b '0.0.0.0'"
ports:
- "4000:3000"
volumes:
- ./my_local_app/my_rails_app:/my_app
- ./my_local_app/gem_cache:/cache
depends_on:
- db
db:
image: postgres
DOCKER COMPOSE
File: ./docker-compose.yml
version: '3'
services:
web:
build: ./my_local_app
command: bash -c "bundle install --path=/cache && rails s -p
3000 -b '0.0.0.0'"
ports:
- "4000:3000"
volumes:
- ./my_local_app/my_rails_app:/my_app
- ./my_local_app/gem_cache:/cache
depends_on:
- db
db:
image: postgres
DOCKER COMPOSE
File: ./docker-compose.yml
version: '3'
services:
web:
build: ./my_local_app
command: bash -c "bundle install --path=/cache && rails s -p
3000 -b '0.0.0.0'"
ports:
- "4000:3000"
volumes:
- ./my_local_app/my_rails_app:/my_app
- ./my_local_app/gem_cache:/cache
depends_on:
- db
db:
image: postgres
DOCKER COMPOSE
File: ./docker-compose.yml
version: '3'
services:
web:
build: ./my_local_app
command: bash -c "bundle install --path=/cache && rails s -p
3000 -b '0.0.0.0'"
ports:
- "4000:3000"
volumes:
- ./my_local_app/my_rails_app:/my_app
- ./my_local_app/gem_cache:/cache
depends_on:
- db
db:
image: postgres
DOCKER COMPOSE
File: ./docker-compose.yml
WEB DB WEB DB
& '
3 days * 2 people
=
6 workdays!
0.25 days * 2 people
=
0.5 workday!
3 days * 2 people
=
6 workdays!
CONTAINER AND MICROSERVICES: A ❤ STORY
▸ Microservices are cool, but be careful.
▸ Docker compose is very useful in develop env.
▸ How a portable and repeatable development
environment save your time, especially with
microservices architecture.
WHAT HAVE WE SEEN?
OK BUT…WHAT’S NEXT?
.
κυβερνήτης
κυβερνήτης
“helmsman of a ship”
CO-LOCATING HELPER PROCESSES
MOUNTING STORAGE SYSTEMS
DISTRIBUTING SECRETS
CHECKING APPLICATION HEALTH
REPLICATING APPLICATION INSTANCES
USING HORIZONTAL POD AUTOSCALING
NAMING AND DISCOVERING
BALANCING LOADS
ROLLING UPDATES
MONITORING RESOURCES
ACCESSING AND INGESTING LOGS
DEBUGGING APPLICATIONS
PROVIDING AUTHENTICATION AND AUTHORIZATION
HTTP://KOMPOSE.IO/
-> KOMPOSE ->
delivered is better than perfect
BUAHAHAHAHA!
I AM THE
MONOLITH!
COME TO THE
WORLD TO BRING
IMMOBILISM AND
COMPLEXITY!
~385.7Mb
compressed
• single error in csv import should not abort the whole process
• realtime data input
• expose results to thousands of potential visitors (web)
• it should work on every browser (at least 5 years)
• expose functions to 3rd party applications via API
• sell to other companies as white-label SAAS (optional)
Changes!
how do you proceed?
should I take care of what?
any potential pitfalls?
<tag cloud>
Technical choices have
non-technical outcomes
– Melvin Conway, 1968
“organizations which design systems
… are constrained to produce
designs which are copies of the
communication structures of these
organizations”.
Non-technical choices
have technical outcomes
AWARENESS
/ do practice
ask experts
0 be aware
HAPPY HACKING!
QUESTIONS ?
1 2
@realfuzzy
Michele Franzin
@rosse91
Thomas Rossetto
Thanks 4 coming!

Microservices, la risposta che (forse) cercavi!