今日は、マイクロサービスの作成方法について引き続き説明します。前回重点は理論上だった:コードが前に書かれたかを思い出すためにアーキテクチャと通信アプリケーションの本質を理解する必要がありました。
記事のこの半分では、BellSoftチームの経験に焦点を当てます。マイクロサービスの世界とどのように相互作用するかについて話しましょう。ここでは、ユニバーサルJavaランタイム、小さなコンテナー、およびSpringについて説明します。マイクロサービスをレイヤーに分解し、イメージにアセンブルして実行し、速度に影響するものを示します。
結果を覚えておいてください
小さなコードを簡単に使用して、さまざまなマイクロサービス、データストア、メッセージキューなどのリモートシステムを相互接続します。そして、一般的なプロトコルを使用してクライアントと連絡を取り合うため。
@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();
}
}
この例では、認証後に取得したIDを使用して、別のサービスに個人に関する情報を要求し、挨拶で応答します。リアクティブコードは非同期で実行されると想定されています。選択したフレームワークは、追加のコンポーネント(たとえば、サービスレジストリ)とともに、サービスアドレスの検出、負荷分散などを追加します。
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 .
Javaマイクロサービスを構築するために利用できるツールは多様であり、絶えず進化しています。また、言語自体とIDEでのサポートも進化しています。仮想マシンレベルでは、将来の開発だけでなく既存のコードにも役立つ変更が現在行われています。
これらすべてのプロセスの中で、JVMは引き続きソフトウェアソリューションの構築の中心です。Javaの世界で優れた選択肢の中から選択するときは、課題と制約について明確にする必要があります。そして、あなたはいつでも専門家の意見を聞くことができます。選択したアプリケーションの起動方法に関係なく、今年はすべてがうまくいくようになります。すべてのhs_errには当てはまりません。