Linux中國

Java 無伺服器函數入門

Quarkus 令你可以使用類似 Java 的技術開發無伺服器的工作負載。

無伺服器 Java 的研究始於函數 —— 就是按需求運行的一小段代碼。這一階段並沒有持續很長時間。雖然在 1.0 階段,基於虛擬機架構的函數使這種範式變得很流行,但它仍然有局限性,例如執行時間、協議和糟糕的本地開發體驗,都不太理想,如下圖所示。

開發者隨後意識到,可以把同樣的無伺服器特性應用於微服務和 Linux 容器,帶來的好處也是一樣的。由此進入 1.5 階段,在這個階段,一些無伺服器容器完全抽象化了 Kubernetes,通過 Knative 或其它位於它之上的抽象層來提供無伺服器的體驗。

在 2.0 階段,無伺服器開始處理更複雜的編排和集成模式,並結合某些層級的狀態管理。更重要的是,開發者關注的是能否在舊的系統中使用熟悉的 Java 應用程序運行時來組合運行無伺服器和非無伺服器的工作負載。

The serverless Java journey

Java 開發者開始進行無伺服器函數開發之前,第一步是要選擇一種新的雲原生 Java 框架,從而能夠以快於傳統單體應用程序的速度和較小的內存佔用運行 Java 函數。這在各種基礎設施環境中,包括物理伺服器、虛擬機、多雲或混合雲環境中的容器,都是適用的。

開發者也有可能固執地選擇 Spring 框架中的 Spring 雲函數 來進行命令式和反應式函數的開發。Spring 也支持將 Java 函數部署到可安裝的無伺服器平台,比如 KubelessApache OpenWhiskFissionProject Riff。然而,人們擔心 Spring 的啟動慢、響應時間長以及內存佔用大的問題。在諸如 Kubernetes 這種可擴展的容器環境中運行 Java 函數,這些問題可能會更嚴重。

Quarkus 是一個新推出的開源雲原生 Java 框架,它有助於解決這些問題。它的作用是設計無伺服器應用程序,以及編寫運行於雲基礎設施(例如 Kubernetes)的雲原生微服務。

Quarkus 重新審視了 Java,它使用了封閉的方法構建和運行 Java 程序。它把 Java 轉變為一種可與 Go 相媲美的運行時。Quarkus 也包含 100 多種擴展功能,集成了企業級能力,例如資料庫訪問、無伺服器集成、消息、安全、可觀察性和業務自動化。

這裡有一個簡單例子,展現如何使用 Quarkus 創建一個 Java 無伺服器項目的框架。

1、基於 Maven 創建一個 Quarkus 無伺服器項目

安裝一個本地 Kubernetes 集群,開發者有多種選擇,包括 MinikubeOKD。因為使用 OKD 在 Knative 和 DevOps 工具上安裝無伺服器相關功能較方便,本文使用 OKD 安裝集群。這些關於 OKD 安裝Knative 操作員安裝 的相關指南中提供了更多的設置資料。

下面的命令創建了一個 Quarkus 項目(例如 quarkus-serverless-restapi),對外暴露一個簡單的 REST API,並下載 quarkus-openshift 擴展,用於 Knative 服務的部署:

$ mvn io.quarkus:quarkus-maven-plugin:1.13.4.Final:create 
       -DprojectGroupId=org.acme 
       -DprojectArtifactId=quarkus-serverless-restapi 
       -Dextensions="openshift" 
       -DclassName="org.acme.getting.started.GreetingResource"

2、在本地運行無伺服器功能

使用 Quarkus 開發模式運行程序,檢查 REST API 是否有效,稍稍調整一下代碼:

$ ./mvnw quarkus:dev

輸出如下內容:

__  ____  __  _____   ___  __ ____  ______ 
 --/ __ / / / / _ | / _ / //_/ / / / __/ 
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /    
--________/_/ |_/_/|_/_/|_|____/___/   
INFO  [io.quarkus] (Quarkus Main Thread) quarkus-serverless-restapi 1.0.0-SNAPSHOT on JVM (powered by Quarkus xx.xx.xx.) started in 2.386s. Listening on: http://localhost:8080
INFO  [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.
INFO  [io.quarkus] (Quarkus Main Thread) Installed features: [cdi, kubernetes, resteasy]

注意: 保持 Quarkus 應用程序運行,需要使用 熱部署 Live Coding 。這樣,當代碼修改後,你就不必重新構建、重新部署以及重啟運行時。

現在,你可以使用一個 curl 命令快速訪問 REST API。輸出結果應當是 Hello RESTEasy:

$ curl localhost:8080/hello
Hello RESTEasy

GreetingResource.java 中修改返回值:

public String hello() {
        return "Quarkus Function on Kubernetes";
    }

再次訪問 REST API,輸出信息也會相應更新:

$ curl localhost:8080/hello
Quarkus Function on Kubernetes

普通的微服務跟無伺服器函數之間的差別並不大。使用 Quarkus 的好處在於:開發者可以使用任何微服務,將 Kubernetes 部署為無伺服器函數。

3、在 Knative 服務中部署相關的函數

如果你還沒有創建命名空間,就在你的 OKD 集群上 創建命名空間(例如 quarkus-serverless-restapi),用來部署 Java 無伺服器函數。

Quarkus 令開發者可以通過在 src/main/resources/application.properties 中添加以下變數,創建 Knative 和 Kubernetes 資源:

quarkus.container-image.group=quarkus-serverless-restapi <1>
quarkus.container-image.registry=image-registry.openshift-image-registry.svc:5000 <2>
quarkus.kubernetes-client.trust-certs=true <3>
quarkus.kubernetes.deployment-target=knative <4>
quarkus.kubernetes.deploy=true <5>
quarkus.openshift.build-strategy=docker <6>

說明:

  • <1> 在你部署無伺服器應用程序的位置定義項目名
  • <2> 使用容器註冊中心
  • <3> 在這個簡單例子中,使用自簽名證書,以便通過相關信任機制
  • <4> 允許創建 Knative 資源
  • <5> 指示在構建容器映像之後將擴展部署到 OpenShift
  • <6> 設置 Docker 構建策略

執行以下命令,構建應用程序,並直接部署到 OKD 集群:

$ ./mvnw clean package -DskipTests

注意: 應該提前使用 oc login 命令,確保登錄到正確的項目(例如quarkus-serverless-restapi)。

輸出結果應該以 BUILD SUCCESS 結束。

在對於 Knative 服務執行的 oc 命令中,加上標籤:

$ oc label rev/quarkus-serverless-restapi-00001 
app.openshift.io/runtime=quarkus --overwrite

然後訪問 OKD 網頁控制台,就能進入 開發人員透視圖中的拓撲視圖。你可能會看到你的 容器莢 Pod (無伺服器函數)已經縮小為零(白線圈)。

Topology view

4、在 Kubernetes 環境下測試函數

運行如下 oc 命令,搜索含有無伺服器函數的路由:

$ oc get rt/quarkus-serverless-restapi
[...]
NAME                      URL                             READY   REASON
quarkus-serverless[...]   http://quarkus[...].SUBDOMAIN   True

使用 curl 命令訪問搜索到的路由:

$ curl http://quarkus-serverless-restapi-quarkus-serverless-restapi.SUBDOMAIN/hello

過幾秒鐘,你可以得到跟在本地相同的結果:

Quarkus Function on Kubernetes

當你回到 OKD 集群內的拓撲圖,Knative 服務會自動擴展。

Scaling the Knative Function

由於 Knative 服務的默認設置,其 pod 在 30 秒後會再次下降至零。

下一步呢?

無伺服器不斷地在演變,始於運行於虛擬機的函數,到後來的無伺服器容器,並與企業原有系統集成。在此過程中,企業開發者藉助 Quarkus,仍然可以使用自己熟悉的技術(比如 Java)創建一個項目,然後構建並部署到 Kubernetes。

本系列的下一篇文章將指導你優化 Kubernetes 中的 Java 無伺服器函數,從而令程序啟動更快,內存佔用更小。

文內圖像來自:Daniel Oh, CC BY-SA 4.0

via: https://opensource.com/article/21/6/java-serverless-functions

作者:Daniel Oh 選題:lkxed 譯者:cool-summer-021 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    這個站點使用 Akismet 來減少垃圾評論。了解你的評論數據如何被處理

    More in:Linux中國

    Linux中國

    捐贈 Let&apos;s Encrypt,共建安全的互聯網

    隨著 Mozilla、蘋果和谷歌對沃通和 StartCom 這兩家 CA 公司處罰落定,很多使用這兩家 CA 所簽發證書的網站紛紛尋求新的證書籤發商。有一個非盈利組織可以為大家提供了免費、可靠和安全的 SSL 證書服務,這就是 Let's Encrypt 項目。現在,它需要您的幫助
    Linux中國

    關於Linux防火牆iptables的面試問答

    Nishita Agarwal是Tecmint的用戶,她將分享關於她剛剛經歷的一家公司(印度的一家私人公司Pune)的面試經驗。在面試中她被問及許多不同的問題,但她是iptables方面的專家,因此她想分享這些關於iptables的問題和相應的答案給那些以後可能會進行相關面試的人。 所有的問題和相應的答案都基於Nishita Agarwal的記憶並經過了重寫。 嗨,朋友!我叫Nishita Agarwal。我已經取得了理學學士學位,我的專業集中在UNIX和它的變種(BSD,Linux)。它們一直深深的吸引著我。我在存儲方面有1年多的經驗。我正在尋求職業上的變化,並將供職於印度的P
    Linux中國

    Lets Encrypt 已被所有主流瀏覽器所信任

    旨在讓每個網站都能使用 HTTPS 加密的非贏利組織 Lets Encrypt 已經得了 IdenTrust的交叉簽名,這意味著其證書現在已經可以被所有主流的瀏覽器所信任。從這個裡程碑事件開始,訪問者訪問使用了Lets Encrypt 證書的網站不再需要特別配置就可以得到 HTTPS 安全保護了。 Lets Encrypt 的兩個中級證書 ...