Spring Boot集成与云部署全解析
1. Spring Cloud Stream中的Sink流
Sink流用于创建一个输入通道,以监听新传入的消息。以下是创建 ToDoSink 类的示例代码:
package com.apress.todo.cloud;
import com.apress.todo.domain.ToDo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.annotation.StreamListener;
import org.springframework.cloud.stream.messaging.Sink;
@EnableBinding(Sink.class)
public class ToDoSink {
private Logger log = LoggerFactory.getLogger(ToDoSink.class);
@StreamListener(Sink.INPUT)
public void process(ToDo message){
log.info("SINK - Message Received >>> {}",message);
}
}
在上述代码中, @EnableBinding 注解将该类转换为一个Source流,它通过 @StreamListener 和 Sink.INPUT 通道监听新传入的消息。 Sink.INPUT 会创建一个输入通道。
若使用相关代码注释掉 ToDoProcessor 类中的 @EnableBinding ,并运行应用程序,查看RabbitMQ管理界面,会看到输入交换器和 input.anonymous.* 被创建并相互绑定,同时会在Sink日志中看到相同的ToDo信息。需要注意的是,Sink流会对收到的消息进行额外处理,但会结束消息流。
2. 基于微服务的ToDo应用完整流程
可以使用微服务创建可扩展且高可用的应用程序,每个流(源、处理器和接收器)都可视为一个微服务。以下是新ToDo应用的一些需求:
- 创建一个Source,从文件中读取所有声明的ToDo,并过滤出已完成的ToDo,返回ToDo实例。
- 创建一个Processor,接受一个ToDo并创建一条文本消息。
- 创建一个Sink,接收文本并将电子邮件发送给收件人。
对应的流程图如下:
graph LR
A[Source] -->|ToDo实例| B[Processor]
B -->|文本消息| C[Sink]
C -->|电子邮件| D[收件人]
3. Spring Cloud Stream应用程序启动器
Spring Cloud Stream提供了开箱即用的应用程序启动器,Spring Cloud团队已经实现了约52个应用程序,可下载、配置和执行。这些应用程序启动器按Source、Processor和Sink模型划分,具体如下:
| 类型 | 示例 |
| ---- | ---- |
| Source | file, ftp, gemfire, gemfire-cq, http, jdbc, jms等 |
| Processor | bridge, filter, groovy-filter, groovy-transform, httpclient等 |
| Sink | aggregate-counter, cassandra, counter, field-value-counter等 |
若需要获取应用程序启动器的最新版本,可从 此处 获取。若想使用其他Spring Cloud Stream应用程序启动器并查看其配置,可参考 此文档 。
4. 云原生架构与Spring Boot应用
云计算是IT行业中最重要的概念之一,公司希望通过提高服务速度来保持领先地位,同时确保安全性和可扩展性。云原生架构应运而生,它允许开发者遵循一些模式,轻松实现速度、安全性和可扩展性。
4.1 云与云原生架构
像Pivotal、Amazon、Google、Heroku、Netflix和Uber等公司都在应用云原生架构的概念。例如,Amazon是云计算的先驱之一,它使用虚拟化作为主要工具来创建资源弹性,以满足不断增长的用户需求。Netflix则需要满足数百万用户每天流式传输媒体内容的需求。
新的云原生架构需要满足以下要求:
- 可见性 :需要更好的方式来监控应用程序,设置警报、拥有仪表盘等。
- 故障隔离和容错 :应用程序应是上下文受限的,彼此之间不应有任何依赖关系。若一个应用程序出现故障,其他应用程序应继续运行。
- 自动恢复 :整个系统应能够识别故障并进行恢复。
4.2 十二因素应用
Heroku的工程师确定了许多模式,形成了十二因素应用指南,总结如下:
1. 代码库 :一个应用程序有一个由版本控制系统(如Git、Subversion、Mercurial等)跟踪的单一代码库,可在开发、测试、暂存和生产环境中进行多次部署。
2. 依赖项 :明确声明并隔离依赖项,考虑打包依赖项(如JAR、gems、共享库等),不依赖最终环境中的所有内容。
3. 配置 :将配置存储在环境中,不硬编码任何可变内容,使用环境变量或配置服务器。
4. 后端服务 :将后端服务视为附加资源,通过URL或配置连接到服务。
5. 构建、发布、运行 :严格分离构建和运行阶段,与CI/CD相关。
6. 进程 :将应用程序作为一个或多个无状态进程执行,进程不应存储内部状态,如有必要的状态应视为后端服务。
7. 端口绑定 :通过端口绑定导出服务,应用程序是自包含的,可通过端口绑定暴露。
8. 并发 :通过进程模型进行横向扩展,通过添加更多应用程序实例进行扩展,单个进程可自由多线程。
9. 可处置性 :通过快速启动和优雅关闭来最大化健壮性,进程应是可处置的(无状态),具备容错能力。
10. 环境一致性 :保持开发、暂存和生产环境尽可能相似,以确保高质量和持续交付。
11. 日志 :将日志视为事件流,应用程序应写入标准输出,日志是聚合的、按时间排序的事件流。
12. 管理进程 :将管理任务作为一次性进程运行,如数据库迁移、一次性脚本等。
5. 微服务与ToDo应用准备
微服务是一种将单体应用程序分解为不同且独立组件的新方式,这些组件遵循十二因素应用指南。
5.1 准备ToDo应用作为微服务
可以将Spring Boot ToDo应用直接作为微服务使用,选择之前章节的 todo-rest 项目,确保其能正常运行。
若使用Maven,需在 pom.xml 文件中添加以下依赖:
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
若使用Gradle,需在 build.gradle 文件中添加以下依赖:
runtime('com.h2database:h2')
runtime('mysql:mysql-connector-java')
同时,将 application.properties 文件中的 spring.jpa.hibernate.ddl-auto 属性从 create-drop 改为 update ,该属性会在必要时更新数据库模式。
准备应用程序的步骤如下:
- 若使用Maven,执行命令 ./mvnw clean package 。
- 若使用Gradle,执行命令 ./gradlew clean build 。
执行上述命令会生成即将部署的JAR文件,需妥善保存。若在ToDo领域类的Java构造函数中遇到问题,可能是使用了旧版本的Lombok,需使用Lombok 1.18.2或更高版本。
6. Pivotal Cloud Foundry与PAS
Cloud Foundry自2008年以来就存在,最初是VMWare的一个开源项目,2013年转移到Pivotal。它是最常用的开源PaaS,拥有最大的社区支持,得到了许多大型IT公司的支持。
6.1 Pivotal Cloud Foundry版本
有两个版本的Cloud Foundry:
- 开源版本:可从 www.cloudfoundry.org 获取。
- Pivotal Cloud Foundry PAS和PKS(商业版本):可从 http://pivotal.io/platform 获取,也可在 https://network.pivotal.io/products/pivotal-cf 免费下载,若需要安装支持,需联系Pivotal销售代表。
2018年初,Pivotal发布了平台2.0版本,带来了Pivotal Application Service(PAS)和Pivotal Container Service(PKS,基于Kubernetes)解决方案。
6.2 PAS:Pivotal Application Service
Pivotal Application Service(PAS)基于开放架构构建,具有以下特点:
- 路由器 :将传入流量路由到适当的组件,通常是云控制器或DEA节点上运行的应用程序。
- 身份验证 :OAuth2服务器和登录服务器协同工作以提供身份管理。
- 云控制器 :负责管理应用程序的生命周期。
- 监控 :监控、确定和协调应用程序,以确定其状态、版本和实例数量,并将其重定向到云控制器以采取纠正措施。
- Garden/Diego Cells :管理应用程序实例,跟踪已启动的实例并广播状态消息。
- Blob存储 :存储资源、应用程序代码、构建包和滴液。
- 服务代理 :当开发人员为应用程序配置和绑定服务时,服务代理负责提供服务实例。
- 消息总线 :Cloud Foundry使用NATS(与网络NATS不同),这是一种轻量级的发布 - 订阅和分布式排队消息系统,用于组件之间的内部通信。
- 日志和统计 :指标收集器从组件收集指标,操作员可使用此信息监控Cloud Foundry实例。
PAS的特点还包括商业支持的基于Cloud Foundry开源的版本、全自动部署和更新、一键式横向和纵向扩展、即时横向应用层扩展、用于资源管理和应用程序及服务管理的Web控制台等。
与开源版本相比,商业版本可使用Web控制台管理基础设施和运行应用程序,而开源版本大多需要使用命令行手动完成安装、配置和升级等操作。Pivotal Cloud Foundry(PAS和PKS)对IaaS是无关的,可安装在Amazon AWS、OpenStack、Google Cloud、Microsoft Azure和vSphere等平台上。
6.3 使用PWS/PAS
若要使用PWS/PAS,需在 Pivotal Web Services 上开设账户,可获取试用账户。注册时需提供电话号码以接收启动试用的代码,还需提供组织名称,默认会创建一个名为 development 的工作空间。
默认试用账户有2GB内存,足以部署ToDo应用。可在左侧的 Tools 标签中找到下载CLI工具的链接以及登录PWS实例的方法。
7. 部署ToDo应用到Pivotal Cloud Foundry
在拥有Pivotal Web Services(PWS)账户并准备好ToDo应用的JAR文件后,就可以将应用部署到Pivotal Cloud Foundry平台。以下是具体的部署步骤:
- 安装CLI工具 :从PWS的
Tools标签中获取CLI工具的下载链接,按照说明完成安装。 - 登录PWS :打开终端,执行以下命令登录到PWS实例:
cf login -a https://api.run.pivotal.io
按照提示输入账户的用户名和密码。
3. 部署应用 :在终端中,导航到包含ToDo应用JAR文件的目录,执行以下命令部署应用:
cf push <app-name> -p <path-to-jar>
其中, <app-name> 是你为应用指定的名称, <path-to-jar> 是JAR文件的路径。例如:
cf push todo-app -p target/todo-app-1.0.jar
- 验证部署 :部署完成后,可在PWS的管理界面查看应用的状态,也可以通过浏览器访问应用的URL来验证是否部署成功。
8. 云环境下的应用监控与管理
在云环境中,对应用进行监控和管理至关重要,有助于确保应用的性能、可用性和安全性。
8.1 监控指标
PAS提供了丰富的监控指标,可通过管理界面或CLI工具查看,常见的监控指标包括:
| 指标类型 | 描述 |
| ---- | ---- |
| CPU使用率 | 应用程序使用的CPU资源百分比 |
| 内存使用率 | 应用程序使用的内存资源百分比 |
| 网络流量 | 应用程序的网络输入和输出流量 |
| 响应时间 | 应用程序对请求的响应时间 |
8.2 自动伸缩
为了应对不同的流量需求,PAS支持自动伸缩功能。可以根据监控指标设置自动伸缩规则,例如:
- 当CPU使用率超过80%时,自动增加应用实例。
- 当内存使用率低于20%时,自动减少应用实例。
设置自动伸缩规则的步骤如下:
1. 登录PWS管理界面,找到要设置自动伸缩的应用。
2. 在应用的设置页面中,找到“自动伸缩”选项。
3. 根据需求设置伸缩规则,点击保存。
8.3 日志管理
应用程序的日志是排查问题和监控应用状态的重要依据。PAS提供了日志管理功能,可通过以下命令查看应用的日志:
cf logs <app-name> --recent
其中, <app-name> 是应用的名称。若要实时查看日志,可去掉 --recent 参数。
9. 云原生架构下的应用通信与集成
在云原生架构中,应用之间的通信和集成是关键。以下是一些常见的通信和集成方式:
9.1 消息队列
消息队列是一种异步通信方式,可用于解耦应用之间的依赖关系。常见的消息队列系统包括RabbitMQ、Kafka等。在Spring Boot应用中,可以使用Spring Cloud Stream与消息队列进行集成。
例如,使用RabbitMQ作为消息队列,在 pom.xml 文件中添加以下依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
然后,在配置文件中配置RabbitMQ的连接信息:
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
9.2 RESTful API
RESTful API是一种基于HTTP协议的同步通信方式,广泛用于应用之间的集成。在Spring Boot应用中,可以使用Spring Web创建RESTful API。
以下是一个简单的RESTful API示例:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello, World!";
}
}
9.3 服务发现
在微服务架构中,服务发现是实现服务之间通信的关键。Spring Cloud提供了Eureka、Consul等服务发现组件。
以Eureka为例,在 pom.xml 文件中添加以下依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
然后,在配置文件中配置Eureka服务器的地址:
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
10. 总结
通过本文的介绍,我们了解了Spring Cloud Stream的Sink流、基于微服务的ToDo应用完整流程、Spring Cloud Stream应用程序启动器等知识。同时,深入探讨了云原生架构的概念和要求,以及如何将Spring Boot应用部署到Pivotal Cloud Foundry平台。
在云环境中,应用的监控、管理、通信和集成是确保应用性能和可用性的关键。通过合理使用PAS的功能和云原生架构的技术,我们可以创建出快速、安全、可扩展的Spring Boot应用。
希望本文能帮助你更好地理解和应用Spring Boot在云环境中的开发和部署,让你的应用在云时代发挥更大的价值。
超级会员免费看
1196

被折叠的 条评论
为什么被折叠?



