Vom Monolithen zu Micro Services

HAW Hamburg

Jens Hinrichs

Head of Web Development @ "Wer liefert was"

jensblond

jensblond

Die führende B2B Marktplatz im deutschsprachigen Raum 

  • Lieferanten suchen & finden

Wer liefert was? GmbH

  • Produkte suchen & finden
  • Firmen registrieren
  • Produkte anlegen und pflegen
  • uvm…

Kein Startup mehr (gegründet 1932)

…aber Startup Feeling!

Wer liefert was? GmbH

Wer liefert was? GmbH

Wer liefert was? GmbH

Das wlw Universum

Das wlw Universum

  • Ruby on Rails (1 App)
  • CouchDB
  • ElasticSearch (2 Nodes loadbalanced)
  • SAP

2014

Das wlw Universum

Das wlw Universum

  • Ruby on Rails (18 Apps, …and counting)
  • PostgreSQL
  • ElasticSearch (5 Cluster Nodes)
  • RabbitMQ
  • Varnish
  • Redis
  • SAP
  • golang

2016

Das wlw Universum

Der Monolith

Der Monolith

Factsheet

  • Ruby on Rails 3
  • nächtlicher Import der SAP Daten
  • CounchDB nur als "Cache" genutzt
  • ElasticSearch Index jede Nacht neu indiziert
  • Firmen konnten nur über SAP gepflegt werden
  • Kein Continues Delivery
  • Tests dauern sehr lange
  • Aufwändiges Aufsetzen der Entwicklungsumgebung

Der Monolith

    1565 text files.
    1530 unique files.
    1053 files ignored.

http://cloc.sourceforge.net v 1.62  T=6.34 s (154.0 files/s, 25594.7 lines/s)
--------------------------------------------------------------------------------
Language                      files          blank        comment           code
--------------------------------------------------------------------------------
YAML                            138            315            399          71007
Ruby                            647           8083           3254          42017
Javascript                       78           3834           2300          15292
SASS                             56            952            157           5214
HTML                              5           1916              0           3097
Bourne Shell                     10            139            517           1028
SQL                              23             58             69            775
CSS                               1             80             70            649
XML                               3             25             84            297
CoffeeScript                      9             32              3            150
Tcl/Tk                            2             37             92            126
RobotFramework                    1              0              0             75
Bourne Again Shell                2             13              1             36
Perl                              1              2              0              7
--------------------------------------------------------------------------------
SUM:                            976          15486           6946         139770
--------------------------------------------------------------------------------

Die Micro Services

Vorteile Micro Services

  • Skalierbarer
  • Testbarer
  • Teams können unabhängig voneinander entwickeln
  • Stabilere Gesamtarchitektur
  • Klare Zuständigkeiten
  • Verschiedene Systeme können nebeneinander laufen
  • Continues Delivery wird einfacher
  • Neue Features können entwickelt werden ohne legacy Code anzufassen
  • Perfekt für Agile Entwicklung

Die Micro Services

Wo fange ich an?

Einzelne Funktionalitäten sollten rausgelöst werden oder neue Features in eigenen Apps entwickelt werden

Die Micro Services

In unserem Fall

Die Firmenregistrierung

  • Team
    • 2 Ruby Dev
    • 1 PO
    • 2 SAP DEV
    • 1 QA
  • Ruby on Rails 4
  • Angular.js
  • Bootstrap
  • REST API in SAP
  • REST API in dem Monolithen

Die Micro Services

Der erste Schritt war getan

Was waren die nächsten Schritte?

Die nächsten Schritte

Einführung Message Queue (RabbitMQ)

Die nächsten Schritte

Einführung Message Queue (RabbitMQ)

In der Vergangenheit wurden die Änderungen an einer Firma nur einmal in der Nacht an das Web übertragen.

Damit SAP seine Änderungen in Echtzeit in das Web publizieren kann, haben wir uns für das AMQP entschieden.

Da SAP aber nicht nativ über einen AMQP Adapter verfügt, haben wir das Problem mit einem AMQP Proxy gelöst, der über ein REST API Messages erzeugt.

Die nächsten Schritte

Einführung Message Queue (RabbitMQ)

REST APIs

API Manifest

REST APIs

API Manifest

Die Entwicklungsteams sollten sich vorab über ein einheitliches API Design abstimmen. Dabei hilft ein Manifest oder ein Design Guide.

 

Wir haben uns an der API Referenz von heroku orientiert

REST APIs

Libraries

  • Vereinheitlichung REST Calls
  • Fehlerbehandlung
  • HTTP Calls

Deployment

Das Release

Deployment

Wichtige Punkte

  • Hohe Abstimmung beim Release
  • Ohne Release Notes geht es nicht
  • Immer eine Reihenfolge festlegen
  • Release Standup
  • Rollbackstrategie?
  • Rollback sollte getestet werden
  • Abwärtskompatibilität muss gegeben sein
  • Migrationen müssen failsafe sein

Deployment

Nächste Schritte

  • Continuous Delivery
  • Container
  • Pipelines

Testing

Testing

Wie testet man Micro Services?

Testing

Wie testet man Micro Services?

Problem:

Bei der Entwicklung von Features die mehrere Services beinhalten muss der finale Integrationstest manuell ausgeführt werden.

 

Lösungsansatz:

Die Testabdeckung der API erfolgt bei uns durch Contract-Test

 

Jedes Team kann für APIs, die sie konsumieren Tests in den jeweiligen Codebasen erstellen.

Performance

Performance

Problem:

REST API Anfragen sind von Natur aus langsamer als Datenbank Zugriffe. Wie kann man am Besten mit den Performance Verlusten umgehen?

 

Lösung:

Einsatz von Caches. Wir verwenden teilweise Varnish als Cache Technologie. 

Suchindices verwenden (z.B. ElasticSearch)

Performance

Problem:

Die REST API Zugriffe wurden seriell abgearbeitet

 

Lösung:

Bulk Requests und Asynchrone Requests implementieren

Performance

Problem:

Resourcen auf den Servern werden nicht optimal genutzt

 

Lösung:

Docker, Mesos und Co.

Authentifizierung

Authentifizierung

JWT

JSON Web Tokens sind ein offener Industrie Standard.

Sie eignen sich perfekt für eine Micro Services Umgebung.

 

Mit JWT lassen sich Informationen sicher über mehrere Systeme transportieren. Implementationen gibt es für sehr viele Programmiersprachen. Die Informationen werden sicher mit einem Token signiert.

Status Quo

Status Quo

    1647 text files.
    1634 unique files.
     916 files ignored.

http://cloc.sourceforge.net v 1.62  T=6.21 s (193.5 files/s, 16393.8 lines/s)
--------------------------------------------------------------------------------
Language                      files          blank        comment           code
--------------------------------------------------------------------------------
Ruby                            892           9719           1969          45585
Javascript                       97           3883           2452          14451
YAML                            129            367            545           6153
SASS                             56           1032            242           5304
HTML                              4           1903              1           3014
SQL                               1            915            825           1391
CSS                               1             80             70            649
Bourne Shell                      7             54            248            404
Bourne Again Shell                4             69             16            255
RobotFramework                    2              0              0             95
CoffeeScript                      5              8              3             47
XML                               3              0              0             28
--------------------------------------------------------------------------------
SUM:                           1201          18030           6371          77376
--------------------------------------------------------------------------------

Status Quo

Nachteile

Nachteile

Komplexität

Abhängigkeiten

Performance

Daten Konsitenz

Fragen?

Vom Monolithen zu Microservices

By Jens Hinrichs

Vom Monolithen zu Microservices

Unser Weg vom Monolithen zu einer Microservice Architektur

  • 2,001