分布式链路跟踪sleuth(zipkin+kafka+elasticsearch)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分布式链路跟踪sleuth(zipkin+kafka+elasticsearch)相关的知识,希望对你有一定的参考价值。
参考技术A
sleuth也不是一个新鲜的东西,说白了就是一个APM的一个浓缩版,spring Cloud Sleuth为 spring Cloud提供了分布式跟踪的解决方案,它大量借用了Google Dapper、 Twitter Zipkin和 Apache HTrace的设计
构建了ELK的日志系统和监控系统这两个能够快速的发现系统中的问题,但是由于微服务架构中系统众多,系统之间的交互还比较复杂,在产生了大量的日志之后,可以帮助我们定位问题,但是在紧急情况下难以帮助我们快速,是快速的定位和解决问题,这个就调用链的设计初衷,在微服务中,调用链比较长的时候,如果出现问题,很容易出现踢皮球的情况,这种情况下,打开调用链,一看,谁的就是谁的不说不闹,多好。
市面上比较常见的APM有:pinpoint,Twitter的zipkin,美团的Cat,Google的Dapper,这里值得表扬美团,继续和金服的pk吧,最牛的还是Google,他发表了一篇Dapper就有好多公司去研究,最终形成自己的产品,不由的让我想起他的GFS,bigTable在大数据前期google为大数据所做的贡献,向慷慨的人致敬,懂得分享的人最可爱,嗯,对···进入正题
简单说一下调用链的东西TraceID 链路ID 在整个调用链中这个东西是不变的
SpanId 步骤ID 经过一个node就会变
ParentSpanID 很同意理解,这个spanId是从哪个span来的,这个设计很重要的
复杂的东西spring boot已经给我们封装好了
#######sleuth客户端
在需要跟踪的微服务中pom.xml加上
在application.yml中添加
pom.xml添加
并且在启动类上添加
客户端和服务端都启动,进入到zipkin服务端
可以根据时间,服务名称去查询,点击可查看调用链详情
因为现在zipkin的调用数据都是存在内存中的,一旦zipkin server重启,则意味着之前的都没有了,在这并发高的,一会就把内存挤爆了,所以最终zipkin的数据是要持久化的,要么mysql,这里采用ES,毕竟在大数据检索面前ES比mysql好很多很多
还有在页面请求量大的时候zipkin和ES直接联通存数据,肯定会阻塞,这里就用kafka来解决这个问题
pom.xml需要引入
application.yml添加
再次启动,加入数据,观察ES-head
已经将调用链存进去了,这里要感谢spring 将调用链集成,方便我们应用
望指正,不吝赐教
Spring Cloud 分布式链路跟踪 Sleuth + Zipkin + Elasticsear
随着业务越来越复杂,系统也随之进行各种拆分,特别是随着微服务架构的兴起,看似一个简单的应用,后台可能很多服务在支撑;一个请求可能需要多个服务的调用;当请求迟缓或不可用时,无法得知是哪个微服务引起的,这时就需要解决如何快速定位服务故障点,Zipkin 分布式跟踪系统就能很好的解决这样的问题。
那么到底怎么使用呢?接下来完成一个具体的实例来体会一把微服务链路追踪:
本文使用的 Spring Cloud Finchley 版本,和其他版本会有不同
我们使用user-service,order-service 作为两个微服务,zuul-gateway 作为服务网关
zuul-gateway -> order-service -> user-service, 形成服务调用链路,完成一次请求。
注意:Zipkin 不再推荐我们来自定义 Server 端,在最新版本的 Spring Cloud 依赖管理里已经找不到 Zipkin-server 了 ,根本就不需要自己新建一个 Zipkin-server 服务,网上的各种教程都数互相抄的,请无视
一,环境安装
本人使用 centos 7 ,java-10
安装 Zipkin:聚合各个业务系统之间的调用延迟数据
安装 RabbitMQ:系统调用数据传输
安装 Elasticsearch:系统调用数据持久化
安装Elasticsearch-head:Elasticsearch 可视化
二,创建微服务
user-service
以下是pom依赖文件
<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.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
org.springframework.cloud
spring-cloud-starter-sleuth
org.springframework.cloud
spring-cloud-starter-zipkin
org.springframework.cloud
spring-cloud-stream-binder-rabbit
新建@RestController 接口 UserOrderController,代码如下:
```
@RestController
public class UserOrderController {
@Autowired
private UserOrderService orderService;
@RequestMapping(value = "/getUserOrder", method = RequestMethod.GET)
public String getUserOrder() {
return orderService.getOrder();
}
}
说明:在 user-service 使用 FeignClient 调用 order-service 的 getOrder 服务
application.yml 配置文件如下:
spring:
application:
name: user-service
sleuth:
web:
client:
enabled: true
sampler:
probability: 1.0
zipkin:
base-url: http://192.168.10.100:9411/
enabled: true
sender:
type: RABBIT
rabbitmq:
addresses: 192.168.10.100
port: 15672
username: admin
password: 12345
virtual-host: sleuth
```
server:
port: 9100
zipkin 参数说明:
probability: 1.0 #将采样比例设置为 1.0,也就是全部都需要。默认是 0.1
base-url: http://192.168.10.100:9411/ #Zipkin 服务器的地址
order-service
pom依赖文件和user-service相同
新建@RestController 接口 OrderController,代码如下:
@RestController
public class OrderController {
@Value("${server.port}")
private String port;
@RequestMapping(value = "/getOrder", method = RequestMethod.GET)
public String getOrder() {
return "Success, Order-Service, Port :" + port;
}
}
说明:getOrder接口就是给 user-service 调用的
application.yml 配置文件和user-service相同
zuul-gateway网关
以下是pom依赖文件
```
org.springframework.cloud
spring-cloud-starter-netflix-zuul
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.springframework.cloud
spring-cloud-starter-sleuth
org.springframework.cloud
spring-cloud-starter-zipkin
org.springframework.cloud
spring-cloud-stream-binder-rabbit
```
application.yml 配置文件如下:
```
spring:
application:
name: zuul-gateway
sleuth:
web:
client:
enabled: true
sampler:
probability: 1.0
zipkin:
base-url: http://192.168.10.100:9411/
enabled: true
sender:
type: RABBIT
rabbitmq:
addresses: 192.168.10.100
port: 15672
username: admin
password: 12345
virtual-host: sleuth
server:
port: 9310
eureka:
client:
service-url:
defaultZone: http://localhost:8080/eureka/
zuul:
prefix: /v1
routes:
```
# http://localhost:9310/v1/user/
# user Api
user-api:
path: /user/**
serviceId: user-service
# order Api
order-api:
path: /order/**
serviceId: order-service
zipkin配置和user-service相同
zuul 路由配置自己找资料参考啊,这里不做说明
以上我们微服务全部完成,然后全部启动
三,启动各系统和组件
前面说不推荐用户自己创建 Zipkin服务,那怎么把数据传输到 Zipkin服务器呢?就是利用Zipkin的环境变量,通过环境变量让 Zipkin 从 RabbitMQ 中读取信息
1,启动Zipkin服务,并指定 RabbitMQ做数据传输,Elasticsearch持久化数据,启动命令如下:
java -jar zipkin.jar --RABBIT_URI=amqp://admin:[email protected]:5672/sleuth --STORAGE_TYPE=elasticsearch --ES_HOSTS=http//:localhost:9200 --ES_HTTP_LOGGING=BASIC
说明:
--RABBIT_URI=amqp://admin:[email protected]:5672/sleuth 指定用 RabbitMQ 做数据传输
--STORAGE_TYPE=elasticsearch --ES_HOSTS=http//:localhost:9200 --ES_HTTP_LOGGING=BASIC 指定用 Eelasticsearch 做数据传输
可配置的环境变量,请参考:https://www.rabbitmq.com/uri-spec.html
当然你觉得 搭建Elasticsearch太麻烦了,也可以用MYSQL 生成环境推荐使用 Elasticsearch,或者你只想自己试一下,那你可以不用存储,数据就在内存中。
2,启动RabbitMQ服务 http://192.168.10.100:15672/ 查看启动生个,推荐自己新建个用户,然后登录 查看。
3,启动Elasticsearch服务,http://192.168.10.100:9200/ 查看ES启动,注意Elasticsearch 不能用root用户启动,具体怎么操作请百度教程。
4,启动Elasticsearch-head,http://192.168.10.100:9100/ 可以看到界面,注意 集群健康值,要是未连接就是有问题,自己解决。
5,启动user-service,order-service,zuul-gateway 网关,请求你自己定义的接口,这个有错自己解决
查看RabbitMQ可视化界面,就能看到 数据传输信息。如下图:
![](http://i2.51cto.com/images/blog/201812/10/11efc7e6219f99476dd94b85590309d3.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
查看Zipkin可视化界面,就能看到服务调用链路信息。如下图:
![](http://i2.51cto.com/images/blog/201812/10/bbb6aacfa69b7a051f625fc382828027.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
查看Elasticsearch-head可视化界面,就能看到 Elasticsearch 存储的数据信息。如下图:
![](http://i2.51cto.com/images/blog/201812/10/98b12c8114c8d9cc165d873f7b8ef62d.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
以上一个完成的分布式服务链路追踪系统完成。!--数据传输-->!--服务链路追踪-->!--数据传输-->!--服务链路追踪-->以上是关于分布式链路跟踪sleuth(zipkin+kafka+elasticsearch)的主要内容,如果未能解决你的问题,请参考以下文章
Spring Cloud 分布式链路跟踪 Sleuth + Zipkin + Elasticsear
Spring Cloud Sleuth 全链路日志跟踪解决方案(强烈推荐)
分布式链路跟踪sleuth(zipkin+kafka+elasticsearch)
跟我学SpringCloud | 第十一篇:使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪
SpringCloud-Sleuth 分布式请求链路跟踪
Sleuth+Zipkin 实现 SpringCloud 链路追踪