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=)
以上一个完成的分布式服务链路追踪系统完成。

原文地址:http://blog.51cto.com/13954634/2328529

时间: 2024-11-07 23:13:37

Spring Cloud 分布式链路跟踪 Sleuth + Zipkin + Elasticsear的相关文章

spring cloud 分布式链路跟踪(集成zipkin)

篇写了分布式链路追踪  spring cloud 分布式链路追踪 这样的链路追踪虽然可以解决问题 但日志太过于分散 如果微服务过多 就会变的相当复杂 zipkin就可以帮我们把链路调用的过程全部收集起来 它就像注册中心一样 分为客户端和服务端 想要使用 首先建一个模块 当作他的服务端 首先添加如下依赖 compile 'io.zipkin.java:zipkin-server' compile 'io.zipkin.java:zipkin-autoconfigure-ui' 在配置文件中配置它的

Spring Cloud(十二):分布式链路跟踪 Sleuth 与 Zipkin【Finchley 版】

Spring Cloud(十二):分布式链路跟踪 Sleuth 与 Zipkin[Finchley 版] 发表于 2018-04-24 | 随着业务发展,系统拆分导致系统调用链路愈发复杂一个前端请求可能最终需要调用很多次后端服务才能完成,当整个请求变慢或不可用时,我们是无法得知该请求是由某个或某些后端服务引起的,这时就需要解决如何快读定位服务故障点,以对症下药.于是就有了分布式系统调用跟踪的诞生. 现今业界分布式服务跟踪的理论基础主要来自于 Google 的一篇论文<Dapper, a Larg

Spring Cloud 微服务分布式链路跟踪 Sleuth 与 Zipkin

Zipkin 是一个开放源代码分布式的跟踪系统,由 Twitter 公司开源,它致力于收集服务的定时数据,以解决微服务架构中的延迟问题,包括数据的收集.存储.查找和展现.它的理论模型来自于Google Dapper 论文. 每个微服务向 Zipkin 报告计时数据,Zipkin 会根据调用关系通过 Zipkin UI 生成依赖关系图,显示了多少跟踪请求通过每个服务,该系统让开发者可通过一个 Web 前端轻松的收集和分析数据,例如用户每次请求服务的处理时间等,可方便的监测系统中存在的瓶颈. Zip

跟我学SpringCloud | 第十一篇:使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪

SpringCloud系列教程 | 第十一篇:使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如无特殊说明,本系列教程全采用以上版本 在分布式服务架构中,需要对分布式服务进行治理--在分布式服务协同向用户提供服务时,每个请求都被哪些服务处理?在遇到问题时,在调用哪个服务上发生了问题?在分析性能时,调用各个服务都花了多长时间?哪些调用可以并行执行?-- 为此,分布式

spring cloud分布式日志链路跟踪

首先要明白一点,为什么要使用链路跟踪? 当我们微服务之间调用的时候可能会出错,但是我们不知道是哪个服务的问题,这时候就可以通过日志链路跟踪发现哪个服务出错. 它还有一个好处:当我们在企业中,可能每个人都负责一个服务,我们可以通过日志来检查自己所负责的服务不会出错,当调用其它服务时,这时候出现错误,那么就可以判定出不是自己的服务出错,从而也可以发现责任不是自己的. 基于微服务之间的调用开始,如果看不懂的小伙伴,请先参考我上篇:spring cloud中微服务之间的调用以及eureka的自我保护机制

蚂蚁金服分布式链路跟踪组件 SOFATracer 数据上报机制和源码分析 | 剖析

2019新春支付宝红包技术大揭秘在线峰会将于03-07日开始,点击这里报名届时即可参与大牛互动. SOFAScalable Open Financial Architecture 是蚂蚁金服自主研发的金融级分布式中间件,包含了构建金融级云原生架构所需的各个组件,是在金融场景里锤炼出来的最佳实践.SOFATracer 是一个用于分布式系统调用跟踪的组件,通过统一的 TraceId 将调用链路中的各种网络调用情况以日志的方式记录下来,以达到透视化网络调用的目的,这些链路数据可用于故障的快速发现,服务

Spring Cloud 分布式事务管理

Spring Cloud 分布式事务管理 在微服务如火如荼的情况下,越来越多的项目开始尝试改造成微服务架构,微服务即带来了项目开发的方便性,又提高了运维难度以及网络不可靠的概率. Spring Cloud 分布式事务管理 单体式架构 微服务架构 优点: 缺点: 分布式事务的引入 分布式事务解决方案 基于XA协议的两阶段提交 消息事务+最终一致性 TCC编程模式 具体实现 LCN ByteTCC 在说微服务的优缺点时,有对比才会更加明显,首先说一下单体式结构 单体式架构 在单体式架构中,系统通常采

漫谈spring cloud分布式服务架构

详情请交流  QQ  709639943 01.漫谈spring cloud 与 spring boot 基础架构 02.漫谈spring cloud分布式服务架构 03.Node.js入门到企业Web开发中的应用 04.精通高级RxJava 2响应式编程思想 05.Java秒杀系统方案优化 高性能高并发实战 06.Java深入微服务原理改造房产销售平台 07.快速上手Linux 玩转典型应用 08.快速上手Ionic3 多平台开发企业级问答社区 09.Java Spring Security开

spring cloud分布式使用日志链路跟踪

首先要明白一点,为什么要使用链路跟踪? 当我们微服务之间调用的时候可能会出错,但是我们不知道是哪个服务的问题,这时候就可以通过日志链路跟踪发现哪个服务出错. 它还有一个好处:当我们在企业中,可能每个人都负责一个服务,我们可以通过日志来检查自己所负责的服务不会出错,当调用其它服务时,这时候出现错误,那么就可以判定出不是自己的服务出错,从而也可以发现责任不是自己的. 基于微服务之间的调用开始,如果看不懂的小伙伴,请先参考我上篇博客:spring cloud中微服务之间的调用以及eureka的自我保护