Layanan mikro: dari CRUD ke Gambar Asli. Bagian kedua

Hari ini saya akan terus berbicara tentang cara kami menulis layanan mikro. The terakhir kali penekanannya adalah pada teori: itu perlu untuk mengingat bagaimana kode ditulis sebelumnya, untuk memahami esensi dari arsitektur dan komunikasi aplikasi. 





Setengah dari artikel ini akan berfokus pada pengalaman tim BellSoft kami. Mari kita bicara tentang bagaimana kita berinteraksi dengan dunia layanan mikro: di sini akan tentang runtime Java universal, dan tentang wadah kecil, dan tentang Spring. Saya akan menguraikan layanan mikro menjadi beberapa lapisan, merakitnya menjadi gambar, menjalankannya dan menunjukkan apa yang memengaruhi kecepatannya.





Ingat hasilnya

Kami dengan mudah menggunakan potongan kecil kode untuk menghubungkan sistem jarak jauh seperti layanan mikro yang berbeda, penyimpanan data, atau antrian pesan. Dan untuk tetap berhubungan dengan klien menggunakan protokol umum.





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

}
      
      



Dalam contoh ini, ID yang diperoleh setelah otentikasi digunakan untuk meminta informasi tentang seseorang dari layanan lain dan merespons dengan salam. Kode reaktif diasumsikan berjalan secara asynchronous. Framework yang dipilih, bersama dengan komponen tambahan (misalnya, registry layanan), menambahkan penemuan alamat layanan, load balancing, dan sebagainya.





Peran server 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





Alat yang tersedia untuk membangun layanan mikro Java bervariasi dan terus berkembang. Selain itu, bahasa itu sendiri dan dukungannya di IDE sedang berkembang. Di tingkat mesin virtual, perubahan sedang dilakukan sekarang yang tidak hanya akan membantu perkembangan di masa mendatang, tetapi juga kode yang ada.





Di antara semua proses ini, JVM terus menjadi pusat solusi perangkat lunak bangunan. Saat memilih di antara alternatif-alternatif hebat di dunia Java, Anda hanya perlu jelas tentang tantangan dan kendala. Dan Anda selalu bisa menanyakan pendapat para profesional. Semoga semuanya berhasil tahun ini, apa pun metode peluncuran aplikasi yang Anda pilih, dan kurangi semua hs_err.








All Articles