Das Wort "Microservices" gibt es seit einigen Jahren. Die Technologie entwickelt sich aktiv weiter, die Leute sprechen auf Online-Konferenzen darüber und wir schreiben sie jeden Tag selbst. Es war einmal ein neuer Ansatz, der bereits zur Routine geworden ist. Als Java-Architekt interessiert mich jedoch, wie der Code zuvor war, wie er sich geändert hat, welche Ausführungsmethoden jetzt beliebt sind und im Jahr 2021 verwendet werden: Asynchronität, Container, FaaS.
So entstand dieser Beitrag in zwei Teilen, die ich basierend auf meinen Artikeln im BellSoft-Blog und am Runden Tisch Joker 2020, in denen wir über die Zukunft von Java diskutierten, für Habr vorbereitet habe . Die tatsächliche Verbesserung des Ökosystems für Backends kann heute nicht existieren, ohne zu verstehen, wie Microservices erstellt werden: Von Grund auf neu schreiben oder mit einem Skalpell aus Monolithen herausschneiden? Ich schlage im ersten Teil vor, über ihre Essenz zu sprechen, und im zweiten Teil, den Microservice-Container in Schichten zu zerlegen und den Beitrag jeder Schicht zu betrachten.
Der Hauptvorteil liegt in der Struktur
Die überwiegende Mehrheit der Materialien zur Microservice-Architektur vergleicht sie strukturell mit Monolithen. Wie die Komponenten als Ganzes oder isoliert arbeiten. Microservices sind unabhängig voneinander und können Daten über das Netzwerk über beliebige Protokolle wie die REST-API austauschen. Was gibt es uns? Zumindest die Freiheit, Tools auszuwählen, ohne auf den ESB, die Schemaeinschränkungen und die Feinheiten der Kompatibilität zu achten. Virtualisierung und Containerisierung entwickeln sich ebenfalls weiter, und jetzt können Sie mit winzigen Containern mit Alpine Linux viele Komponenten gleichzeitig auf zuvor dedizierter Hardware ausführen.
Nehmen wir einen einfachen Service wie das Buchen eines Tickets oder das Aufladen eines Kontos. Bereits vor dem Aufkommen von Microservices wurde der CRUD-Ansatz verwendet, um den Lebenszyklus eines Datenobjekts in solchen Systemen zu verwalten. Alle Funktionen, die CRUD-Operationen für eine Entität bereitstellen, können jedoch leicht isoliert werden. Dann können Sie Skalierung, Zugriffskontrolle und Interaktion im Allgemeinen separat behandeln, beispielsweise über REST.
Alles scheint in Ordnung zu sein, was ist der Haken?
Probleme und Lösungen
Verschiedene Teile einer monolithischen Anwendung werden im gemeinsam genutzten Speicher ausgeführt, und alle Anforderungen werden an denselben physischen Server gesendet. Microservices kommunizieren über Protokolle miteinander, und dies führt zum Beispiel zu:
Schwierigkeiten bei der Verwaltung des Netzwerkverkehrs und der Latenz;
Fehler bei Anfragen und andere Fehler;
die Notwendigkeit, Daten zu serialisieren und Verbindungen zu verschlüsseln.
, API Kafka/Redis/RabbitMQ , . Kafka DevOps.
, , . . , , — . - .
:
(Kafka, Kinesis);
, service mesh (Istio, OSM);
.
— :
, , :
, . streaming platform (, Kafka) , .
, . , . , , .
Service mesh («c ») . , , Sidecar.
, JVM, , .
. , , Docker- .
-, , . , .
- . . , — SOA.
. . , — . , , REST.
Java? , . Java EE 20 . : , XML javadoc ; ; Java 5. . Java EE.
, Java EE (, JNDI), , , . Web 1.0 Web 2.0, . .
Container dependency injection
« ». , . « » — . . , : trailing lambdas Kotlin Ktor; data- , Java 14 record- ( Lombok).
. , /. , , , , . IDE, , . — .
Contexts and Dependency Injection (CDI). CDI Java EE JSR 299/365 Weld, WildFly. — (Inversion of Control, IoC).
: , , ( Spring Data) HTML. . — , . , Convention over Configuration ( « »), IoC- , BeanFactory Spring. .
Wie ich in der Einleitung versprochen habe, ist dieser Beitrag zu einem kleinen Ausflug in die Geschichte der Microservice-Architektur geworden - schließlich nirgendwo ohne. Wir arbeiten mit großartiger Technologie, die über 20 Jahre alt ist und sich dennoch modern anfühlt. Dies liegt daran, dass die Methoden gefragt und lebendig sind und sich nicht in Vermächtnis verwandeln.
Im zweiten Teil werde ich die Schichten des Microservice-Containers im Detail analysieren, erklären, wie sich die richtige Auswahl der Laufzeit auswirkt, und Ihnen erklären, wie Sie den Ressourcenverbrauch auf ein Minimum reduzieren können.