1.Sleuth 链路跟踪
- 随着系统规模越来越大,微服务之间调用关系变得错综复杂,一条调用链路中可能调用多个微服务,任何一个微服务不可用都可能造整个调用过程失败;
- spring cloud sleuth 可以跟踪调用链路,分析链路中每个节点的执行情况。
1.1微服务中添加 spring cloud sleuth
依赖
修改以下微服务的 pom.xml,添加 sleuth 依赖
- sp02-item-service
- sp03-user-service
- sp04-order-service
- sp11-zuul
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
1.2在控制台查看链路跟踪日志
- 通过 zuul 网关,访问 order-service
http://localhost:3001/order-service/112233
四个微服务的控制台日志中,可以看到以下信息:
[服务id,请求id,span id,是否发送到zipkin]
- 请求id:请求到达第一个微服务时生成一个请求id,该id在调用链路中会一直向后面的微服务传递
- span id:链路中每一步微服务调用,都生成一个新的id
zuul:
item:
user:
order:
2.Sleuth + Zipkin 链路分析
zipkin 可以收集链路跟踪数据,提供可视化的链路分析
链路数据抽样比例:
默认 10% 的链路数据会被发送到 zipkin 服务。可以配置修改抽样比例:
spring:
sleuth:
sampler:
probability: 0.1
2.1启动 Zipkin 时,连接到 RabbitMQ
java -jar zipkin-server-2.12.9-exec.jar --zipkin.collector.rabbitmq.uri=amqp://admin:admin@192.168.64.140:5672
2.2添加 zipkin、amqp 依赖
修改以下微服务
- sp02-item-service
- sp03-user-service
- sp04-order-service
- sp11-zuul
<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>
2.3 yml 添加RibbitMQ 的连接信息(修改配置中心)
spring:
application:
name: item-service
#防止配置中心的配置,覆盖应用的本地配置
cloud:
config:
override-none: true
rabbitmq:
host: 192.168.64.140
username: admin
password: admin
zipkin:
sender:
type: rabbit
2.4启动并访问服务,访问 Zipkin 查看链路分析
- http://localhost:3001/order-service/112233
刷新访问多次,链路跟踪数据中,默认只有 10% 会被收集到zipkin - 访问 zipkin
http://localhost:9411/zipkin
3.向Eureka注册正确的ip地址
- eureka客户端向eureka注册时, 会自动选择网卡, 并可能注册主机名而不是ip地址;
- 下面配置可以选择正确网卡的ip向eureka进行注册。
3.1选择正确网卡
- 服务器有多块网卡,要选择正确网卡的ip地址向eureka进行注册
- 编辑
bootstrao.yml
spring:
cloud:
inetutils:
ignored-interfaces: # 忽略的网卡
- VM.+
preferred-networks: # 要是用的网卡的网段
- 10\.8\.29\..+
3.2注册ip地址,而不是主机名
- 注册时,有可能自动选择主机名进行注册,而不使用ip地址. 主机名在局域网内有可能不会被正确的解析;
- 最好使用ip地址进行注册,而不注册主机名;
在应用配置application.yml
中配置:
eureka:
instance:
prefer-ip-address: true # 使用ip进行注册
instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port} # 界面列表中显示的格式也显示ip