Hoje continuarei falando sobre como escrevemos microsserviços. A última vez que a ênfase estava na teoria: era preciso lembrar como o código era escrito antes, para entender a essência da arquitetura e dos aplicativos de comunicação.
Esta metade do artigo se concentrará na experiência de nossa equipe BellSoft. Vamos falar sobre como interagimos com o mundo dos microsserviços: aqui será sobre o Java runtime universal, e sobre contêineres minúsculos, e sobre Spring. Vou decompor o microsserviço em camadas, montá-lo em uma imagem, executá-lo e mostrar o que afeta sua velocidade.
Lembre-se do resultado
Usamos facilmente pequenos pedaços de código para interconectar sistemas remotos, como diferentes microsserviços, armazenamentos de dados ou filas de mensagens. E para manter contato com clientes usando protocolos comuns.
@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();
}
}
Neste exemplo, o ID obtido após a autenticação é usado para solicitar informações sobre uma pessoa de outro serviço e responder com uma saudação. Presume-se que o código reativo seja executado de forma assíncrona. A estrutura escolhida, junto com componentes adicionais (por exemplo, o registro de serviço), adiciona descoberta de endereço de serviço, balanceamento de carga e assim por diante.
A função do servidor 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 .
As ferramentas disponíveis para construir microsserviços Java são variadas e em constante evolução. Além disso, a própria linguagem e seu suporte no IDE estão evoluindo. No nível da máquina virtual, as mudanças estão sendo feitas agora que ajudarão não apenas os desenvolvimentos futuros, mas também o código existente.
Entre todos esses processos, a JVM continua a ser central para a construção de soluções de software. Ao escolher entre as grandes alternativas no mundo Java, você só precisa ter clareza sobre os desafios e restrições. E você sempre pode pedir a opinião de profissionais. Que tudo dê certo este ano, não importa o método de inicialização de aplicativos que você escolher, e menos para todos os hs_err.