Aujourd'hui, je vais continuer à parler de la façon dont nous écrivons des microservices. La dernière fois, l'accent a été mis sur la théorie: il a fallu rappeler comment le code était écrit auparavant, pour comprendre l'essence de l'architecture et des applications de communication.
Cette moitié de l'article se concentrera sur l'expérience de notre équipe BellSoft. Parlons de la façon dont nous interagissons avec le monde des microservices: nous parlerons ici du runtime Java universel, des petits conteneurs et de Spring. Je vais décomposer le microservice en couches, l'assembler en une image, l'exécuter et montrer ce qui affecte sa vitesse.
Souviens-toi du résultat
Nous utilisons facilement de minuscules morceaux de code pour interconnecter des systèmes distants tels que différents microservices, magasins de données ou files d'attente de messages. Et pour rester en contact avec les clients en utilisant des protocoles communs.
@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();
}
}
Dans cet exemple, l'ID obtenu après l'authentification est utilisé pour demander des informations sur une personne à un autre service et répondre par un message d'accueil. Le code réactif est supposé s'exécuter de manière asynchrone. La structure choisie, ainsi que des composants supplémentaires (par exemple, le registre de service), ajoute la découverte d'adresses de service, l'équilibrage de charge, etc.
Le rôle du serveur Web
. — , 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 .
Les outils disponibles pour créer des microservices Java sont variés et en constante évolution. De plus, le langage lui-même et son support dans l'EDI évoluent. Au niveau de la machine virtuelle, des changements sont actuellement apportés qui aideront non seulement les développements futurs, mais également le code existant.
Parmi tous ces processus, la JVM reste au cœur de la création de solutions logicielles. Lorsque vous choisissez parmi les meilleures alternatives du monde Java, il vous suffit d'être clair sur les défis et les contraintes. Et vous pouvez toujours demander l'avis des professionnels. Que tout se passe bien cette année, quelle que soit la méthode de lancement des applications que vous choisissez, et moins à tous hs_err.