链路跟踪
通过监控图表,可以直观的看到业务调用执行的整条链路,都经历了哪些服务,哪些服务运行缓慢、进行了重试…都可以观察到
随着系统规模越来越大,微服务之间调用关系变得错综复杂,一条调用链路中可能调用多个微服务,任何一个微服务不可用都可能造整个调用过程失败
spring cloud sleuth 可以跟踪调用链路,分析链路中每个节点的执行情况
修改以下微服务的 pom.xml,添加 sleuth 依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
启动顺序:eureka---->config---->zuul---->其他的
通过 zuul 网关,访问 order-service
http://localhost:7001/order-service/5u6i5u4yu4y54
四个微服务的控制台日志中,可以看到以下信息:
[服务id,请求id,span id,是否发送到zipkin]
请求id: 请求到达第一个微服务时生成一个请求id,该id在调用链路中会一直向后面的微服务传递
span id: 链路中每一步微服务调用,都生成一个新的id
[zuul,6c24c0a7a8e7281a,6c24c0a7a8e7281a,false]
[order-service,6c24c0a7a8e7281a,993f53408ab7b6e3,false]
[item-service,6c24c0a7a8e7281a,ce0c820204dbaae1,false]
[user-service,6c24c0a7a8e7281a,fdd1e177f72d667b,false]
zipkin 可以收集链路跟踪数据,提供可视化的链路分析
默认 10% 的链路数据会被发送到 zipkin 服务。可以配置修改抽样比例
spring:
sleuth:
sampler:
probability: 0.1
链路日志发送到zipkin的方法:
② 方法更好,解耦
java -jar zipkin-server-2.12.9-exec.jar --zipkin.collector.rabbitmq.uri=amqp://admin:[email protected]:5672
修改以下微服务
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
检查一下application.yml
spring
rabbitmq:
host: 192.168.64.140
port: 5672
username: admin
password: admin
流程汇总:
- 添加 rabbitmq 依赖
- 添加 zipkin 客户端依赖,它会连接rabbitmq,向zipkin使用的一个固定队列发送日志
- 添加rabbitmq的连接信息
修改 config-files 中的四个yml文件- 设置发送链路日志的类型:rabbitmq
修改 config-files 中的四个yml文件:spring.zipkin.sender.type=rabbit
- config-files 提交、推送到远程仓库
http://localhost:7001/order-service/112233
刷新访问多次,链路跟踪数据中,默认只有 10% 会被收集到zipkin
访问 zipkin
http://localhost:9411/zipkin
服务器有多块网卡,要选择正确网卡的ip地址向eureka进行注册
修改 bootstrap.yml
spring:
cloud:
inetutils:
ignored-interfaces: # 忽略的网卡
- VM.*
preferred-networks: # 要是用的网卡的网段
- 192.168.0
注册时,有可能自动选择主机名进行注册,而不使用ip地址. 主机名在局域网内有可能不会被正确的解析
最好使用ip地址进行注册,而不注册主机名
在应用配置application.yml
中配置:
eureka:
instance:
prefer-ip-address: true # 使用ip进行注册
instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port} # 界面列表中显示的格式也显示ip