31、Spring Cloud Sleuth、Zipkin分布式追踪与微服务部署

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;

这个流程图展示了从微服务开发到部署的整个过程,每个步骤都紧密相连,共同构成了一个完整的微服务开发与部署体系。通过这种方式,我们能够更好地管理微服务的生命周期,提高开发和部署的效率。

基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究(Matlab代码实现)内容概要:本文围绕“基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究”,介绍了利用Matlab代码实现配电网可靠性的仿真分析方法。重点采用序贯蒙特卡洛模拟法对配电网进行长时间段的状态抽样统计,通过模拟系统元件的故障修复过程,评估配电网的关键可靠性指标,如系统停电频率、停电持续时间、负荷点可靠性等。该方法能够有效处理复杂网络结构设备时序特性,提升评估精度,适用于含分布式电源、电动汽车等新型负荷接入的现代配电网。文中提供了完整的Matlab实现代码案例分析,便于复现和扩展应用。; 适合人群:具备电力系统基础知识和Matlab编程能力的高校研究生、科研人员及电力行业技术人员,尤其适合从事配电网规划、运行可靠性分析相关工作的人员; 使用场景及目标:①掌握序贯蒙特卡洛模拟法在电力系统可靠性评估中的基本原理实现流程;②学习如何通过Matlab构建配电网仿真模型并进行状态转移模拟;③应用于含新能源接入的复杂配电网可靠性定量评估优化设计; 阅读建议:建议结合文中提供的Matlab代码逐段调试运行,理解状态抽样、故障判断、修复逻辑及指标统计的具体实现方式,同时可扩展至不同网络结构或入更多不确定性因素进行深化研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值