Java / Cloud:如何快速创建支持Kubernetes的REST微服务
可以肯定地說(shuō),如今微服務(wù)與云的結(jié)合風(fēng)靡一時(shí)。 微服務(wù)的開(kāi)發(fā)比以往任何時(shí)候都多,從而導(dǎo)致應(yīng)用程序部署數(shù)量增加。 在過(guò)去的十年中,開(kāi)發(fā)了諸如Docker和Kubernetes之類(lèi)的容器化和編排工具,從而使微服務(wù)模式真正易于采用。
本文將教您如何使用能夠與MySQL數(shù)據(jù)庫(kù)交互的公開(kāi)REST API生成功能全面的微服務(wù),并將其部署到本地Kubernetes集群。 這里的知識(shí)可以應(yīng)用于幾乎任何數(shù)據(jù)庫(kù)類(lèi)型,例如Oracle,SQL Server,DB2等。
如果您在本文中遇到麻煩,請(qǐng)隨時(shí)參考源代碼的最終版本,該最終版本可在此GitHub存儲(chǔ)庫(kù)中找到。
速度是關(guān)鍵
作為開(kāi)發(fā)人員,我們?cè)谌粘9ぷ髦辛?zhēng)的一件事就是縮短開(kāi)發(fā)時(shí)間。
至此,我們已經(jīng)可以確定微服務(wù)的兩個(gè)方面,這將使我們的開(kāi)發(fā)時(shí)間超出所需的時(shí)間:
如果我要告訴您,存在一種可以處理這些事情而無(wú)需編寫(xiě)任何代碼的工具,該怎么辦?
Speedment是一個(gè)Java ORM工具包和運(yùn)行時(shí),旨在使開(kāi)發(fā)人員能夠超快速地創(chuàng)建超快速的應(yīng)用程序。 Speedment使用本地Java Streams API進(jìn)行數(shù)據(jù)庫(kù)交互,因此對(duì)于新手,經(jīng)驗(yàn)豐富的退伍軍人以及介于兩者之間的任何人都非常容易使用。 Speedment帶有圖形工具,使開(kāi)發(fā)人員能夠在幾秒鐘內(nèi)生成其數(shù)據(jù)庫(kù)的Java表示。
此外,Speedment的捆綁軟件系統(tǒng)使開(kāi)發(fā)人員可以輕松擴(kuò)展基本Toolkit的基本功能。 Spring插件就是這種增強(qiáng)功能之一,它使開(kāi)發(fā)人員能夠生成功能齊全的CRUD REST API,以便與他們的數(shù)據(jù)庫(kù)進(jìn)行交互。
在本文的其余部分,您將學(xué)習(xí)如何使用Speedment Tool生成有效的REST微服務(wù)并將其部署到Kubernetes集群。 如果您總體上對(duì)Speedment感興趣,可以在在線(xiàn)手冊(cè)中找到帶有示例的詳細(xì)文檔。
入門(mén)
通過(guò)Maven分發(fā),Speedment是免費(fèi)安裝的,但需要Java 8或更高版本。 首先,請(qǐng)轉(zhuǎn)到Speedment Initializer ,在這里您將能夠下載具有創(chuàng)建微服務(wù)所需的所有依賴(lài)項(xiàng)的項(xiàng)目模板。 這些是我們將在示例中使用的設(shè)置:
如果您的設(shè)置不同,例如數(shù)據(jù)庫(kù)不同,請(qǐng)確保在初始化程序中應(yīng)用適當(dāng)?shù)母摹?
完成項(xiàng)目配置后,單擊“下載”按鈕并解壓縮下載的zip文件。 要啟動(dòng)Speedment Tool,請(qǐng)從終端執(zhí)行以下命令:
mvn speedment:tool
如果這是您第一次運(yùn)行Speedment Tool,則會(huì)要求您連接到數(shù)據(jù)庫(kù)。 我們正在運(yùn)行香草MySQL
我們本地計(jì)算機(jī)上的Sakila示例數(shù)據(jù)庫(kù) ,因此auth信息如下所示:
填寫(xiě)必填字段后,單擊“連接”按鈕。 如果您提供的身份驗(yàn)證信息正確,則會(huì)顯示以下屏幕:
生成微服務(wù)
通過(guò)Speedment Tool連接到數(shù)據(jù)庫(kù)后,即可開(kāi)始配置可用的各種選項(xiàng)。 您可以使用許多選項(xiàng),但是出于本文的目的,我們將重點(diǎn)介紹公開(kāi)REST API所需的選項(xiàng)。
要啟用REST API生成,請(qǐng)?jiān)跇?shù)視圖中單擊“項(xiàng)目”節(jié)點(diǎn),然后選中“啟用REST”選項(xiàng):
我們還啟用了“生成REST文檔”選項(xiàng),以自動(dòng)為我們的REST API生成OpenAPI文檔。 此選項(xiàng)不是強(qiáng)制性的,但最終使我們可以更輕松地測(cè)試API。
下一步是可選的,但它將使我們的REST路由在美學(xué)上更具吸引力。 轉(zhuǎn)到樹(shù)視圖中的數(shù)據(jù)庫(kù)架構(gòu)節(jié)點(diǎn),然后將REST Endpoint的值設(shè)置為斜杠(/)。 默認(rèn)情況下,架構(gòu)名稱(chēng)包含在生成的REST路由中,此修改會(huì)將其刪除。
接下來(lái),我們將為下表啟用REST控制器的生成:
- 演員
- 類(lèi)別
- 顧客
- 電影
- 員工
- 商店
無(wú)論使用哪個(gè)表格,啟用控制器生成的步驟都是相同的。 因此,我們僅在A(yíng)ctor表上進(jìn)行演示。
單擊樹(shù)視圖中的Actor表,并啟用Generate @RestController選項(xiàng)。 反過(guò)來(lái),這將為該表啟用幾個(gè)與REST相關(guān)的選項(xiàng)。 您應(yīng)該啟用的我們感興趣的選項(xiàng)是:
- REST啟用清單
- REST啟用GET
- REST啟用創(chuàng)建
- REST啟用更新
- REST啟用DELETE
我們還將REST端點(diǎn)從/ actor重命名為/ actors(同樣僅出于美觀(guān)目的)。 默認(rèn)情況下,REST端點(diǎn)的名稱(chēng)與其關(guān)聯(lián)的表相同。 在我們的例子中,重命名是有道理的,因?yàn)楫?dāng)我們?cè)L問(wèn)/ actors端點(diǎn)時(shí),將檢索參與者列表,而不是單個(gè)參與者。
繼續(xù)并對(duì)上面列出的其他表重復(fù)這些步驟。 完成后,單擊“生成”按鈕。 這將生成數(shù)據(jù)庫(kù)的Java表示以及必要的REST配置和控制器。
運(yùn)行微服務(wù)
如果我們現(xiàn)在就按原樣運(yùn)行應(yīng)用程序,則很有可能會(huì)崩潰。 這是因?yàn)槲覀兩形粗付☉?yīng)用程序用于連接數(shù)據(jù)庫(kù)的密碼。
當(dāng)我們生成應(yīng)用程序時(shí),暴露了許多特定于Speedment的應(yīng)用程序?qū)傩浴?其中一個(gè)屬性就是spring.speedment.password屬性,我們可以使用它來(lái)設(shè)置Speedment連接到數(shù)據(jù)庫(kù)所使用的密碼。
有兩種方法可以指定應(yīng)用程序?qū)傩浴?我們將在application.properties文件中定義它們,您應(yīng)該在應(yīng)用程序的resources文件夾中創(chuàng)建該文件。
這是我們的application.properties文件的樣子:
#應(yīng)用程序?qū)傩晕募C START
spring.application.name =速度彈簧應(yīng)用
spring.speedment.password = sakila
#應(yīng)用程序?qū)傩晕募C END
Sakila數(shù)據(jù)庫(kù)的默認(rèn)密碼是sakila,但是如果您的數(shù)據(jù)庫(kù)使用不同的密碼,請(qǐng)確保這些更改反映在application.properties文件中。
完成所有配置后,即可運(yùn)行應(yīng)用程序。 這是通過(guò)從項(xiàng)目的根文件夾執(zhí)行以下命令來(lái)完成的:
mvn spring-boot:run
如果啟用了“生成REST文檔”選項(xiàng),則可以訪(fǎng)問(wèn)
http:// localhost:8080 / swagger-ui.html訪(fǎng)問(wèn)REST API文檔:
您可以手動(dòng)執(zhí)行請(qǐng)求,也可以直接從Swagger UI執(zhí)行請(qǐng)求。 如果要在瀏覽器中訪(fǎng)問(wèn)http:// localhost:8080 / actors ,我們將獲得一個(gè)JSON響應(yīng),其中包含存儲(chǔ)在數(shù)據(jù)庫(kù)中的actor列表:
[ { "actorId": 1, "firstName": "PENELOPE", "lastName": "GUINESS" }, { "actorId": 2, "firstName": "NICK", "lastName": "WAHLBERG" }, { "actorId": 3, "firstName": "ED", "lastName": "CHASE" }, ... TRUNCATED ... ]部署前
在開(kāi)始微服務(wù)的部署過(guò)程之前,請(qǐng)確保您在本地計(jì)算機(jī)上安裝了以下依賴(lài)項(xiàng):Docker,kubectl,Minikube和Skaffold。
Docker化我們的微服務(wù)
在將微服務(wù)實(shí)際部署到Kubernetes集群之前,我們需要將其轉(zhuǎn)換為Kubernetes可以實(shí)際使用的格式。 Kubernetes是一個(gè)容器編排工具,因此Docker就是在這里幫助我們進(jìn)行容器創(chuàng)建過(guò)程的。
在項(xiàng)目的根目錄中,創(chuàng)建一個(gè)包含以下內(nèi)容的Dockerfile:
FROM openjdk:11-slim-buster EXPOSE 8080 ARG JAR_LOCATION=target ARG JAR_NAME=speedment-spring-app ARG JAR_VERSION=1.0.0 ADD ${JAR_LOCATION}/${JAR_NAME}-${JAR_VERSION}.jar app.jar ENTRYPOINT ["java", "-jar", "app.jar", "--spring.speedment.host=sakila"] 導(dǎo)出的參數(shù)(JAR_LOCATION,JAR_NAME,JAR_VERSION)對(duì)于您的項(xiàng)目可能有所不同,具體取決于您在pom.xml文件中提供的信息。 在項(xiàng)目的根目錄中,執(zhí)行以下命令:
mvn install
這將使用包含您的微服務(wù)的JAR文件創(chuàng)建一個(gè)目標(biāo)文件夾。 確保文件的名稱(chēng)和版本與您放入Dockerfile中的信息匹配。
創(chuàng)建部署配置
我們將向Kubernetes集群部署兩個(gè)映像:Sakila數(shù)據(jù)庫(kù)和微服務(wù)。 Sakila數(shù)據(jù)庫(kù)已經(jīng)有一個(gè)公開(kāi)可用的Docker映像:restsql / mysql-sakila。 但是,我們需要為微服務(wù)構(gòu)建映像。 這是我們之前創(chuàng)建的Dockerfile派上用場(chǎng)的地方。 稍后,我們將使用一個(gè)名為Skaffold的工具為我們的微服務(wù)創(chuàng)建映像,并將其在部署過(guò)程中使用。
首先在項(xiàng)目的根目錄中創(chuàng)建一個(gè)名為k8s的文件夾。 您將在這里存儲(chǔ)所有的Kubernetes 部署和服務(wù)配置。 我們將微服務(wù)和數(shù)據(jù)庫(kù)配置分開(kāi),因此在k8s文件夾中創(chuàng)建兩個(gè)名為storage和app的文件夾。
現(xiàn)在,我們繼續(xù)進(jìn)行Sakila數(shù)據(jù)庫(kù)的配置。 在存儲(chǔ)文件夾中,我們將創(chuàng)建兩個(gè)YAML文件– sakila-deployment.yml和sakila-service.yml。 sakila-deployment.yml文件將存儲(chǔ)我們對(duì)Sakila數(shù)據(jù)庫(kù)的部署配置。 由于這不是Kubernetes教程,因此我們僅提供最終配置。 這是sakila-deployment.yml文件的最終外觀(guān):
apiVersion: apps/v1 kind: Deployment metadata: name: sakila labels: storage: sakila spec: replicas: 1 selector: matchLabels: storage: sakila template: metadata: labels: storage: sakila spec: containers: - name: sakila image: restsql/mysql-sakila ports: - containerPort: 3306這是最終的sakila-service.yml文件:
apiVersion: v1 kind: Service metadata: name: sakila labels: storage: sakila spec: selector: storage: sakila ports: - name: database port: 3306 targetPort: 3306我們的微服務(wù)的部署和服務(wù)配置幾乎相同。 在app文件夾中,創(chuàng)建一個(gè)名為speedment-spring-app-deployment.yml的YAML文件,其內(nèi)容如下:
apiVersion: apps/v1 kind: Deployment metadata: name: speedment-spring-app labels: app: speedment-spring-app spec: replicas: 1 selector: matchLabels: app: speedment-spring-app template: metadata: labels: app: speedment-spring-app spec: containers: - name: speedment-spring-app image: speedment-spring-app-example ports: - containerPort: 8080在同一文件夾中,創(chuàng)建另一個(gè)名為speedment-spring-app-service.yml的YAML文件,其內(nèi)容如下:
apiVersion: v1 kind: Service metadata: name: speedment-spring-app spec: selector: app: speedment-spring-app ports: - name: http port: 8080 targetPort: 8080 type: NodePort這些是我們部署數(shù)據(jù)庫(kù)和應(yīng)用程序所需的所有配置。 添加部署配置后,我們的文件結(jié)構(gòu)應(yīng)如下所示:
啟動(dòng)集群
部署的準(zhǔn)備工作幾乎完成了。 我們需要做的最后一件事–啟動(dòng)本地Kubernetes集群。 這是通過(guò)執(zhí)行以下命令來(lái)完成的:
minikube start
部署
為了部署我們的數(shù)據(jù)庫(kù)和應(yīng)用程序,我們將使用Skaffold。 在項(xiàng)目的根目錄中,創(chuàng)建一個(gè)名為skaffold.yml的文件,其中包含以下內(nèi)容:
apiVersion: skaffold/v2alpha3 kind: Config build: artifacts: - image: speedment-spring-app-example docker: dockerfile: Dockerfile deploy: kubectl: manifests: - k8s/app/* - k8s/storage/* 完成此文件后,我們終于可以進(jìn)行部署了。 在項(xiàng)目根目錄中,執(zhí)行以下命令:
skaffold dev --port-forward=true
當(dāng)我們執(zhí)行此命令時(shí),將發(fā)生兩件事:
微服務(wù)啟動(dòng)后,就可以像以前一樣使用它。 現(xiàn)在唯一的區(qū)別是它是從Kubernetes集群運(yùn)行的。
注意: Sakila數(shù)據(jù)庫(kù)完全啟動(dòng)大約需要30-60秒。 由于我們的應(yīng)用程序啟動(dòng)速度比Sakila數(shù)據(jù)庫(kù)快得多,因此它很可能崩潰并在數(shù)據(jù)庫(kù)準(zhǔn)備就緒之前重新啟動(dòng)幾次。
摘要
以省時(shí)的方式創(chuàng)建應(yīng)用程序有時(shí)可能很困難。 我們已經(jīng)解釋了如何從數(shù)據(jù)庫(kù)生成微服務(wù)并將其部署到Kubernetes集群,因此希望您已經(jīng)學(xué)到了一些可以減少開(kāi)發(fā)時(shí)間的知識(shí)。
我們希望您喜歡閱讀本文并喜歡撰寫(xiě)本文。 可以找到本文源代碼的最終版本
在這里 。
s
Per Minborg
米斯拉夫·米利切維奇(MislavMili?evi?)
資源資源
Speedment Initializer能夠生成項(xiàng)目模板
GitHub上的Speedment OpenSource
加速在線(xiàn)手冊(cè)
Github倉(cāng)庫(kù)以及最終版本的源代碼
Sakila示例數(shù)據(jù)庫(kù)
翻譯自: https://www.javacodegeeks.com/2020/04/java-cloud-how-to-quickly-create-a-kubernetes-ready-rest-microservice.html
總結(jié)
以上是生活随笔為你收集整理的Java / Cloud:如何快速创建支持Kubernetes的REST微服务的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 建安文学指的是什么 建安文学的简介
- 下一篇: 桌面壁纸怎么设置全屏(如何将壁纸设置全屏