十八.springcloud极简入门-zipkin整合rabbitmq使用elasticsearch存储的高性能链路追踪方案(代码片段)

墨家巨子@俏如来 墨家巨子@俏如来     2022-12-07     405

关键词:

前言

之前讲过一个版本的Zipkin链路追踪,《Sleuth整合ZipKin链路追踪》,讲了Zipkin的工作流程,以及简单集成Zipkin,这篇文章将会对之前的方案进行升级,使用RabbitMQ异步收集数据,使用ElasticSearch进行数据存储。另外本文会使用Docker来搭建相关组件。 注意:请一定先看上一篇 Sleuth整合ZipKin链路追踪。学习该文章需要有一定的知识储备:Docker,ElasticSearch,RabbitMQ,SpringCloud等。

方案设计

Zipkin可以分为ZipKinServer端和Zipkin client 端,client端也就是咱们参与链路追踪的微服务。微服务需要整合Zipkin实时向Zipkin服务端发送链路数据,支持的方式有WEB(http),Rabbit,Kafka三种。ZipKinServer通过collector收集器收集链路数据,然后通过store把数据存储到内存或数据库或ElasticSearch。最后Zipkin通过UI把链路数据展示出来,大致原理图如下:


今天我们采用的方式是:

  1. 客户端使用rabbitmq的方式进行数据的异步推送,这样的方式性能更好,容错性更高,即使zIpkinserver挂了客户端也可以正常工作
  2. ZipkinServer的存储方式采用ElasticSearch,因为这种链路数据是非常庞大的,内存和数据库都不太适合存储。

组件环境安装

Docker安装

在准备好的linux机器上安装好Docker

# yum源指定
[root@localhost ~]# sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装docker
[root@localhost ~]# sudo yum -y install docker-ce
#启动dokcer
[root@localhost ~]# sudo systemctl start docker

使用阿里云镜像加速

[root@localhost ~]# vi /etc/docker/daemon.json
#加入如下内容

  "registry-mirrors": ["https://5pfmrxk8.mirror.aliyuncs.com"]

重启Docker

[root@localhost ~]# systemctl restart docker

ElasticSerach安装

ElasticSerach是用来存储链数据的全文搜索组件,专门应对大数据量的全文检索和存储。

#下载镜像
[root@localhost ~]# docker pull elasticsearch:6.8.6
# 启动容器
[root@localhost ~]# docker run --name elasticsearch -d -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -e "discovery.type=single-node" -p 9200:9200 -p 9300:9300 elasticsearch:6.8.6

访问测试:我的linux机器的ip是:192.168.119.129:9200

Kibana安装

Kibana是针对ElasticSearch的查询和分析统计的可视化工具

# 下载镜像
[root@localhost ~]# docker pull kibana:6.8.6
# 启动容器,通过ELASTICSEARCH_HOSTS指定es的地址
[root@localhost ~]# docker run --name kibana -e "ELASTICSEARCH_HOSTS=http://192.168.119.129:9200" -p 5601:5601 -d kibana:6.8.6

访问测试:我的linux机器的ip是:192.168.119.129:5601

安装RabbitMQ

RabbitMQ是一个高性能的消息队列,微服务把链路数据发送到MQ,zipkinserver从MQ中收集数据往ElasticSearch总存储

#下载镜像
[root@localhost ~]# docker pull rabbitmq:latest
#启动容器
[root@localhost ~]# docker run -d -v /opt/rabbitmq/data:/var/lib/rabbitmq -p 5672:5672 -p 15672:15672 --name rabbitmq --restart=always --hostname myRabbit rabbitmq
#安装可视化插件
[root@localhost ~]# docker exec -it rabbitmq rabbitmq-plugins enable rabbitmq_management

访问测试:我的linux机器的ip是:192.168.119.129:15672 , 登录账号是:guest/guest

安装ZipkinServer

ZipkinServer负责收集微服务发送过来的链路数据

#下载镜像
[root@localhost ~]# docker pull openzipkin/zipkin:2.14.1
#启动容器,指定存储方式为elasticsearch,并指定ElasticSearch主机,以及RabbitMQ的地址
[root@localhost ~]# docker run -d ---env STORAGE_TYPE=elasticsearch --env ES_HOSTS=192.168.119.129:9200 --env RABBIT_ADDRESSES=192.168.119.129:5672 -p 9411:9411 openzipkin/zipkin:2.14.1

这里指定存储方式为elasticsearch,并指定ElasticSearch主机,以及RabbitMQ的地址,它需要从RabbitMQ中拿到链路数据存储到ElasticSearch中。访问测试:我的linux机器的ip是:192.168.119.129:9411 ,

安装Zipkin-dependencies

当zipkin使用elasticsearch进行数据存储后,会丢失依赖关系,需要额外安装Zipkin-dependencies

#下载镜像
[root@localhost ~]# docker pull openzipkin/zipkin-dependencies:2.6.2
# 启动容器 ,存储方式为STORAGE_TYPE=elasticsearch ,并指定ES的主机
[root@localhost ~]# docker run  --name zipkin-dependencies --env STORAGE_TYPE=elasticsearch --env ES_HOSTS=192.168.119.129:9200 --env ES_INDEX=zipkin --rm=true -e JAVA_OPTS="-Xmx1024m -Xms1024m" openzipkin/zipkin-dependencies:2.6.2

出现这样的效果就可以了

到这里所有的组件准备完毕,使用 docker ps 查看容器

微服务准备

这里我基于Eureka做服务发现,搭建了Producer和Consumer两个微服务,服务之间使用OpfenFeign进行通信。项目结构如

springcloud-elk
|--- eureka-server #注册中心
|--- service-consumer #消费者
|--- service-producer #提供者

搭建父工程

 <!--SpringBoot-->
    <parent>
        <groupId> org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
    </parent>
    <dependencyManagement>
        <dependencies>

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

Eureka搭建

第一步导入POM

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>

第二步:编写启动内

@SpringBootApplication
@EnableEurekaServer
public class EurekaStarter 

    public static void main(String[] args) 
        SpringApplication.run(EurekaStarter.class ,args);
    


第三步:yml配置

server:
  port: 1000
eureka:
  instance:
    hostname: localhost #主机
  client: #客户端配置
    registerWithEureka: false  #EurekaServer自己不要注册到EurekaServer自己 ,只有EurekaClient才注册
    fetchRegistry: false  #EurekaServer不要拉取服务的通信地址列表 ,只有EurekaClient才拉取地址列表
    serviceUrl:  #注册中心的注册地址
      defaultZone: http://localhost:1000/eureka/  #http://$eureka.instance.hostname:$server.port/eureka/
  server:
    enable-self-preservation: false #关闭自我保护警告

服务提供者

第一步导入POM , 需要导入:spring-cloud-starter-zipkin整合zipkin ; 导入spring-rabbit整合RabbitMQ

<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zipkin</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.amqp</groupId>
            <artifactId>spring-rabbit</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>

第二步:启动类

@SpringBootApplication
public class ProducerStarter 

    public static void main(String[] args) 
        SpringApplication.run(ProducerStarter.class , args);
    


第三步:yml配置

#注册到EurekaServer
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:1000/eureka/ #注册地址
  instance:
    prefer-ip-address: true #使用ip地址进行注册
    instance-id: service-producer:3000	#实例ID
spring:
  application:
    name: service-producer
  rabbitmq: #rabbitMQ配置
    host: 192.168.119.129 #使用的是docker安装的RabbitMQ
    port: 5672
    username: guest
    password: guest
  zipkin:
    base-url: http://192.168.119.129:9411 #Zipkin服务端地址 ,可以使用ip地址也可以使用服务发现方式。
    discovery-client-enabled: false #如果使用服务发现的方式查找zipkin则打开为true
    sender:
      type: rabbit #使用MQ的方式发送链路数据,还可以是web,kafka
  sleuth:
    sampler:
      probability: 1.0 #链路数据收集率,越大收集的越全
server:
  port: 3000

第四步:编写一个controller,提供给消费者调用

@RestController
public class ProducerController 

    @RequestMapping("/hi")
    public String hi()
        return "hello";
    


服务消费者

第一步导入依赖:比提供者多一个OpenFeign的依赖,因为要做服务调用

 <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zipkin</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.amqp</groupId>
            <artifactId>spring-rabbit</artifactId>
        </dependency>
        <!--sleuth-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-sleuth</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>

第二步:启动类 , 这里开启Feign

@SpringBootApplication
@EnableFeignClients
public class ConsumerStarter 

    public static void main(String[] args) 
        SpringApplication.run(ConsumerStarter.class ,args);
    


第三步:编写feign客户端接口 , 该接口是用来调用提供者服务的

@FeignClient("service-producer")
public interface HIFeignClient 

    @RequestMapping("/hi")
    String hi();


第四步:编写controller,使用feign访问提供者

@RestController
public class ConsumerController 
    @Autowired
    private HIFeignClient feignClient;

    @RequestMapping("/hi")
    public String hi()
        return feignClient.hi();
    


第五步:yml配置

#注册到EurekaServer
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:1000/eureka/
  instance:
    prefer-ip-address: true #使用ip地址进行注册
    instance-id: service-consumer:4000	#实例ID
spring:
  application:
    name: service-consumer
  rabbitmq:
    host: 192.168.119.129
    port: 5672
    username: guest
    password: guest
  zipkin:
    base-url: http://192.168.119.129:9411 #Zipkin服务端地址 ,可以使用ip地址也可以使用服务发现方式。
    discovery-client-enabled: false #如果使用服务发现的方式查找zipkin则打开为true
    sender:
      type: rabbit #使用MQ的方式发送链路数据,还可以是web,kafka
  sleuth:
    sampler:
      probability: 1.0
server:
  port: 4000

到了,到这里所有的 微服务也准备完毕。

测试

依次启动:Eureka ,提供者服务(3000),消费者服务(4000) , 使用浏览器访问 http://localhost:4000/hi ,可以多访问几次,数据会收集多一点,

控制台效果

然后微服务会把链路调用数据发送到RabbitMQ中,而ZipkinServer会从RabbitMQ中数据并存储到ElasticSearch中。下面是ES中的效果:http://192.168.119.129:5601

在Discover中看到收集的数据

然后Zipkin会通过UI展示链路信息 http://192.168.119.129:9411/zipkin

查看依赖

文章结束希望对你有所帮助,喜欢的话请给个好评

springcloud-springcloud之sleuth分布式链路跟踪;zipkin埋点数据;elasticsearch数据持久化(十八)(代码片段)

阅读本文前可先参考​​​​​​SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客一、SpringCloudSleuth微服务有几种监控方式,如SpringBootActuator监控微服务,SpringBootAdmin监控微服务,Hy... 查看详情

微服务实践之全链路追踪(sleuth,zipkin)详解-springcloud(2021.0.x)-4(代码片段)

...自由转载出自:shusheng007文章目录前言链路追踪理论SpringCloud的实现方案Zipkin服务引入依赖配置使用总结源码前言本文将介绍微服务架构中关于链路追踪相关组件Sleuth与Zipkin的在SpringCloud入门使用。链路追踪为什么要进行链路... 查看详情

十九.springcloud极简入门-基于docker整合elk分布式日志解决方案

前言在微服务架构中服务众多,每个微服务都会产生大量的日志数据,服务的调用错综复杂,如何才能快速定位到BUG?所以日志收集是微服务项目不可或缺的。为了方便日志分析,我们需要对微服务的日志数... 查看详情

十九.springcloud极简入门-基于docker整合elk分布式日志解决方案(代码片段)

前言在微服务架构中服务众多,每个微服务都会产生大量的日志数据,服务的调用错综复杂,如何才能快速定位到BUG?所以日志收集是微服务项目不可或缺的。为了方便日志分析,我们需要对微服务的日志数... 查看详情

第二十八章springboot+zipkin(brave定制-asynchttpclient)

brave本身没有对AsyncHttpClient提供类似于brave-okhttp的ClientRequestInterceptor和ClientResponseInterceptor,所以需要我们定制,而ServerRequestInterceptor和ServerResponseInterceptor是在BraveServletFilter部分直接指定就好了(这在任何client技术下都可以 查看详情

31springcloud中整合zipkin进行服务跟踪zipkin-client

上一篇简介了ZipkinServer的搭建,但是从Springboot2.x版本后,Zipkin官网已经不再推荐自己搭建定制Zipkin,而是直接提供了编译好的jar包。详情可以查看官网:https://zipkin.io/pages/quickstart.html有了ZipkinServer还不能对微服务的调用链路进... 查看详情

springcloud分布式整合zipkin的链路跟踪

为什么使用zipkin?上篇主要写了:springcloud分布式日志链路跟踪从上篇中可以看出服务之间的调用,假设现在有十几台服务,那么在查找日志的时候比较繁琐、复杂,而且在查看调用的时候也会像蜘蛛网一样,量太大。这时候zipk... 查看详情

springcloud使用zipkin实现链路跟踪

参考技术AZipkin主要提供链路追踪的可视化,原理为:在服务调用的请求和响应中加入ID,表明上下游请求的关系;利用这些关系;可以可视化分析服务调用链路和服务间的依赖关系。zipkin的依赖包含Sleuth的依赖。添加配置实现测... 查看详情

springcloud链路追踪sleuth+twitterzipkin中zipkin服务

2021年5月15日随笔springboot2.2.x版本以上,不建议自己写服务了,我尝试了很多方法没有成功,各种问题,所以需要下载它的jar包然后执行 下载地址:https://repo1.maven.org/maven2/io/zipkin/zipkin-server/2.23.2/zipkin-server-2.23.2-exec.jar下载完... 查看详情

springcloud学习之sleuth+zipkin

一、什么是Sleuth  为服务之间调用提供链路追踪。通过Sleuth可以很清楚的了解到一个服务请求经过了哪些服务,每个服务处理花费了多长。从而让我们可以很方便的理清各微服务间的调用关系。二、Sleuth作用  2.1:耗时分析... 查看详情

sleuth+zipkin实现springcloud链路追踪(代码片段)

文章目录一、前言二、应用架构图三、快速了解Sleuth四、准备工作1、搭建Zipkin单机环境2、搭建naocos单机环境五、微服务整合Sleuth1、创建SpringBoot工程2、配置文件3、实现核心代码六、集成Zipkin1、引入客户端2、配置文件3、运行效... 查看详情

springcloud微服务分布式链路跟踪sleuth与zipkin

Zipkin是一个开放源代码分布式的跟踪系统,由Twitter公司开源,它致力于收集服务的定时数据,以解决微服务架构中的延迟问题,包括数据的收集、存储、查找和展现。它的理论模型来自于GoogleDapper论文。每个微服务向Zipkin报告... 查看详情

springcloud-config&bus&stream&sleuth+zipkin

SpringCloud-configSpringCloud-busSpringCloud-streamSpringCloud-sleuth、zipkin##Config>概念:分布式配置中心>作用:统一管理各个服务、环境配置、实现动态配置(优点:维护方便、灵活度比较高)>>![image-20200605101411241](imgimage-20200605101411 查看详情

从零搭建一个springcloud项目之sleuth+zipkin(代码片段)

在需要加监控的服务上进行以下操作一、加入Sleuth加依赖<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sleuth</artifactId></dependency>二、加入Zipkin2.1使 查看详情

springcloud系列微服务的链路追踪(代码片段)

微服务的链路追踪概述1、微服务架构下的问题2、Sleuth概述2.1、Sleuth简介2.2、相关概念2.3、链路追踪Sleuth入门3、Zipkin的概述3.1、ZipkinServer的部署和配置4、客户端Zipkin+Sleuth整合5、基于消息中间件收集数据5.1、RabbitMQ的安装与启... 查看详情

springcloud笔记八sleuthzipkin(代码片段)

zipkin服务端环境启动zipkin下载,进入github,找到Quick-start下载最新版本https://github.com/openzipkin/zipkin管理页面端口:9411在项目中配置sleuth、zipkinpom.xml <!--包含zipkin和sleuth--><dependency><groupId> 查看详情

springcloud分布式链路跟踪sleuth+zipkin+elasticsear

...一个具体的实例来体会一把微服务链路追踪:本文使用的SpringCloudFinch 查看详情

springcloud分布式链路跟踪sleuth+zipkin+elasticsear

...一个具体的实例来体会一把微服务链路追踪:本文使用的SpringCloudFinch 查看详情