Spring Cloud 分布式链路跟踪 Sleuth + Zipkin + Elasticsearch

随着业务越来越复杂,系统也随之进行各种拆分,特别是随着微服务架构的兴起,看似一个简单的应用,后台可能很多服务在支撑;一个请求可能需要多个服务的调用;当请求迟缓或不可用时,无法得知是哪个微服务引起的,这时就需要解决如何快速定位服务故障点,Zipkin 分布式跟踪系统就能很好的解决这样的问题。

如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家

那么到底怎么使用呢?接下来完成一个具体的实例来体会一把微服务链路追踪:

本文使用的 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依赖文件

org.springframework.bootspring-boot-starter-weborg.springframework.cloudspring-cloud-starter-netflix-eureka-clientorg.springframework.bootspring-boot-starter-actuatororg.springframework.cloudspring-cloud-starter-openfeign<!--服务链路追踪-->org.springframework.cloudspring-cloud-starter-sleuthorg.springframework.cloudspring-cloud-starter-zipkin<!--数据传输-->org.springframework.cloudspring-cloud-stream-binder-rabbit

新建@RestController 接口 UserOrderController,代码如下:

@RestControllerpublicclassUserOrderController{@AutowiredprivateUserOrderService orderService;@RequestMapping(value ="/getUserOrder", method = RequestMethod.GET)publicString getUserOrder() {returnorderService.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:9100zipkin参数说明: 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.cloudspring-cloud-starter-netflix-zuulorg.springframework.cloudspring-cloud-starter-netflix-eureka-client<!--服务链路追踪-->org.springframework.cloudspring-cloud-starter-sleuthorg.springframework.cloudspring-cloud-starter-zipkin<!--数据传输-->org.springframework.cloudspring-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:12345@localhost:5672/sleuth--STORAGE_TYPE=elasticsearch--ES_HOSTS=http//:localhost:9200--ES_HTTP_LOGGING=BASIC

说明:

--RABBIT_URI=amqp://admin:12345@localhost: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可视化界面,就能看到 数据传输信息。如下图:

查看Zipkin可视化界面,就能看到服务调用链路信息。如下图:

查看Elasticsearch-head可视化界面,就能看到 Elasticsearch 存储的数据信息。如下图:

以上一个完成的分布式服务链路追踪系统完成。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容