1.背景与选型
1.1 背景
在现在阶段,微服务已经普遍的应用在中小企业了,那么出现了一个问题,当下图D服务出现错误时,你不知道是B、C、D那个服务出现了错误。所以需要使用微服务链路追踪准确快速的定位到错误位置。
1.2 选型
对于中小企业来说我认为有以下要求:
- 开源/免费
- 低耦合,不侵入代码
- 整合与使用简单,吞吐量适中
在以上场景下,放弃代码侵入性较强的mycat和兼容性较差、依赖较多的skywalking和pinpoint。选择了更为简单易用的Spring Cloud Sleuth + Zipkin,虽然提供的功能较为简单,但是对于中小企业完全满足日常需求。
1.3 Sleuth简单原理
如果你想知道在微服务调用链中那个服务出现问题,就需要将这些服务串起来,得知上游服务和下游服务。
当所有调用、返回请求携带图中这些参数后,通过携带信息就能得到服务间的链路、调用服务名、返回结果、服务的耗时等信息。就能完成链路追踪的效果。
2.集成Sleuth
2.1 集成
在所有微服务项目的pom.xml文件中加入以下代码即可。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
2.2 验证
当日志出现下文样式代表成功。
其中图中为Sleuth提供的四个参数。
- flowable-resource指当前微服务的application.name
- trace(跟踪):为下文跨度的集合,可以理解为当前服务一个接口需要调用多个服务,用trace id来表示所有调用的集合
- Span(跨度):为当前服务调用其他微服务发送一次http请求的唯一id
- true是否将数据传到Zipkin中,由于这里连接了Zipkin所以为true
2.3 查看
通过上图可以看到,flowable-resource调用systemportal的对应关系,可以获悉错误是在哪个服务中,但是,在日志较多的情况只通过观察日志是非常麻烦和复杂的,所以接下来引入Zipkin将日志可视化输出方便日常查看。
3.集成Zipkin
3.1 搭建
访问官网:https://github.com/openzipkin/zipkin 点击下文链接即可下载。
3.2 启动
java -jar zipkin-server-2.23.16-exec.jar
下载完毕后,执行上文命令启动jar包,访问http://localhost:9411/zipkin即可访问页面。
3.3 集成项目
在所有微服务项目pom.xml中加入下文代码。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
在所有微服务项目application。yml中加入以下配置。
zipkin:
base-url: http://127.0.0.1:9411/ #zipkin地址
discovery-client-enabled: false #不用开启服务发现
sleuth:
sampler:
rate: 10000 #每秒数据采集量,多余将丢弃
probability: 1.0 #采样百分比:收集请求书数量的百分比。(默认为0.1,如果100次访问只将10次上传给zipkin )
3.4 展示信息
访问主页可以看到微服务调用情况的列表,可以看到调用是否成功、发送http请求数量、调用时间、调用
也可以点击show查看调用的具体情况。可以看到发送请求是否成功、失败原因、调用时间等。
3.5 使用数据库
在使用Zipkin时,默认使用的内存存储,如果服务断掉的话,记录会全部丢失,所以我们可以使用Mysql保存调用数据。
下载数据库脚本后执行下文命令即可。
数据库脚本地址:https://github.com/openzipkin/zipkin/blob/master/zipkin-storage/mysql-v1/src/main/resources/mysql.sql
java -jar zipkin-server-2.23.16-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=ip --MYSQL_TCP_PORT=3306 --MYSQL_USER=root --MYSQL_PASS=root --MYSQL_DB=zipkin
MYSQL_HOST:数据库地址
MYSQL_TCP_PORT:数据库端口
MYSQL_USER:用户名
MYSQL_PASS:密码
根据官方文档来看,Mysql只建议在测试与演示时使用,生产环境建议ElasticSearch。