您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

在Kubernetes上构建和部署Java Spring Boot微服务

时间:2019-08-28 09:51:52  来源:  作者:

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数据库来存储帐户余额。

在Kubernetes上构建和部署Java Spring Boot微服务

 

  1. Python编写的Transaction Generator服务模拟事务并将它们推送到Compute Interest微服务。
  2. 计算兴趣微服务计算兴趣,然后将便士的分数移动到要存储的MySQL数据库。数据库可以在同一部署中的容器内运行,也可以在IBM Cloud等公共云上运行。
  3. 计算兴趣微服务然后调用通知服务以通知用户是否已将金额存入用户的帐户。
  4. Notification服务使用IBM Cloud Function向用户发送电子邮件。
  5. 此外,还可以调用用于向Slack发送消息的IBM Cloud Function。
  6. 用户通过访问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步。)

脚步

  1. 克隆回购
  2. 创建数据库服务
  3. 创建Spring Boot微服务
  4. 将IBM Cloud Functions与Notification服务一起使用(可选)
  5. 部署微服务
  6. 访问您的应用程序

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上构建和部署Java Spring Boot微服务

 

您需要在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.yamlsend-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 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
在Kubernetes上构建和部署Java Spring Boot微服务

 

测试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
在Kubernetes上构建和部署Java Spring Boot微服务

 

  • 将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应用程序,提供显示总帐户余额的静态文件(htmlcssJavaScript)。

$ 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
在Kubernetes上构建和部署Java Spring Boot微服务

 

故障排除

  • 重新开始,删除所有内容: kubectl delete svc,deploy -l app=office-space


Tags:Spring Boot   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
前言一个基于spring boot的JAVA开源商城系统,是前后端分离、为生产环境多实例完全准备、数据库为b2b2c商城系统设计、拥有完整下单流程和精美设计的java开源商城系统https://...【详细内容】
2021-09-17  Tags: Spring Boot  点击:(119)  评论:(0)  加入收藏
在 Java 和 Kotlin 中, 除了使用Spring Boot创建微服务外,还有很多其他的替代方案。 名称 版本 发布时间 开发商 GitHub ...【详细内容】
2021-08-06  Tags: Spring Boot  点击:(175)  评论:(0)  加入收藏
大家都知道,MyBatis 框架是一个持久层框架,是 Apache 下的顶级项目。Mybatis 可以让开发者的主要精力放在 sql 上,通过 Mybatis 提供的映射方式,自由灵活的生成满足需要的 sql 语句。使用简单的 XML 或注解来配置和映射原...【详细内容】
2021-07-06  Tags: Spring Boot  点击:(96)  评论:(0)  加入收藏
首先,先看 SpringBoot 的主配置类:@SpringBootApplicationpublicclassStartEurekaApplication{publicstaticvoidmain(String[] args){SpringApplication.run(StartEurekaAppli...【详细内容】
2021-06-11  Tags: Spring Boot  点击:(144)  评论:(0)  加入收藏
今天又要给大家介绍一个 Spring Boot 中的组件 --HandlerMethodReturnValueHandler。在前面的文章中(如何优雅的实现 Spring Boot 接口参数加密解密?),松哥已经和大家介绍过如何...【详细内容】
2021-03-24  Tags: Spring Boot  点击:(297)  评论:(0)  加入收藏
环境:SpringBoot2.3.9.RELEASE + SpringBootAdmin2.3.1说明:如果使用SpringBootAdmin2.4.*版本那么SpringBoot的版本也必须是2.4.*否则启动报错。Spring Boot Admin(SBA)是一个...【详细内容】
2021-03-22  Tags: Spring Boot  点击:(350)  评论:(0)  加入收藏
要让项目实现 ssl 免密登录,首先需要开启 https 。所以先从 Spring Boot 如何开启 https 说起。创建服务端证书为了开启 https ,我们需要一份证书。实际开发中,会在网上申请一...【详细内容】
2021-01-07  Tags: Spring Boot  点击:(159)  评论:(0)  加入收藏
短信发送”功能在企业应用系统开发中应该说算是很常见的了,典型的案例 如 “用户登录时可以通过手机号接收平台发送的验证码进行登录”、“用户通过手机号接收平台发送的短信...【详细内容】
2020-12-31  Tags: Spring Boot  点击:(186)  评论:(0)  加入收藏
在平常的开发过程中,我们经常需要对接口响应时间进行优化,但是呢个人感觉每次都去看浏览器的网络请求比较麻烦,因此,小编自己自己手写代码实现在控制台打印接口响应时间,这样非常...【详细内容】
2020-12-23  Tags: Spring Boot  点击:(713)  评论:(0)  加入收藏
前言在一个高并发系统中对流量的把控是非常重要的,当巨大的流量直接请求到我们的服务器上没多久就可能造成接口不可用,不处理的话甚至会造成整个应用不可用。那么何为限流呢?顾...【详细内容】
2020-12-15  Tags: Spring Boot  点击:(121)  评论:(0)  加入收藏
▌简易百科推荐
面向对象的特征之一封装 面向对象的特征之二继承 方法重写(override/overWrite) 方法的重载(overload)和重写(override)的区别: 面向对象特征之三:多态 Instanceof关键字...【详细内容】
2021-12-28  顶顶架构师    Tags:面向对象   点击:(2)  评论:(0)  加入收藏
一、Redis使用过程中一些小的注意点1、不要把Redis当成数据库来使用二、Arrays.asList常见失误需求:把数组转成list集合去处理。方法:Arrays.asList 或者 Java8的stream流式处...【详细内容】
2021-12-27  CF07    Tags:Java   点击:(3)  评论:(0)  加入收藏
文章目录 如何理解面向对象编程? JDK 和 JRE 有什么区别? 如何理解Java中封装,继承、多态特性? 如何理解Java中的字节码对象? 你是如何理解Java中的泛型的? 说说泛型应用...【详细内容】
2021-12-24  Java架构师之路    Tags:JAVA   点击:(5)  评论:(0)  加入收藏
大家好!我是老码农,一个喜欢技术、爱分享的同学,从今天开始和大家持续分享JVM调优方面的经验。JVM调优是个大话题,涉及的知识点很庞大 Java内存模型 垃圾回收机制 各种工具使用 ...【详细内容】
2021-12-23  小码匠和老码农    Tags:JVM调优   点击:(12)  评论:(0)  加入收藏
前言JDBC访问Postgresql的jsonb类型字段当然可以使用Postgresql jdbc驱动中提供的PGobject,但是这样在需要兼容多种数据库的系统开发中显得不那么通用,需要特殊处理。本文介绍...【详细内容】
2021-12-23  dingle    Tags:JDBC   点击:(13)  评论:(0)  加入收藏
Java与Lua相互调用案例比较少,因此项目使用需要做详细的性能测试,本内容只做粗略测试。目前已完成初版Lua-Java调用框架开发,后期有时间准备把框架进行抽象,并开源出来,感兴趣的...【详细内容】
2021-12-23  JAVA小白    Tags:Java   点击:(11)  评论:(0)  加入收藏
Java从版本5开始,在 java.util.concurrent.locks包内给我们提供了除了synchronized关键字以外的几个新的锁功能的实现,ReentrantLock就是其中的一个。但是这并不意味着我们可...【详细内容】
2021-12-17  小西学JAVA    Tags:JAVA并发   点击:(11)  评论:(0)  加入收藏
一、概述final是Java关键字中最常见之一,表示“最终的,不可更改”之意,在Java中也正是这个意思。有final修饰的内容,就会变得与众不同,它们会变成终极存在,其内容成为固定的存在。...【详细内容】
2021-12-15  唯一浩哥    Tags:Java基础   点击:(17)  评论:(0)  加入收藏
1、问题描述关于java中的日志管理logback,去年写过关于logback介绍的文章,这次项目中又优化了下,记录下,希望能帮到需要的朋友。2、解决方案这次其实是碰到了一个问题,一般的情况...【详细内容】
2021-12-15  软件老王    Tags:logback   点击:(19)  评论:(0)  加入收藏
本篇文章我们以AtomicInteger为例子,主要讲解下CAS(Compare And Swap)功能是如何在AtomicInteger中使用的,以及提供CAS功能的Unsafe对象。我们先从一个例子开始吧。假设现在我们...【详细内容】
2021-12-14  小西学JAVA    Tags:JAVA   点击:(22)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条