środa, 4 czerwca 2014

Microservices based on Spring Boot

Microservices - zorientowany na pojedyńcze zadanie. Zaletę tego podejścia docenili tacy giganci jak Google czy Amazon.
W odróżnieniu od architektury monolitycznej microservices preferują podejście małych zespołów, małych funkcjonalności wysokiej dostępności oraz skalowalności.

Jak można scharakteryzować microservices :
  - małą autonomiczną aplikację
  - zorientowaną na pojedyńcze zadanie
  - luźno połączoną z pozostałymi modułami
  - możliwie minimalną liczbę linii kodu
  - prawdopodobnie łatwiejszą do zrozumienia przez nową osobę w zespole
  - skalowaną na żądanie
  - zorientowaną na implementację przez mały zwinny zespół
  - bardzo podobne podejście do SOA z tą różnicą że mniej skomercjalizowane
  - agile , scrum oriented
  - bezbolesne wprowadzanie zmian
  - na ogół łatwiejsze wdrożenia


Wady : 
  - złożona integracja
  - potencjalny problem z rozproszonymi transakcjami (sharding)
  - testowanie integracyjne wielu odrębnych modułów
  
Zalety : 
   - rozmiar
   - zrozumienie domeny i problemu (skupienie się na potrzebach biznesu)
   - szybsze wytwarzanie (niezależne zespoły)
   - szybsze wdrożenia (rozmiar + problem + team + złożoność)
   - lepsza izolacja błędu
   - HA
   - skalowalność
   - niezależność
   - łatwiej wytwarzać czy przepisać na bardziej odpowiednią technologie.
   - idempotentność
   - wdrażanie na chmurze
   
  

Architektura monolityczna to standardowe podejście, które pewnie dobrze znasz z autopsji. Tak programuje i wytwarza większość firm i programistów.

Mamy jeden ear czy war i kilka jarów. To dobry pomysł i duże ułatwienie. Stosujemy pewnie mavena lub gradle w ten sposób zapewniając modułowość aplikacji. Spring zapewni luźne wiązania oraz DI i powstanie  całkiem solidna aplikacja. Kłopot z tym, że czasem ta aplikacja może przekroczyć swoją masę krytyczną .... znasz astronomię i fizykę. Wtedy wszystko się zapadnie i zostanie dziura tyle, że czarna.

Nowi ludzi nie chcą implementować i pracować przy takich kobyłach. Ilość miejsc w których może coś się zepsuć może być ogromna pomimo starań projektantów i programistów.

Każdy chce pracować przy małych projektach typu PoC. Z przejrzystymi regułami biznesowymi. Fajnie jest taki model zapewnić. 

SRP - single responsibility principle jako reguła w projektowaniu obiektowym może fajnie oddać idę microservices, tak jak wyżej wspomniane zasady projektowania SOA.


Architektura monolityczna to często dobre rozwiązanie. Stwarzające mniej problemów w integracji i architekturze rozwiązania niż microservices, bo poprostu wołamy metody.

Jak integrować ze sobą microservices  (tak jak SOA) :
    - REST
    - WS*
    - JMS
    - AMPQ
    - HttpInvoker
    - ESB
    - Zookeeper (rejestr)
    - OSGI (wsparcie)

 

Jak do tego się ma Spring Boot ?

Odpowiedź brzmi : - Bardzo dobrze :)

TIP : szybko stwórz projekt

Spring Boot  = start czyli konfiguracja (na przykładzie któregoś z moich projektów)



Spring Boot zapewnia :
  - szybkie prototypowanie ale też production ready

  - automatyczą konfigurację poprzez : 
           - jar
           - class
           - properties
           - etc
      Tu warto się chwilę zatrzymać to jest świetna rzecz.

 
Ok , ale o co chodzi ? - np o to, że jeśli wrzucisz do classpath np h2.jar Spring Boot sam zestawi domyślnie połączenie i pule do bazy. 
Jak dodasz snakeyaml.jar - czytasz properties yaml bez problemu.
TIP : @Conditional - podstawa działania - codzienność od Springa 4 

Dodajesz  PostgreSQL Spring Boot automatycznie zestawia dostawcę persystencji dla bazy postgreSQL.
Chce nadpisać ustawienia lub zmienić parametry - nic prostszego :  

  - dba o odpowiednie wersje jarów
    Chcesz używać JPA ale boisz się, że zapomiesz dodać jakiegoś jara lub dodasz go w złej wersji ? 
   dodajesz tylko deklaracje spring-boot-starter-data-jpa i dostajesz wsparcie dla SpringData oraz ORM.
   
  - uruchamialne jar'y (jako produkt dostajesz dwa jar'y jeden czysty bez zależności drugi z zależnościami)
  java -jar/-war /target/*.jar

 jako produkt gradle build np otrzymuje : 

  ─ libs
│   │   ├── jpakata-0.0.1-SNAPSHOT.jar
│   │   └── jpakata-0.0.1-SNAPSHOT.jar.original



 - standalone application (wbudowany kontener do wyboru tomcat/jetty)
     eliminuje potrzebę instalacji na danym serwerze super feature jeśli chodzi o microservices

 - łatwe uruchamianie aplikacji Web ze standardowego main'a

 - mertyki

    - spring-boot-starter-actuator  = metryki i monitoring
    - spring-boot-starter-remote-shell = mina compoment  - shell access 
    - jolokia
    - coda hel metrics 

 TIP : Remote-shell - Camel mina component

- brak xml

- wsparcie dla Groovy

- możliwość wdrażania w chmurze

Np dla aplikacji Spring MVC oferuje  : 
  • Inclusion of ContentNegotiatingViewResolver and BeanNameViewResolver beans.
  • Support for serving static resources, including support for WebJars (see below).
  • Automatic registration of Converter, GenericConverter, Formatter beans.
  • Support for HttpMessageConverters (see below).
  • Automatic registration of MessageCodeResolver (see below)
  • Static index.html support.
  • Custom Favicon support.

To dużo ....

Jeśli chcesz użyć swoje rozwiązanie zawsze możesz to zrobić Spring Boot pozwala Ci na to :)

Tip : Jeśli masz problemy z ustawianiem aplikacji spójrz na dodatek A dokumentacji Spring Boot (Common Application Properties )


W skład projektu wchodzi :

 Spring Boot - główna biblioteka projektu. Integruje się z innymi częściami Springa

 Spring Boot Autoconfigure - @EnableAutoConfiguration - tworzy cały context Springa
  Zawiera także pakiety do auto-konfiguracji np data, jdbc, logging, security etc
przykład
  W pakietach tych znajdziemy instrukcje budowy kontekstu oraz wstrzeliwania wymaganych zależności i korzystania z własnych lub domyślych ustawień 

Spring Boot Starters -  zbiór zależności dzięki, którym nie martwisz się o pojedyńcze biblioteki

Spring Boot CLI -  wsparcie dla języka Groovy (kompilacja i uruchamianie)

Spring Actuator - production ready features, monitoring

Spring Boot Samples - przykłady użycia


Podsumowanie : 
Spring Boot wydaje się być wprost wymarzonym rozwiązaniem przy implementacji i projektowaniu architektury microservices.

Warto go poznać dla swojej wygody. @Conditional to podstawowa adnotacja - naucz się z niej korzystać. Do zrozumienia i prawidłowej koncepcji microservices polecam przeczytać na sam początek książkę SOA Pattern.
W tej chwili czytam też Oreilly Microservices wczesne wydanie :)     

Brak komentarzy:

Prześlij komentarz