本文主要有以下内容:
- 使用
sleuth + zipkin + rabbitmq
实现链路追踪
为什么需要链路追踪:在微服务开发过程中、往往会出现服务间互相调用的情况、当程序运行不符合预期时、我们往往需要查看日志进行问题定位、因此为了搞清楚服务之间的调用流程、就需要搭建链路追踪服务。
环境搭建
创建自定义网络:(定义网络主要是为了方便使用、如果能保证ip不发生变化、则不需要指定、笔者是笔记本在公司和家里来回切换、因此为了保证ip固定、所以指定ip)
docker network create --driver bridge --subnet=172.18.30.0/24 --gateway=172.18.30.1 dev-network
编写docker-compose.yml
内容如下:
version: '3.8'
services:
rabbitmq:
image: rabbitmq:3.9.7-management
container_name: rabbitmq
networks:
dev-network:
ipv4_address: 172.18.30.16
ports:
- "5672:5672"
- "15672:15672"
volumes:
- ./data:/var/lib/rabbitmq
- ./myplugins:/myplugins
zipkin:
image: openzipkin/zipkin
container_name: zipkin2
networks:
dev-network:
ipv4_address: 172.18.30.17
depends_on:
- rabbitmq
ports:
- "9411:9411"
environment:
RABBIT_ADDRESSES: 172.18.30.16:5672
networks:
dev-network:
external: true
执行docker-compose up
运行成功后在浏览器输入如下地址:
zipkin
:http://localhost:9411/zipkin/
可以看到页面则表明运行成功!rabbitmq
:localhost:15762
: 用户名/密码均为guest. 可以看到正常页面即可。
在rabbitmq
的ui
可以看到如下信息:
在启动zipkin服务时、可以通过rabbitmq.queue修改队列、默认为zipkin
微服务改造
在服务里面添加如下依赖,可以将mq
换成kafka、rocketmq
等、换成后者需要改变对应的yml中的配置。
<!-- Sleuth + Zipkin链路追踪 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>
在应用里面添加如下配置:
spring:
sleuth:
sampler:
# 采样率的概率,100%采样
probability: 1.0
# 每秒采样数字最高为100
rate: 1000
zipkin:
sender:
type: rabbit
# base-url: http://localhost:9411/
rabbitmq:
addresses: 127.0.0.1:5672
# 和zipkin服务器上的队列保持一致、否则无法消费消息
queue: zipkin
启动服务后、首先在nacos
查看对应服务的启动状况:
我这里只有两个服务调用关系为custormer-->produce
。
@RequestMapping("customer/")
@RestController
@Slf4j
public class CustomerController {
@Resource
private ProduceService produceService;
@RequestMapping("hello")
public Map hello() {
log.info("CustomerController => hello");
HashMap<String, Object> resultMap = new HashMap<>();
resultMap.putAll(produceService.produceHello());
return resultMap;
}
}
/**
* 创建时间: 2024年09月19日 13:34
* 文件描述:
*/
@RequestMapping("produce/")
@Slf4j
@RestController
public class ProduceController {
@GetMapping("hello")
public Map produceHello() {
log.info("ProduceController => hello");
HashMap<String, String> hashMap = new HashMap<>();
hashMap.put("hello", "customer");
hashMap.put("msg", "i am produce");
return hashMap;
}
}
访问customer/hello
在控制台可以看到如下答应信息:
生产者的服务信息如下:
上图中用红框框出来的部分就表明了请求顺序。这是因为:
- Zipkin对OpenFeign请求进行了修改、在请求头中添加了一个TranceID可以通过这个TranceID将整个信息串联起来。
- 生产服务中的第一个
9da214f3fb528ae7
就是消费者服务中传递过来的。- 消费者服务中的两个都一样是因为当前调用没有父级调用。
通过 zipkin
控制台也可以看到如下信息:
点击 show
可以看到如下详情信息:
更多信息请自己把玩
zipkin
吧。
关于zipkin
的更多介绍请点击这里,此链接详细说了TranceID
和ParentID
等信息。
关于slueth
的介绍请点击额这里。