Microsserviços: de CRUD a Imagem Nativa. Parte dois

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- .





. : ?





, :





  1. Docker-,





  2. ,





  3. .





— . . 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, . .





  1. , . , fallback image. , , , .





  2. , closed-world. , invokedynamic .





  3. , 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.








All Articles