The Micro Way czyli architektura mikroserwisów Konrad Król
Zainteresowanie microserwisami
• Assess – marzec 2012
• Trial – październik 2012
• Rosnące zainteresowanie tematem mikroserwisów – styczeń 2014
By ThoughtWorks Technology Radar
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
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
Dedykowane repozytorium
• osobne repozytorium dla każdej aplikacji
• wspólne moduły w formie bibliotek
The Micro Way
Zwinne zespołyPodzielonepod kątemobszarów biznesowych
Martin Fowler, „Microservices”, 25 March 2014
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="UTF8" ?><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="UTF8" ?><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>
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/