一、Java如何實現云原生應用?
傳統的 Java 框架(如 Spring Boot)雖然功能強大,但在云原生場景下可能顯得笨重。以下是一些更適合云原生的輕量級框架:
Quarkus(推薦)
?
- 專為云原生和 Kubernetes 設計的 Java 框架。
- 支持 GraalVM 原生鏡像,啟動速度快,內存占用低。
- 與 Kubernetes、OpenShift 等云原生平臺深度集成。
Micronaut
- 另一個輕量級框架,專注于快速啟動和低內存占用。
- 支持 GraalVM 原生鏡像。
- 提供了對微服務、函數計算和云原生環境的支持。
?
二、Java 云原生實戰
接下來,我們將從零開始,開發一個簡單的Java云原生應用,并將其打包發布到本地Docker。
環境準備
- 操作系統:Windows 11
- 開發工具:IntelliJ IDEA
- 框架:Quarkus
- 容器工具:Docker Desktop for Windows
步驟 1:創建Quarkus項目
?
- 打開IntelliJ IDEA,點擊“New Project”。
- 選擇“Quarkus”作為項目類型,點擊“Next”。
- 輸入項目名稱(例如
quarkus-demo-mvn
),選擇項目路徑,點擊“Create”。 - 在依賴選擇頁面,勾選“REST””,點擊“Finish”。
完成后可以看到目錄結構如下,除了多了個 docker 目錄其它和 springboot 是一樣的。
?
后面會具體介紹 docker 目錄下幾個文件的區別。
步驟 2:編寫代碼
- 在
src/main/java
目錄下,找到自動生成的ExampleResource.java
文件。 - 修改代碼如下:
package com.hanko;import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;@Path("/hello")
public class ExampleResource {@GET@Produces(MediaType.TEXT_PLAIN)public String hello() {return "Hello from Quarkus REST";}
}
可以看到代碼和我們以前不一樣的地方就是:
- 沒有引用 spring 相關依賴
- 注解使用的與 springboot 不一樣
- 可以看到它引用的都是 jakarta.ws.rs 的依賴也就是JAX-RS(Java API for RESTful Web Services)它是 Java 中用于開發和實現 RESTful Web 服務 的標準 API。它是 Jakarta EE(原 Java EE)的一部分,提供了一套基于注解的編程模型,使得開發者可以輕松地將 Java 類暴露為 RESTful 資源。
- quarkus 項目沒有 SpringBootApplication 注解的啟動類
步驟 3:本地運行
?
- 一般 IDEA 創建的項目在 IDEA 最上面會有 quarkus logo 點擊小三角就可以啟動項目。
- 打開瀏覽器,訪問
http://localhost:8080/
,你會看到頁面顯示“Hello, Quarkus!”。
?
- 點/hello 也就是我們代碼中實現的 rest 服務
?
p.s. quarkus 項目還有個比較優秀的功能就是默認就支持熱加載,我們修改代碼后不需要像 springboot 項目一樣手動重啟才生效。
?
修改代碼后,在瀏覽器訪問服務時,到達代碼時就會觸發熱加載,此次熱加載啟動只花了 0.429 秒。
關于啟動這塊,還有沒有其它的啟動方式呢?當然通過命令行或 maven 都是可以的,如
quarkus:dev
?
步驟 4:打包 quarkus 項目
一般打包為 quarkus 項目要分成使用本地 GraalVM 與不使用本地 GraalVM
- 使用本地GraalVM
./mvnw package -Dnative
#mvn或mvnw都可以打包,使用mvnw還需要執行mvn wrapper:wrapper安裝
這種比較麻煩的就是安裝GraalVM 與Visual Studio。
GraalVM 的 native-image
工具依賴于 Visual Studio 的 C++ 編譯器 (cl.exe
) 和相關的構建工具。
?
就是還需要安裝這些,安裝完還需要配置 include、lib 環境變量。
- 不使用本地GraalVM
Quarkus 會在 Docker 容器內完成所有操作
這種方式就簡單多了,把本地可遠程 docker 啟動后,在 idea 里配置好
?
通過命令行
./mvnw package -Dquarkus.container-image.build=true
如果你不想用命令行的話也可以選擇使用 idea 來打包,就是直接使用生命周期中的 package
?
至于-Dquarkus.container-image.build=true 這個參數就可以放到項目中的 pom.xml 中去
?
pom.xml
<properties><skipITs>true</skipITs><quarkus.native.container-build>true</quarkus.native.container-build><quarkus.native.enabled>true</quarkus.native.enabled>
</properties>
就可以直接打包好了
?
可以看到我已經打包完成,就是這個文件。看到這個 xx-runner 文件就說明已經成功了
?
?
步驟 5:生成Docker鏡像
這時就要使用項目中的幾個 dockerfile 文件
?
Dockerfile.jvm
適合傳統的 Java 應用,兼容性好,構建速度快。Dockerfile.native
適合云原生場景,啟動速度快,內存占用低。Dockerfile.native-micro
在Dockerfile.native
的基礎上進一步優化了鏡像大小和安全性,適合對容器化部署有更高要求的場景。
p.s. 這幾個文件中的配置是直接 copy target 目錄文件,所以我們要把 docker 目錄中的這幾個文件先拷貝到項目的根目錄下,如上圖。
打鏡像時,直接在文件上右鍵運行就可以了,當然你也可以修改一下配置,比如給鏡像增加個名稱
?
這就是三個 Dockerfile 配置文件對應生成的 docker 鏡像文件
?
可以看到傳統的大小為 413M,而原生的可以達到 79M,縮小 5 倍多。之前很多人抱怨 springboot 太大,打成 docker 就更大了,這回 quarkus 成為你們的福音了。
我們再來啟動 demo-native-micro 鏡像試試,點擊小三角后,展開設置界面設置個宿主機的端口
?
已經啟動了
?
訪問方式,應用正常
?
到這里就完成了。
通過這個教程,我們從零開始創建了一個簡單的Java云原生應用,并將其打包發布到本地Docker。整個過程非常簡單,但涵蓋了云原生開發的核心步驟:選擇輕量級框架、編寫代碼、容器化部署。
?
我是棧江湖,如果你喜歡此文章,不要忘記點贊+關注!
?