Spring Boot是流行的JAVA微服務(wù)框架之一。Spring Cloud具有豐富的集成良好的Java庫(kù),可以解決作為Java應(yīng)用程序堆棧一部分的運(yùn)行時(shí)問(wèn)題,而Kubernetes提供了豐富的功能集來(lái)運(yùn)行多語(yǔ)言微服務(wù)。這些技術(shù)相互補(bǔ)充,為Spring Boot應(yīng)用程序提供了一個(gè)很好的平臺(tái)。
在此代碼中,我們演示了如何在Kubernetes之上部署簡(jiǎn)單的Spring Boot應(yīng)用程序。這個(gè)應(yīng)用程序,office Space,模仿電影Office Space中 Michael Bolton的虛構(gòu)應(yīng)用創(chuàng)意。該應(yīng)用程序利用財(cái)務(wù)計(jì)劃,通過(guò)將通常四舍五入的一小部分轉(zhuǎn)移到單獨(dú)的銀行賬戶來(lái)計(jì)算交易利息。
該應(yīng)用程序使用Java 8 / Spring Boot微服務(wù)來(lái)計(jì)算興趣,然后將便士的一小部分帶到數(shù)據(jù)庫(kù)。另一個(gè)Spring Boot微服務(wù)是通知服務(wù)。當(dāng)帳戶余額超過(guò)50,000美元時(shí),它會(huì)發(fā)送電子郵件。它由計(jì)算興趣的Spring Boot網(wǎng)絡(luò)服務(wù)器觸發(fā)。前端使用Node.js應(yīng)用程序,該應(yīng)用程序顯示Spring Boot應(yīng)用程序累積的當(dāng)前帳戶余額。后端使用MySQL數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)帳戶余額。
流

- 用Python編寫的Transaction Generator服務(wù)模擬事務(wù)并將它們推送到Compute Interest微服務(wù)。
- 計(jì)算興趣微服務(wù)計(jì)算興趣,然后將便士的分?jǐn)?shù)移動(dòng)到要存儲(chǔ)的MySQL數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)可以在同一部署中的容器內(nèi)運(yùn)行,也可以在IBM Cloud等公共云上運(yùn)行。
- 計(jì)算興趣微服務(wù)然后調(diào)用通知服務(wù)以通知用戶是否已將金額存入用戶的帳戶。
- Notification服務(wù)使用IBM Cloud Function向用戶發(fā)送電子郵件。
- 此外,還可以調(diào)用用于向Slack發(fā)送消息的IBM Cloud Function。
- 用戶通過(guò)訪問(wèn)Node.js Web界面來(lái)檢索帳戶余額。
包含的組件
- IBM Cloud Kubernetes服務(wù):IBM Bluemix Container Service管理IBM Cloud上的Docker容器和Kubernetes集群中的高可用性應(yīng)用程序。
- 撰寫MySQL:可能是世界上最流行的開(kāi)源關(guān)系數(shù)據(jù)庫(kù)。
- IBM Cloud Functions:在高度可擴(kuò)展的無(wú)服務(wù)器環(huán)境中按需執(zhí)行代碼。
特色技術(shù)
- Container Orchestration:自動(dòng)化容器化應(yīng)用程序的部署,擴(kuò)展和管理。
- 數(shù)據(jù)庫(kù):用于存儲(chǔ)和管理數(shù)據(jù)集合的存儲(chǔ)庫(kù)。
- 無(wú)服務(wù)器:一種事件操作平臺(tái),允許您執(zhí)行代碼以響應(yīng)事件。
條件
- 使用Minikube進(jìn)行本地測(cè)試,使用IBM Cloud Private或使用IBM Cloud Kubernetes Service在云中部署Kubernetes集群。此處的代碼使用Travis 定期從IBM Cloud對(duì)Kubernetes Cluster進(jìn)行測(cè)試。
- 來(lái)自 Slack團(tuán)隊(duì)的Slack Incoming Webhook。(如果要在步驟4中收到測(cè)試通知。)
- 用于創(chuàng)建IBM Cloud Functions的IBM Cloud Function CLI。(如果你想做第4步。)
腳步
- 克隆回購(gòu)
- 創(chuàng)建數(shù)據(jù)庫(kù)服務(wù)
- 創(chuàng)建Spring Boot微服務(wù)
- 將IBM Cloud Functions與Notification服務(wù)一起使用(可選)
- 部署微服務(wù)
- 訪問(wèn)您的應(yīng)用程序
1.克隆回購(gòu)
克隆此存儲(chǔ)庫(kù)。在終端中,運(yùn)行:
$ git clone https://github.com/IBM/spring-boot-microservices-on-kubernetes
2.創(chuàng)建數(shù)據(jù)庫(kù)服務(wù)
后端由MySQL數(shù)據(jù)庫(kù)和Spring Boot應(yīng)用程序組成。每個(gè)微服務(wù)都有部署和服務(wù)。部署管理為每個(gè)微服務(wù)啟動(dòng)的pod。該服務(wù)為每個(gè)微服務(wù)創(chuàng)建一個(gè)穩(wěn)定的DNS條目,以便它們可以按名稱引用它們的依賴項(xiàng)。
- 有兩種方法可以創(chuàng)建MySQL數(shù)據(jù)庫(kù)后端: 在容器中使用MySQL 或 使用IBM Cloud Compose for MySQL
- 在容器中使用MySQL (選項(xiàng)1)
$ kubectl create -f account-database.yaml 服務(wù)“帳戶數(shù)據(jù)庫(kù)”已創(chuàng)建 部署“帳戶數(shù)據(jù)庫(kù)”創(chuàng)建
默認(rèn)憑據(jù)已在secrets.yaml中的base64中編碼。
base64中的編碼不會(huì)加密或隱藏您的秘密。不要把它放在你的Github中。
$ kubectl Apply -f secrets.yaml secret "demo-credentials" created
繼續(xù)執(zhí)行第3步。
- 使用IBM Cloud Compose for MySQL (選項(xiàng)2)
為MySQL提供IBM Cloud Compose。轉(zhuǎn)到服務(wù)憑據(jù)并查看憑據(jù)。您的MySQL主機(jī)名,端口,用戶和密碼位于您的憑證uri下,它應(yīng)如下所示

您需要在Kubernetes集群中將這些憑據(jù)作為機(jī)密應(yīng)用。它應(yīng)該base64編碼。使用腳本./scripts/create-secrets.sh。系統(tǒng)將提示您輸入憑據(jù)。這將對(duì)您輸入的憑據(jù)進(jìn)行編碼,并將其作為Secrets應(yīng)用于您的群集中。
$ ./scripts/create-secrets.sh 輸入MySQL用戶名: 管理 輸入MySQL密碼: 密碼 輸入MySQL主機(jī): 主機(jī)名 輸入MySQL端口: 23966創(chuàng)建了 秘密的“演示憑證”
您還可以使用該secrets.yaml文件并將其中的數(shù)據(jù)值編輯為您自己的base64編碼憑據(jù)。然后呢kubectl apply -f secrets.yaml。
3.創(chuàng)建Spring Boot微服務(wù)
您需要在您的環(huán)境中安裝Maven。如果要修改Spring Boot應(yīng)用程序,則需要在構(gòu)建Java項(xiàng)目和docker鏡像之前執(zhí)行此操作。
Spring Boot微服務(wù)是Compute-Interest-API和Send-Notification。
Compute-Interest-API是一個(gè)配置為使用MySQL數(shù)據(jù)庫(kù)的Spring Boot應(yīng)用程序。配置位于compute-interest-api/src/main/resources/application.properties在spring.datasource.*
該application.properties配置為使用MYSQL_DB_ *環(huán)境變量。這些是在compute-interest-api.yaml文件中定義的。它已經(jīng)配置為從先前創(chuàng)建的Kubernetes Secrets中獲取值。
可以將Send-Notification配置為通過(guò)gmail和/或Slack發(fā)送通知。當(dāng)MySQL數(shù)據(jù)庫(kù)上的帳戶余額超過(guò)50,000美元時(shí),將發(fā)送通知。
- 使用Maven構(gòu)建項(xiàng)目
在Maven成功構(gòu)建Java項(xiàng)目之后,您需要使用Dockerfile各自文件夾中提供的構(gòu)建Docker鏡像。
注意:為了模擬目的,compute-interest-api將便士的分?jǐn)?shù)乘以x100,000。
轉(zhuǎn)到containers / compute-interest-api $ mvn包 轉(zhuǎn)到容器/發(fā)送通知 $ mvn包
- 為Spring Boot服務(wù)構(gòu)建Docker鏡像
注意:這是在IBM Cloud Container Registry中推送的。
如果您計(jì)劃使用IBM Cloud Container Registry,則需要先設(shè)置帳戶。按照這里的教程。
我們將使用IBM Cloud容器注冊(cè)表來(lái)推送圖像(因此命名圖像),但圖像也可以在Docker hub中推送。
$ docker build -t registry.ng.bluemix.net/ < YOUR_NAMESPACE > / compute-interest-api 。 $ docker build -t registry.ng.bluemix.net/ < YOUR_NAMESPACE > / send-notification 。 $ docker push registry.ng.bluemix.net/ < YOUR_NAMESPACE > / compute-interest-api $ docker push registry.ng.bluemix.net/ < YOUR_NAMESPACE > / send-notification
- 修改compute-interest-api.yaml和send-notification.yaml以使用您的圖像
成功推送圖像后,您需要修改yaml文件以使用圖像。
# compute-interest-api.yaml spec: containers: - image:registry.ng.bluemix.net/< namespace>/ compute - interest- api #替換為您的圖像名稱 # send-notification.yaml spec: containers: - image:registry.ng.bluemix.net/< namespace>/ send - notification #替換為您的圖像名稱
可能有兩種類型的通知,Using default email service with Notification service或者Use IBM Cloud Functions with Notification Service
- 使用默認(rèn)電子郵件服務(wù)(gmail)和Notification服務(wù)
您將需要修改環(huán)境變量中send-notification.yaml:
環(huán)境: - 名稱:GMAIL_SENDER_USER 值:“ [email protected] ” #更改為Gmail的將發(fā)送電子郵件 - 名稱:GMAIL_SENDER_PASSword 值:“密碼” #更改為上述的Gmail密碼 - 名稱:EMAIL_RECEIVER 值:“ [email protected] ” #更改為接收器的電子郵件
如果您不想使用IBM Cloud Functions,現(xiàn)在可以繼續(xù)執(zhí)行步驟5。
4.將IBM Cloud Functions與Notification服務(wù)一起使用
如果您想嘗試IBM Cloud Functions,這是一個(gè)可選步驟
- 創(chuàng)建操作此存儲(chǔ)庫(kù)的根目錄包含用于創(chuàng)建IBM Cloud Functions的必需代碼。您可以使用ibmcloud wskor wsk命令創(chuàng)建Actions 。
創(chuàng)建發(fā)送Slack通知的操作
$ wsk action create sendSlackNotification sendSlack.js --param url https://hooks.slack.com/services/XXXX/YYYY/ZZZZ --web true #用你的Slack團(tuán)隊(duì)的傳入webhook網(wǎng)址替換網(wǎng)址。
創(chuàng)建發(fā)送Gmail通知的操作
$ wsk action create sendEmailNotification sendEmail.js --web true
- 測(cè)試行動(dòng)
您可以使用測(cè)試IBM Cloud Function Actions wsk action invoke [action name] [add --param to pass parameters]
調(diào)用Slack通知
$ wsk action調(diào)用sendSlackNotification --param text “ Hello from OpenWhisk ”
調(diào)用電子郵件通知
$ wsk action invoke sendEmailNotification --param sender [sender email] - param password [sender password] - param receiver [receiver email] - param subject [Email subject] - param text [Email Body]
您應(yīng)該收到一個(gè)松弛的消息并分別收到一封電子郵件。
- 為Actions創(chuàng)建REST API
您可以使用為您創(chuàng)建的操作映射REST API端點(diǎn)wsk api create。它的語(yǔ)法是wsk api create [base-path] [api-path] [verb (GET PUT POST etc)] [action name]
為Slack Notification創(chuàng)建端點(diǎn)
$ wsk api create / v1 / slack POST sendSlackNotification ok:為 action / _ / sendEmailNotification 創(chuàng)建了API / v1 / slack POST https://service.us.apiconnect.ibmcloud.com/gws/apigateway/api/.../v1/slack
為Gmail通知?jiǎng)?chuàng)建端點(diǎn)
$ wsk api create / v1 / email POST sendEmailNotification ok:為 action / _ / sendEmailNotification 創(chuàng)建了API / v1 / email POST https://service.us.apiconnect.ibmcloud.com/gws/apigateway/api/.../v1/email
您可以使用以下命令查看API列表:
$ wsk api列表 好的:API 動(dòng)作動(dòng)詞API名稱URL /Anthony.Amanse_dev/sendEmailNotificatio post / v1 https://service.us.apiconnect.ibmcloud.com/gws/apigateway/api/.../v1/email /Anthony.Amanse_dev/testDefault post / v1 https://service.us.apiconnect.ibmcloud.com/gws/apigateway/api/.../v1/slack
記下您的API網(wǎng)址。您將在以后使用它們。
- 測(cè)試REST API URL
Slack Notification的測(cè)試端點(diǎn)。將URL替換為您自己的API URL。
$卷曲-X POST -H '內(nèi)容類型:應(yīng)用程序/ JSON的' -d ' { “文”: “從OpenWhisk你好”} ' https://service.us.apiconnect.ibmcloud.com/gws/apigateway/api /.../v1/slack

測(cè)試Gmail通知的終結(jié)點(diǎn)。將URL替換為您自己的API URL。用您自己的參數(shù)替換參數(shù)發(fā)送者,密碼,接收者,主題的值。
$卷曲-X POST -H '內(nèi)容類型:應(yīng)用程序/ JSON的' -d “ { ”文“: ”你好,從OpenWhisk“, ”主題“: ”電子郵件通知“, ”發(fā)件人“: ”[email protected]“ ,“password”:“passwordOfSender”,“receiver”:“receiversEmail”} ' https://service.us.apiconnect.ibmcloud.com/gws/apigateway/api/.../v1/email

- 將REST API URL添加到y(tǒng)aml文件
確認(rèn)您的API正常工作后,請(qǐng)將URL放入您的send-notification.yaml文件中
環(huán)境: - 名稱:GMAIL_SENDER_USER 值:“ [email protected] ” #發(fā)件人的電子郵件 - 名稱:GMAIL_SENDER_PASSWORD 值:“密碼” #發(fā)件人的密碼 - 名稱:EMAIL_RECEIVER 值:“ [email protected] ” #接收的電子郵件 - 名稱:OPENWHISK_API_URL_SLACK 值:' https : //service.us.apiconnect.ibmcloud.com/gws/apigateway/api/.../v1/slack“ #松弛通知你的API端點(diǎn) -名稱: SLACK_MESSAGE 值: ”您的余額超過(guò)50,000.00 $ “ #你的自定義消息 -名稱: OPENWHISK_API_URL_EMAIL 值: ” https://service.us.apiconnect.ibmcloud.com/gws/apigateway/ api /.../v1 / email ' #您的電子郵件通知的API端點(diǎn)
5.部署微服務(wù)
- 部署Spring Boot微服務(wù)
$ kubectl apply -f compute-interest-api.yaml 服務(wù)“ compute-interest-api ”創(chuàng)建 部署“ compute-interest-api ”創(chuàng)建 $ kubectl apply -f send-notification.yaml 服務(wù)“發(fā)送通知”已創(chuàng)建 部署“發(fā)送通知”已創(chuàng)建
- 部署前端服務(wù)
UI是一個(gè)Node.js應(yīng)用程序,提供顯示總帳戶余額的靜態(tài)文件(html,css,JavaScript)。
$ kubectl apply -f account-summary.yaml 服務(wù)“帳戶摘要”已創(chuàng)建 部署“帳戶摘要”已創(chuàng)建
- 部署事務(wù)生成器服務(wù)事務(wù)生成器是一個(gè)Python應(yīng)用程序,可生成累積興趣的隨機(jī)事務(wù)。
創(chuàng)建事務(wù)生成器Python應(yīng)用程序:
$ kubectl apply -f transaction-generator.yaml 服務(wù)“事務(wù)生成器”創(chuàng)建 部署“事務(wù)生成器”創(chuàng)建
6.訪問(wèn)您的應(yīng)用程序
您可以通過(guò)群集IP和NodePort公開(kāi)訪問(wèn)您的應(yīng)用程序。NodePort應(yīng)該是30080。
- 要找到你的IP:
$ ibmcloud cs workers < cluster-name > ID公共IP專用IP機(jī)器類型狀態(tài) kube-dal10-paac005a5fa6c44786b5dfb3ed8728548f-w1 169.47.241.213 10.177.155.13 free normal Ready
- 要查找?guī)粽?wù)的NodePort:
$ kubectl獲取svc NAME CLUSTER-IP EXTERNAL-IP PORT(S)AGE ... account-summary 10.10.10.74 < nodes > 80:30080 / TCP 2d ...
- 在您的瀏覽器上,轉(zhuǎn)到 http://<your-cluster-IP>:30080

故障排除
- 重新開(kāi)始,刪除所有內(nèi)容: kubectl delete svc,deploy -l app=office-space