Heute werde ich weiter darüber sprechen, wie wir Microservices schreiben. Das letzte Mal lag der Schwerpunkt auf der Theorie: Es war notwendig, sich daran zu erinnern, wie der Code zuvor geschrieben wurde, um die Essenz von Architektur- und Kommunikationsanwendungen zu verstehen.
Diese Hälfte des Artikels konzentriert sich auf die Erfahrungen unseres BellSoft-Teams. Lassen Sie uns darüber sprechen, wie wir mit der Welt der Microservices interagieren: Hier geht es um die universelle Java-Laufzeit, um winzige Container und um Spring. Ich werde den Microservice in Ebenen zerlegen, ihn zu einem Bild zusammenfügen, ausführen und zeigen, was sich auf seine Geschwindigkeit auswirkt.
Erinnere dich an das Ergebnis
Wir verwenden leicht winzige Codeteile, um entfernte Systeme wie verschiedene Mikrodienste, Datenspeicher oder Nachrichtenwarteschlangen miteinander zu verbinden. Und um mit Kunden über gängige Protokolle in Kontakt zu bleiben.
@RestController
public class HelloController {
@Autowired
private WebClient webClient;
@RequestMapping(path = "/", method = RequestMethod.GET)
public CompletableFuture<String> greet(Principal principal) {
return webClient.get()
.uri("http://api/persons/{id}", principal.getName())
.accept(MediaType.APPLICATION_JSON)
.exchange()
.flatMap(response -> response.bodyToMono(Person.class))
.map(person -> "Hello, " + person.getFirstName())
.toFuture();
}
}
In diesem Beispiel wird die nach der Authentifizierung erhaltene ID verwendet, um Informationen über eine Person von einem anderen Dienst anzufordern und mit einer Begrüßung zu antworten. Es wird angenommen, dass reaktiver Code asynchron ausgeführt wird. Das ausgewählte Framework fügt zusammen mit zusätzlichen Komponenten (z. B. der Dienstregistrierung) die Erkennung von Dienstadressen, den Lastenausgleich usw. hinzu.
Die Rolle des Webservers
. — , HTTP; - . , (), , . -. - , . , , , , Undertow Spring Embedded Tomcat.
Serverless, , -. . «» - (FaaS).
JVM
JVM -, -. , , , , . - , , Mission Control.
. . .
Java (facade), API java.lang.reflect.Proxy java.lang.reflect.InvocationHandler. Dynamic Proxy, CDI-.
JIT- . , . : , , — .
JRE -. , , . , ; JVM. JVM, - ( ), . :
. — JDK 11–16 , latency, 40%, GC!
.
TLS 1.3.
JFR, .
record’ Project Loom . , State of Loom .
, , -, . -, , ( !) - ( NIO). - , . (, , ) , . Loom, , .
, , . . , .
, , . , Eclipse MicroProfile Java EE, . , API. Spring, Quarkus CDI, . — Spring Quarkus, .
, : JVM, -, , . , . , - Docker Podman.
. , . , .
: « OS Packages JRE?» OS Packages — , , JRE. , , . DevOps - YAML, - :
server:
port : 8081
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
, , Kubernetes Marathon, . , , , SaaS- .
. : ?
, :
Docker-,
,
.
— . . BellSoft Liberica JDK 107 . ( CLI- 41,5 Alpine Linux musl — Java.)
, , Liberica JDK Spring Boot. ,
gradle bootBuildImage
. « » , . , Spring Boot Actuator. thin jar AppCDS 2,5 ! .
— . ( ) . Native Image.
Native Image
Native Image 35 1/10 ! Native Image 89 .
Graal AOT Substrate VM , , , , . , : .
gradlew nativeImage
...
Native Image JDK, . «scratch»- . , . , , Native Image C.
Native Image , SSL C. distroless, « ». gcr distroless images libc 2 (base). , Alpine Linux, glibc — 17 .
Native Image, thin jar fat jar:
|
|
|
RAM |
|
thin jar unoptimized |
13 kb thin jar + 17,4 MB libs + 107 MB |
135 MB |
2,197 |
thin jar optimized |
13 kb jar + 17,4 MB libs + 107 MB + 50 MB jsa (CDS archive) |
70 MB |
1,156 |
fat jar unoptimized |
18,02 MB jar + 107 MB |
135 MB |
3,811 |
Native Image |
89,22 MB |
35 MB |
0,111 |
, ? , -, - ( ). -: , ?
…
Java- Native Image , «» JVM. , .
Native Image, - JDK, . , fallback image, . .
, . , fallback image. , , , .
, closed-world. , invokedynamic .
, Native Image , JVM. , Unsafe.
Native Image Compatibility and Optimization Guide.
, Native Image — , . . Maven Gradle Tracing Agent, JVM.
GraalVM EE, . thin jar, , , jar-, . Native Image , . , .
Native Image ?
, . : Native Image, — JVM. .
Native Image , , : Quarkus, Micronaut, Helidon. (, -), , .
2020 Java- Spring Boot Native Image. , . , GraalVM .
, : . JVM , (AppCDS), (Checkpoint/Restore), 50 .
Die verfügbaren Tools zum Erstellen von Java-Microservices sind vielfältig und werden ständig weiterentwickelt. Auch die Sprache selbst und ihre Unterstützung in der IDE entwickeln sich weiter. Auf der Ebene der virtuellen Maschinen werden derzeit Änderungen vorgenommen, die nicht nur zukünftigen Entwicklungen, sondern auch vorhandenem Code helfen.
Unter all diesen Prozessen spielt die JVM weiterhin eine zentrale Rolle bei der Erstellung von Softwarelösungen. Wenn Sie unter den großartigen Alternativen in der Java-Welt wählen, müssen Sie sich nur über die Herausforderungen und Einschränkungen im Klaren sein. Und Sie können immer die Meinung von Fachleuten einholen. Möge in diesem Jahr alles klappen, egal welche Methode zum Starten von Anwendungen Sie wählen, und weniger für alle hs_err.