44
The Micro Way czyli architektura mikroserwisów Konrad Król

Tech cafe Microservices

Embed Size (px)

Citation preview

The Micro Wayczyli architektura mikroserwisów

Konrad Król

Zainteresowanie microserwisami

By Google Trends

Zainteresowanie microserwisami

• Assess – marzec 2012

• Trial – październik 2012

• Rosnące zainteresowanie tematem mikroserwisów – styczeń 2014

By ThoughtWorks Technology Radar

Classic Way vs Micro Way

James Hughes, „Micro Service Architecture”

Aplikacje monolityczne

Warstwa prezentacji: specjaliści UI

Warstwa logiki: specjaliści Java

Warstwa persystencji: specjaliści DB

Martin Fowler, „Microservices”, 25 March 2014

Aplikacje monolityczne

Any organization that designs a system (defined broadly) will produce a design whose structure is a copy of the organization's communication structure.

Melvin Conway, 1967

Conway's law

Aplikacje monolityczne

Charakterystyka monolitów

• Architektura wielowarstwowa

• Wiele (100+ tysięcy) linii kodu

• Oparte o z góry określony stack technologiczny

Aplikacje monolityczne

Typowe problemy

• Zamknięcie na zmiany nieprzewidziane na etapie projektowania

• Zamknięty stack technologiczny

• Bardzo długi cykl życia

Aplikacje monolityczne

Typowe problemy

• Skalowalność

• Długi proces wprowadzania zmian

• Ryzyko związane z wdrażaniem nowej wersji

• Wydajność, wspólne wątki

Skalowalność w ujęciu monolitycznym

Skalowalność w ujęciu monolitycznym

Skalowalność pojedynczego microserwisu

Load Balancer

Wprowadzanie zmian w ujęciu monolitycznym

Wprowadzanie zmian w ujęciu monolitycznym

Wprowadzanie zmian w ujęciu monolitycznym

QACMM

The Micro Way

is approach to developing a single application as a suite of small services.Martin Fowler, „Microservices”, 25 March 2014

The Micro Way

Single responsibility

• wiele luźno powiązanych aplikacji

• każda aplikacja ma tylko jedną, konkretną funkcję

• kilkaset linii kodu

The Micro Way

Containerless

• one process – one service

• embedded container

• executable fat jar

The Micro Way

Dedykowane repozytorium

• osobne repozytorium dla każdej aplikacji

• wspólne moduły w formie bibliotek

The Micro Way

Production ready

• Monitoring

• Skalowalne komponenty

• Health check endpoints

The Micro Way

Zwinne zespołyPodzielonepod kątemobszarów biznesowych

Martin Fowler, „Microservices”, 25 March 2014

The Micro Way

The Micro Way

Wyzwania:

• Narzut na zdalną komunikację

• Przenoszenie odpowiedzialności pomiędzy systemami jest trudniejsze niż pomiędzy bibliotekami

The micro way - porady

Dobór technologii:

• Standardised – w przypadku interfejsów

• Free for all - czyli możesz poeksperymentować wewnątrz niektórych mikroserwisów

The micro way - porady

Monitoring:

• Dbaj o monitoring na produkcji

• Używaj narzędzi pozwalających na dostęp do logów z jednego miejsca (#logstash, #kibana)

The micro way - porady

Testowanie systemów produkcyjnych:

• Stwórz testową transakcję i obserwuj jak przepływa przez system

• Pomyśl w jaki sposób ją zidentyfikować (np. customowy HTTP Header)

The micro way - porady

Interfejsy publiczne vs opublikowane

• Interfejs publiczny – jego metody są publiczne dla innych elementów systemu

• Interfejs opublikowany – jest dostępny publicznie, poza ramami systemu, nie znamy jego klientów

The micro way - porady

Cascade failures

• Definiuj timeouty

• Używaj komunikacji asynchronicznej (jeśli możliwe)

1

2 3

4 5 6

The micro way - porady

Deployment – trzy żelazne zasady

• Jeden zunifikowany sposób na deployment (#fabric)

• Zawsze rób deployment tylko jednego serwisu

• Zrób deployment jak najszybciej

API microserwisów

Tolerant reader

• Klient usługi powiniennałożyć jak najmniejszeoczekiwania na strukturę odpowiedzi

• … nawet wtedy gdy dostawca usługi dostarcza schemat odpowiedzi, np. XSD

# GET /products/1

<?xml version="1.0" encoding="UTF­8" ?><product>  <name>iPhone 5s</name>  <price>2200,00 PLN</price>  <description>Very modern and elegant...</description>  <category>Telecommunication</category>  <rating>5</rating>  <opinions>101</opinions></product>

API microserwisów

Wersjonowanie

• Najlepsze rozwiązanie w przypadku „opublikowanych API”

• Bardzo zwiększa narzut na utrzymanie systemu

• Można obsługiwać tylko określoną liczbę wersji wstecz

# GET /v2/products/1

<?xml version="1.0" encoding="UTF­8" ?><product>  <name>iPhone 5s</name>  <price>2200,00 PLN</price>  <description>Very modern and elegant...</description>  <category>Telecommunication  </category>

  <categories>    <category>Telecommunication</category>    <category>Mobile phones</category>  </categories>  <rating>5</rating>  <opinions>101</opinions></product>

API microserwisów

Extension points

• Jeśli jednak chcesz walidować odpowiedzi oryginalną schemą

• Każdy schemat jest kompatybilny do przodu i do tyłu

• Dobry do przekazywania „ekstra” parametrów

<xs:complexType name="Extension"> <xs:sequence>  <xs:any minOccurs="1" maxOccurs="unbounded" processContents="lax" /> </xs:sequence></xs:complexType>

API microserwisów

Consumer driven contract

• Pokazuje które elementy API są wykorzystywane w procesach biznesowych

• Mamy bardzo szybki feedback, która zmiana może się nie udać

• #Schematron, #pact

<pattern name="Validate product"> <rule context="*//p:Product">   <assert test="p:Name">Must contain Name</assert>   <assert test="p:Price">Must contain Price</assert> </rule></pattern>

API microserwisów

Distributed transactions

• Write-of

• Retry

• Compensation

A

B C D

Dostępne frameworki

Spring Boot – czym jest?

• Automatyczna (domyślna) konfiguracja

• Convention over configuration

• Metryki

• Startery

• No XML Config

• Standalone Apps

Spring Boot - przykład

dependencies { compile("org.springframework.boot:spring-boot-starter-web")}

package hello;import org.springframework.boot.autoconfigure.EnableAutoConfiguration;import org.springframework.boot.SpringApplication;import org.springframework.context.annotation.ComponentScan;

@ComponentScan@EnableAutoConfigurationpublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); }}

package hello;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.bind.annotation.RequestMapping;@RestControllerpublic class HelloController { @RequestMapping("/") public String index() { return "Greetings from Spring Boot!"; }}

build.gradle

Application.java

HelloController.java

Spring Boot - przykład

gradle buildjava -jar java -jar build/libs/gs-rest-service-0.1.0.jarcurl localhost:8080

Co siedzi w środku?

• spring-core• spring-web• jackson• embedded-tomcat• Log4j• ...

Build & Run

Czego nie ma w środku?

• web.xml• beans.xml• ...

Spring Boot – więcej przykładów

• można ukończyć w 10-15 minut

• można zbudować maven'em lub gradl'em

• można pobrać z github'a (wersja początkowa i końcowa)

• są oparte o startery od Spring Boot

Przewodniki od spring.io

Spring Boot Starters

• Rozwijane przez community

• Obejmują większość popularnych technologii używanych ze Springiem

• Przykłady: jpa, web, test, tomcat, jetty, jdbc, batch, amqp, security...

Spring Boot starters

Production ready

spring-boot-actuator

monitoring oraz zdalny dostęp poprzez:

• jmx

• ssh

endpointy:

• /info

• /health

• /beans

• /env

• /dump

• /metrics

• /trace

• /autoconfigurationreport

• /shutdown

Spring Boot vs Spring Roo

find . ­type f | xargs cat | wc ­l

find . ­type f | wc ­l

Spring Roo

• 1130 linii kodu

• 26 plików

Spring Boot

• 87 linii kodu

• 4 pliki

Źródła

• Martin Fowler, „Microservices”, March 2014, http://martinfowler.com/articles/microservices.html

• Ian Robinson, „Consumer-Driven Contracts: A Service Evolution Pattern”, 12 June 2006 http://martinfowler.com/articles/consumerDrivenContracts.html

• Martin Fowler, „Tolerant Reader”, 9 May 2011, http://martinfowler.com/bliki/TolerantReader.html

• Martin Fowler, „Public versus Published Interfaces”, March/April 2002

• Sam Newman, „GeeCON 2014: Sam Newman - The Practical Implications Of Microservices”

• Sam Newman, „GeeCON 2014: Sam Newman - Deploying And Testing Microservices”

• Marco Vermeulen, „Building Microservices using Spring Boot and Friends”, Greach 2014

• James Hughes, „Micro Service Architecture”, http://yobriefca.se/blog/2013/04/28/micro-service-architecture

• „Schematron”, http://www.schematron.com/

• „Pact”, https://github.com/realestate-com-au/pact

• „Spring Boot” - http://projects.spring.io/spring-boot/

• „Fabric” - https://github.com/fabric/fabric

• „Logstash” - http://logstash.net/

• „Kibana” - http://www.elasticsearch.org/guide/en/kibana/current/

Dziękujemy za uwagę