Microservicios: de CRUD a Imagen Nativa. La segunda parte

Hoy seguiré hablando sobre cómo escribimos microservicios. La última vez se hizo hincapié en la teoría: era necesario recordar cómo se escribía el código antes, para comprender la esencia de la arquitectura y las aplicaciones de comunicación. 





Esta mitad del artículo se centrará en la experiencia de nuestro equipo de BellSoft. Hablemos de cómo interactuamos con el mundo de los microservicios: aquí hablaremos sobre el tiempo de ejecución universal de Java, sobre los contenedores diminutos y sobre Spring. Descompondré el microservicio en capas, lo ensamblaré en una imagen, lo ejecutaré y mostraré qué afecta su velocidad.





Recuerda el resultado

Utilizamos fácilmente pequeños fragmentos de código para interconectar sistemas remotos, como diferentes microservicios, almacenes de datos o colas de mensajes. Y mantenerse en contacto con los clientes mediante protocolos comunes.





@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();
   }

}
      
      



En este ejemplo, la identificación obtenida después de la autenticación se utiliza para solicitar información sobre una persona de otro servicio y responder con un saludo. Se supone que el código reactivo se ejecuta de forma asincrónica. El marco elegido, junto con componentes adicionales (por ejemplo, el registro de servicios), agrega detección de direcciones de servicio, equilibrio de carga, etc.





El rol del 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





Las herramientas disponibles para crear microservicios Java son variadas y están en constante evolución. Además, el lenguaje en sí y su soporte en el IDE están evolucionando. A nivel de máquina virtual, se están realizando cambios en este momento que ayudarán no solo a los desarrollos futuros, sino también al código existente.





Entre todos estos procesos, la JVM sigue siendo fundamental para crear soluciones de software. Al elegir entre las grandes alternativas en el mundo de Java, solo necesita tener claros los desafíos y las limitaciones. Y siempre puedes pedir la opinión de profesionales. Que todo salga bien este año, sin importar el método de lanzamiento de aplicaciones que elija, y menos para todos hs_err.








All Articles