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中國