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数据库来存储帐户余额。
流
![e6c5fd777cbde13b7e735675ba31b7cb.png](https://i-blog.csdnimg.cn/blog_migrate/a86acb2275d3b94e7fbf798e51b48362.jpeg)
- 用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.yamlsecret "demo-credentials" created
继续执行第3步。
- 使用IBM Cloud Compose for MySQL (选项2)
为MySQL提供IBM Cloud Compose。转到服务凭据并查看凭据。您的MySQL主机名,端口,用户和密码位于您的凭证uri下,它应如下所示
![a4f3e9cd5b31aeda2072d956cc3145de.png](https://i-blog.csdnimg.cn/blog_migrate/12fb219b92ee4276297ff88300405547.jpeg)
您需要在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 值:“ username@gmail.com ” #更改为Gmail的将发送电子邮件 - 名称:GMAIL_SENDER_PASSWORD 值:“密码” #更改为上述的Gmail密码 - 名称:EMAIL_RECEIVER 值:“ sendTo@gmail.com ” #更改为接收器的电子邮件
如果您不想使用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 sendSlackNotificationok:为 action / _ / sendEmailNotification 创建了API / v1 / slack POSThttps://service.us.apiconnect.ibmcloud.com/gws/apigateway/api/.../v1/slack
为Gmail通知创建端点
$ wsk api create / v1 / email POST sendEmailNotificationok:为 action / _ / sendEmailNotification 创建了API / v1 / email POSThttps://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
![0536f22cc821b745b713a8331b8d40d1.png](https://i-blog.csdnimg.cn/blog_migrate/ad598f6c3569e43acded4fc54bdf9987.jpeg)
测试Gmail通知的终结点。将URL替换为您自己的API URL。用您自己的参数替换参数发送者,密码,接收者,主题的值。
$卷曲-X POST -H '内容类型:应用程序/ JSON的' -d “ { ”文“: ”你好,从OpenWhisk“, ”主题“: ”电子邮件通知“, ”发件人“: ”testemail@gmail.com“ ,“password”:“passwordOfSender”,“receiver”:“receiversEmail”} ' https://service.us.apiconnect.ibmcloud.com/gws/apigateway/api/.../v1/email
![584d3db42719fe422dd00714426cc58b.png](https://i-blog.csdnimg.cn/blog_migrate/85f1e9301bc2ceb1f795c298d1a09949.jpeg)
- 将REST API URL添加到yaml文件
确认您的API正常工作后,请将URL放入您的send-notification.yaml文件中
环境:- 名称:GMAIL_SENDER_USER 值:“ username@gmail.com ” #发件人的电子邮件 - 名称:GMAIL_SENDER_PASSWORD 值:“密码” #发件人的密码 - 名称:EMAIL_RECEIVER 值:“ sendTo@gmail.com ” #接收的电子邮件 - 名称: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获取svcNAME CLUSTER-IP EXTERNAL-IP PORT(S)AGE...account-summary 10.10.10.74 < nodes > 80:30080 / TCP 2d...
- 在您的浏览器上,转到 http://:30080
![0000c60dfe494b4a313f95fa4e83e272.png](https://i-blog.csdnimg.cn/blog_migrate/786b263de4736255abe74cae535e1371.jpeg)
故障排除
- 重新开始,删除所有内容: kubectl delete svc,deploy -l app=office-space