Spring Cloud Sleuth、Zipkin分布式追踪与微服务部署
1. Spring Cloud Sleuth与Zipkin的分布式追踪
Spring Cloud Sleuth允许无缝地将追踪信息(关联ID)添加到微服务调用中,关联ID可用于跨多个服务链接日志条目,让我们能看到单个事务中涉及的所有服务的事务行为。但关联ID需与日志聚合平台结合,才能更好地发挥作用。云服务能在无需大量基础设施的情况下管理日志,还能随应用日志量增长轻松扩展。同时,Zipkin可展示服务调用时服务间的依赖关系,Spring Cloud Sleuth与Zipkin集成后,能以图形化方式查看事务流程,了解每个微服务的性能特征。
1.1 添加自定义跨度
当我们想追踪未被Zipkin检测的第三方服务调用时,Spring Cloud Sleuth和Zipkin允许在事务中添加自定义跨度。以下是具体操作步骤:
-
在许可服务中添加自定义跨度
:
要在许可服务调用Redis时添加自定义跨度,需对licensing-service/src/main/java/com/thoughtmechanix/licenses/clients/OrganizationRestTemplateClient.java类进行检测,具体检测checkRedisCache()方法,代码如下:
import org.springframework.cloud.sleuth.Tracer;
//Rest of imports removed for conciseness
@Component
public class OrganizationRestTemplateClient {
@Autowired
RestTemplate restTemplate;
@Autowired
Tracer tracer;
@Autowired
OrganizationRedisRepository orgRedisRepo;
private static final Logger logger =
➥ LoggerFactory
.getLogger(OrganizationRestTemplateClient.class);
private Organization checkRedisCache(String organizationId) {
Span newSpan = tracer.createSpan("readLicensingDataFromRedis");
try {
return orgRedisRepo.findOrganization(organizationId);
}
catch (Exception ex){
logger.error("Error encountered while
➥ trying to retrieve organization
➥ {} check Redis Cache. Exception {}",
➥ organizationId, ex);
return null;
}
finally {
newSpan.tag("peer.service", "redis");
newSpan.logEvent(
org.springframework.cloud.sleuth.Span.CLIENT_RECV);
tracer.close(newSpan);
}
}
//Rest of class removed for conciseness
}
-
在组织服务中添加自定义跨度
:
要监控从Postgres数据库检索组织数据所需的时间,需在组织服务中添加名为getOrgDbCall的自定义跨度。可在organization-service/src/main/java/com/thoughtmechanix/organization/services/OrganizationService.java类的getOrg()方法中进行检测,代码如下:
package com.thoughtmechanix.organization.services;
//Removed the imports for conciseness
@Service
public class OrganizationService {
@Autowired
private OrganizationRepository orgRepository;
@Autowired
private Tracer tracer;
@Autowired
SimpleSourceBean simpleSourceBean;
private static final Logger logger =
➥ LoggerFactory.getLogger(OrganizationService.class);
public Organization getOrg (String organizationId) {
Span newSpan = tracer.createSpan("getOrgDBCall");
logger.debug("In the organizationService.getOrg() call");
try {
return orgRepository.findById(organizationId);
}finally{
newSpan.tag("peer.service", "postgres");
newSpan
.logEvent(
org.springframework.cloud.sleuth.Span.CLIENT_RECV);
tracer.close(newSpan);
}
}
//Removed the code for conciseness
}
添加这两个自定义跨度后,重启服务,访问
GET http://localhost:5555/api/licensing/v1/organizations/e254f8c-c442-4ebe-a82a-e2fc1d1ff78a/licenses/f3831f8c-c338-4ebe-a82a-e2fc1d1ff78a
端点,在Zipkin中查看事务,就能看到新增的两个跨度。
2. 微服务部署
微服务架构的关键优势之一是微服务可快速构建、修改并独立部署到生产环境。为实现这一目标,构建和部署代码的机制需满足以下要求:
|要求|说明|
|----|----|
|自动化|构建代码时,构建和部署过程应无需人工干预,特别是在较低环境中。软件构建、机器映像配置和服务部署过程应自动化,并由代码提交到源仓库触发。|
|可重复|构建和部署软件的过程应可重复,每次构建和部署启动时都执行相同操作,过程中的可变性常是难以追踪和解决的细微错误的来源。|
|完整性|部署的工件应是包含服务“完整”运行时环境的完整虚拟机或容器映像(Docker)。机器映像的配置需通过脚本完全自动化,并与服务源代码一起进行版本控制。|
|不可变|包含服务的机器映像构建完成后,部署后不应更改其运行时配置。若需更改,应在版本控制的脚本中进行,服务和基础设施需重新进行构建过程。运行时配置更改可通过环境变量传递给映像,应用配置应与容器分离(如使用Spring Cloud Config)。|
3. 构建和部署管道的实现
接下来将使用一些非Spring工具实现构建和部署管道,具体步骤如下:
1. 将使用的Maven构建脚本集成到名为Travis CI的持续集成/部署云工具中。
2. 为每个服务构建不可变的Docker映像,并将这些映像推送到集中式仓库。
3. 使用Amazon的EC2容器服务(ECS)将整套微服务部署到Amazon云。
4. 运行平台测试,确保服务正常运行。
4. EagleEye核心基础设施在云端的设置
之前的应用都在单个虚拟机映像中运行,每个服务作为Docker容器运行。现在将数据库服务器(PostgreSQL)和缓存服务器(Redis)从Docker分离到Amazon云中,其他服务仍作为Docker容器在单节点Amazon ECS集群中运行。具体部署情况如下:
graph LR
classDef service fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A(Licensing service):::service --> B(Zuul server):::service
C(Organization service):::service --> B
D(Spring Cloud config):::service --> B
E(Spring Eureka service):::service --> B
F(Kafka server):::service --> B
G(OAuth2 authentication service):::service --> B
B --> H(Amazon ECS):::service
H --> I(Postgres database):::service
H --> J(ElastiCache database):::service
style B fill:#FFFFCC,stroke:#FFBC52,stroke-width:2px;
- 所有核心EagleEye服务 :除数据库和Redis集群外,所有EagleEye服务将作为Docker容器部署在单节点ECS集群中。ECS会配置和设置运行Docker集群所需的所有服务器,并监控容器健康状况,在服务崩溃时重启服务。
- 数据库和缓存服务 :将使用Amazon RDS和Amazon ElastiCache服务,而非自己的PostgreSQL数据库和Redis服务器。在实际部署中,数据库基础设施通常会先部署到虚拟机。
- 网络访问 :使用Amazon安全组,仅允许部署的ECS集群上的端口5555对外部世界开放,所有EagleEye服务只能通过监听端口5555的Zuul服务器访问。
- 服务保护 :仍使用Spring的OAuth2服务器保护服务,在访问组织和许可服务前,用户需通过身份验证服务进行身份验证,并在每次服务调用时提供有效的OAuth2令牌。
- 服务器可访问性 :所有服务器(包括Kafka服务器)不会通过暴露的Docker端口对外公开访问。
4.1 创建PostgreSQL数据库
要创建用于EagleEye服务的PostgreSQL数据库,需按以下步骤操作:
1. 登录Amazon AWS控制台(https://aws.amazon.com/console/),找到RDS链接并点击,进入RDS仪表板。
2. 在仪表板上点击“Launch a DB Instance”按钮。
3. 选择PostgreSQL数据库引擎,点击“Select”按钮,启动数据库创建向导。
4. 在向导中选择创建开发/测试数据库,使用免费层。
5. 设置PostgreSQL数据库的基本信息,包括主用户ID和密码,选择
db.t2.micro
数据库,无需多可用区部署。
6. 设置数据库安全组、端口信息和数据库备份信息,创建新的安全组,允许数据库公开访问,记录数据库名称和端口号,因开发数据库可禁用备份。
5. 操作前的先决条件
在设置Amazon基础设施之前,需要满足以下条件:
1. 拥有自己的Amazon Web Services (AWS) 账户,并且对AWS控制台和相关操作概念有基本了解。
2. 准备一个Web浏览器,用于通过控制台进行手动设置。
3. 安装Amazon ECS命令行客户端(https://github.com/aws/amazon - ecs - cli),用于进行服务部署。
如果对AWS不太熟悉,建议先设置AWS账户并安装上述工具,同时花时间熟悉该平台。对于完全新手,可参考相关书籍,如Michael和Andreas Wittig的《Amazon Web Services in Action》,其第一章有关于如何注册和配置AWS账户的详细教程。
此外,在操作时尽量使用Amazon提供的免费层服务,但设置ECS集群时使用的t2.large服务器每小时约需0.10美元。若不想产生高额费用,完成操作后需关闭服务。同时,要运行相关代码,需设置自己的GitHub仓库(用于应用配置)、Travis CI账户、Docker Hub(用于Docker镜像)和Amazon账户,并修改应用配置以指向自己的账户和凭证。
6. 部署总结
微服务的开发与部署是一个复杂且关键的过程。通过Spring Cloud Sleuth和Zipkin的分布式追踪,我们能够深入了解微服务之间的调用关系和性能瓶颈,为服务的优化提供有力支持。在添加自定义跨度时,详细的代码操作让我们可以对特定的第三方服务调用进行精准追踪。
而在微服务部署方面,遵循自动化、可重复、完整性和不可变性的原则构建部署管道是实现快速、稳定部署的关键。使用Travis CI、Docker和Amazon ECS等工具,我们能够将微服务高效地部署到云端,并通过平台测试确保服务的正常运行。
在EagleEye服务的云端部署中,合理设置核心基础设施,如将数据库和缓存服务迁移到Amazon云,使用安全组控制网络访问,以及利用OAuth2进行服务保护等,能够提高服务的安全性和可靠性。
总之,微服务的开发与部署需要综合考虑多个方面,通过合理运用各种工具和技术,才能构建出高效、稳定、安全的微服务架构。
| 技术工具 | 作用 |
|---|---|
| Spring Cloud Sleuth | 添加追踪信息,关联微服务调用日志 |
| Zipkin | 展示服务依赖关系,图形化事务流程 |
| Travis CI | 持续集成/部署云工具 |
| Docker | 构建不可变容器镜像 |
| Amazon ECS | 将微服务部署到Amazon云 |
| Spring Cloud Config | 分离应用配置与容器 |
| OAuth2 | 保护微服务 |
graph LR
classDef step fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A(开发微服务):::step --> B(添加追踪信息):::step
B --> C(构建Docker镜像):::step
C --> D(集成Maven脚本到Travis CI):::step
D --> E(推送到集中式仓库):::step
E --> F(部署到Amazon ECS):::step
F --> G(运行平台测试):::step
style F fill:#FFFFCC,stroke:#FFBC52,stroke-width:2px;
这个流程图展示了从微服务开发到部署的整个过程,每个步骤都紧密相连,共同构成了一个完整的微服务开发与部署体系。通过这种方式,我们能够更好地管理微服务的生命周期,提高开发和部署的效率。
超级会员免费看
12

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



