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

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

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

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

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

故障排除
- 重新開始,刪除所有內容: kubectl delete svc,deploy -l app=office-space