Java云原生+quarkus

一、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項目

?

  1. 打開IntelliJ IDEA,點擊“New Project”。
  2. 選擇“Quarkus”作為項目類型,點擊“Next”。
  3. 輸入項目名稱(例如quarkus-demo-mvn),選擇項目路徑,點擊“Create”。
  4. 在依賴選擇頁面,勾選“REST””,點擊“Finish”。

完成后可以看到目錄結構如下,除了多了個 docker 目錄其它和 springboot 是一樣的。

?

后面會具體介紹 docker 目錄下幾個文件的區別。

步驟 2:編寫代碼

  1. src/main/java目錄下,找到自動生成的ExampleResource.java文件。
  2. 修改代碼如下:
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:本地運行

?

  1. 一般 IDEA 創建的項目在 IDEA 最上面會有 quarkus logo 點擊小三角就可以啟動項目。
  2. 打開瀏覽器,訪問http://localhost:8080/,你會看到頁面顯示“Hello, Quarkus!”。

?

  1. 點/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-microDockerfile.native 的基礎上進一步優化了鏡像大小和安全性,適合對容器化部署有更高要求的場景。

p.s. 這幾個文件中的配置是直接 copy target 目錄文件,所以我們要把 docker 目錄中的這幾個文件先拷貝到項目的根目錄下,如上圖。

打鏡像時,直接在文件上右鍵運行就可以了,當然你也可以修改一下配置,比如給鏡像增加個名稱

?

這就是三個 Dockerfile 配置文件對應生成的 docker 鏡像文件

?

可以看到傳統的大小為 413M,而原生的可以達到 79M,縮小 5 倍多。之前很多人抱怨 springboot 太大,打成 docker 就更大了,這回 quarkus 成為你們的福音了。

我們再來啟動 demo-native-micro 鏡像試試,點擊小三角后,展開設置界面設置個宿主機的端口

?

已經啟動了

?

訪問方式,應用正常

?

到這里就完成了。

通過這個教程,我們從零開始創建了一個簡單的Java云原生應用,并將其打包發布到本地Docker。整個過程非常簡單,但涵蓋了云原生開發的核心步驟:選擇輕量級框架、編寫代碼、容器化部署。

?

我是棧江湖,如果你喜歡此文章,不要忘記點贊+關注

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/78817.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/78817.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/78817.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言教程(二十三):C 語言強制類型轉換詳解

一、強制類型轉換的概念 強制類型轉換是指在程序中手動將一個數據類型的值轉換為另一種數據類型。在某些情況下,編譯器可能不會自動進行類型轉換,或者自動轉換的結果不符合我們的預期,這時就需要使用強制類型轉換來明確指定要進行的類型轉換。 二、強制類型轉換的語法 強制類…

Spring Boot × K8s 監控實戰-集成 Prometheus 與 Grafana

在微服務架構中&#xff0c;應用的可觀測性至關重要。Kubernetes 已成為容器化部署的標準&#xff0c;但其自身的監控能力有限&#xff0c;需要與其他工具集成才能實現詳細的運行數據采集與分析。 本文將通過 Spring Boot Kubernetes Prometheus Grafana 實戰&#xff0c;打…

phpstudy修改Apache端口號

1. 修改Listen.conf文件 本地phpstudy安裝目錄&#xff1a; 2.其他問題 ① 修改httpd.conf不起作用 ② 直接通過控制面板配置好像有延遲緩存

(done) 吳恩達版提示詞工程 6. 轉換 (翻譯,通用翻譯,語氣風格變換,文本格式轉換,拼寫檢查和語法檢查)

視頻&#xff1a;https://www.bilibili.com/video/BV1Z14y1Z7LJ/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 別人的筆記&#xff1a;https://zhuanlan.zhihu.com/p/626966526 6. 轉換任務&#xff08;Transforming&#xff0…

什么是靜態住宅ip,跨境電商為什么要用靜態住宅ip

在數字時代&#xff0c;IP地址不僅是設備聯網的“ID”&#xff0c;更是跨境電商運營中的關鍵工具。尤其對于需要長期穩定、安全操作的場景&#xff0c;靜態住宅IP逐漸成為行業首選。 一、什么是靜態住宅IP&#xff1f; 靜態住宅IP&#xff08;Static Residential IP&#xff0…

Qemu-STM32(十七):STM32F103加入AFIO控制器

概述 本文主要描述了在Qemu平臺中&#xff0c;如何添加STM32F103的AFIO控制器模擬代碼&#xff0c;AFIO是屬于GPIO引腳復用配置的功能。 參考資料 STM32F1XX TRM手冊&#xff0c;手冊編號&#xff1a;RM0008 添加步驟 1、在hw/arm/Kconfig文件中添加STM32F1XX_AFIO&#x…

QuecPython+audio:實現音頻的錄制與播放

概述 QuecPython 作為專為物聯網設計的開發框架&#xff0c;通過高度封裝的 Python 接口為嵌入式設備提供了完整的音頻處理能力。本文主要介紹如何利用 QuecPython 快速實現音頻功能的開發。 核心優勢 極簡開發&#xff1a;3行代碼完成基礎音頻錄制與播放。快速上手&#xf…

企業架構之旅(3):TOGAF ADM架構愿景的核心價值

一、引言&#xff1a;為什么架構愿景是企業架構的「導航圖」 在企業數字化轉型的浪潮中&#xff0c;TOGAF ADM&#xff08;架構開發方法&#xff09;作為公認的企業架構「方法論圣經」&#xff0c;其首個關鍵階段 —— 架構愿景&#xff08;Architecture Vision&#xff09;&a…

C++:Lambda表達式

C&#xff1a;Lambda表達式 C中lambda的基本語法1. 捕獲列表&#xff08;Capture List&#xff09;2. 示例代碼示例 1&#xff1a;簡單的lambda示例 2&#xff1a;捕獲變量示例 3&#xff1a;按引用捕獲示例 4&#xff1a;捕獲所有變量示例 5&#xff1a;作為函數參數 3. lambd…

被關在idea小黑屏里寫spark程序

一、先在idea中添加Scala插件 二、使用Maven創建新項目 1.啟動idea,選擇新建項目。之后的設置如下&#xff1a; 2.將Scala添加到全局庫中&#xff08;注意&#xff1a;Scala的版本不宜太高&#xff0c;最好是2-12.否則后面會報下面這個錯誤 E:\tool接口\SparkCore_01\src\mai…

自動化立庫/AGV物流仿真詳細步驟

以下是一種可以在預算和周期內實現自動化立庫及AGV 方案仿真分析的方法&#xff1a; 一、工具選擇 軟件工具FlexSim&#xff1a;這是一款流行的離散事件仿真軟件。它具有直觀的圖形用戶界面&#xff0c;通過簡單的拖拽操作就可以構建自動化立庫和 AGV 的模型。其內置的豐富的…

使用springboot+easyexcel實現導出excel并合并指定單元格

1&#xff1a;準備一個單元格合并策略類代碼&#xff1a; import com.alibaba.excel.metadata.Head; import com.alibaba.excel.metadata.data.WriteCellData; import com.alibaba.excel.write.handler.CellWriteHandler; import com.alibaba.excel.write.metadata.holder.Writ…

Python三大Web框架對比:Django、Flask、Tornado的異步實現方式詳解

目錄 引言 一、框架基礎概覽 1.1 Django 1.2 Flask 1.3 Tornado 二、異步編程基礎 2.1 同步 vs 異步 2.2 Python異步演進 三、框架異步實現對比 3.1 Django的異步進化 3.2 Flask的異步擴展 3.3 Tornado的異步范式 四、異步實現差異對比 4.1 實現機制對比 4.2 性…

深入理解Spring AI框架的核心概念

深入理解Spring AI框架的核心概念 前言 在當今人工智能飛速發展的時代&#xff0c;將AI技術集成到應用程序中已成為眾多開發者關注的焦點。Spring AI框架為Java開發者提供了便捷的途徑來實現這一目標。理解其核心概念對于充分發揮框架的潛力至關重要。本文將詳細探討Spring A…

LabVIEW基于VI Server的控件引用操作

本 VI 通過展示控件引用&#xff08;Control References&#xff09;的使用&#xff0c;借助 VI Server 實現對前面板對象的編程操作。 ? 詳細說明 隱式屬性節點&#xff08;Implicitly Linked Property Node&#xff09;&#xff1a;通過右鍵單擊控件&#xff08;或其控件終…

AI 邊緣計算網關十大品牌

引言 在物聯網與人工智能技術飛速發展的當下&#xff0c;數據量呈爆發式增長&#xff0c;對數據處理的實時性、準確性和安全性要求不斷提高。AI邊緣計算網關應運而生&#xff0c;它融合了人工智能、邊緣計算與物聯網技術&#xff0c;在靠近數據源或物理設備的網絡邊緣側&#…

基于深度學習的視頻目標跟蹤算法研究

標題:基于深度學習的視頻目標跟蹤算法研究 內容:1.摘要 隨著視頻數據的爆炸式增長&#xff0c;視頻目標跟蹤在智能監控、自動駕駛、人機交互等領域有著廣泛的應用需求。本文的目的是研究基于深度學習的視頻目標跟蹤算法&#xff0c;以提高跟蹤的準確性和實時性。方法上&#x…

C++代碼隨想錄刷題知識分享-----面試題鏈表相交

一、題目要求 題目&#xff1a;給定兩條單鏈表 headA、headB&#xff0c;找出它們相交的起始節點&#xff08;節點對象相同而非數值相等&#xff09;。若無交點返回 null。 限制&#xff1a;鏈表無環&#xff1b;函數返回后鏈表結構不能被破壞。 圖示兩個鏈表在節點 c1 開始相…

修改輸入框選擇框顏色

項目場景&#xff1a; 提示&#xff1a;這里簡述項目相關背景&#xff1a; 有時候需要改寫element原來輸入框/選擇框的顏色 問題描述 提示&#xff1a;這里描述項目中遇到的問題&#xff1a; 輸入框的話需要hover時邊框顏色修改&#xff0c;選擇值的時候邊框顏色修改以及選…

8.學習筆記-Maven進階(P82-P89)

&#xff08;一&#xff09;Maven-08-配置文件加載屬性 通過maven可以做版本的集中管理&#xff0c;所以能不能通過maven進行配置文件&#xff08;jdbc.properties&#xff09;的集中管理。 &#xff08;1&#xff09;resource-》jdbc.properties 可以識別$符號 因為只能…