Tech cafe Microservices

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

Transcript of Tech cafe Microservices

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ę