17.2 实践
在Spring Cloud 学习笔记 —— Spring Cloud Zipkin 简介和安装的基础上,我们创建一个项目,来在项目中实现 Sleath、Zipkin、RabbitMQ 的链路追踪
- 1.创建一个 Spring Boot 项目 zipkin01,添加 Web、Sleath、Zipkin、RabbitMQ、Stream依赖,Stream 依赖是方便发送到消息队列
创建完项目,配置 application.properties
spring.application.name=zipkin03
# 开启链路追踪
spring.sleuth.web.client.enabled=true
# 配置采用比例,默认是 0.1,这里方便测试改为 1,即 100%
spring.sleuth.sampler.probability=1
# 配置 zipkin 地址
spring.zipkin.base-url=http://192.168.99.100:9411
# 开启 zipkin
spring.zipkin.enabled=true
# 设置消息发送的类型
spring.zipkin.sender.type=rabbit
# rabbitmq 配置
spring.rabbitmq.host=192.168.99.100
spring.rabbitmq.port=32773
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
如上配置 ip 端口,参考 docker 中的显示:
创建一个测试的 Controller
@RestController
public class HelloController {
private static final Logger logger = LoggerFactory.getLogger(HelloController.class);
@GetMapping("/hello")
public String hello(String name){
logger.info("zipkin03-hello");
return "hello" + name;
}
}
- 2.创建一个跟 zipkin03 一样的项目 zipkin04
依赖一样,配置 application.properties 中添加 server.port 属性和更改 spring.application.name 属性
spring.application.name=zipkin04
server.port=8081
# 开启链路追踪
spring.sleuth.web.client.enabled=true
# 配置采用比例,默认是 0.1,这里方便测试改为 1,即 100%
spring.sleuth.sampler.probability=1
# 配置 zipkin 地址
spring.zipkin.base-url=http://192.168.99.100:9411
# 开启 zipkin
spring.zipkin.enabled=true
# 设置消息发送的类型
spring.zipkin.sender.type=rabbit
# rabbitmq 配置
spring.rabbitmq.host=192.168.99.100
spring.rabbitmq.port=32773
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
然后这个基础上,在启动类上添加 RestTemplate 的 Bean
@SpringBootApplication
public class Zipkin04Application {
public static void main(String[] args) {
SpringApplication.run(Zipkin04Application.class, args);
}
@Bean
RestTemplate restTemplate(){
return new RestTemplate();
}
}
创建一个测试的 Controller
@RestController
public class HelloController {
private static final Logger logger = LoggerFactory.getLogger(HelloController.class);
@Autowired
RestTemplate restTemplate;
@GetMapping("/hello")
public void hello(){
String s = restTemplate.getForObject("http://localhost:8080/hello?name={1}", String.class, "javaboy");
logger.info(s);
}
}
- 3.启动 zipkin03 和 zipkin04 然后访问 zipkin04 的 /hello 接口
zipkin04的:链路[zipkin04,a1c7cc0516de881b,a1c7cc0516de881b]
zipkin03的:[zipkin03,a1c7cc0516de881b,2d5a409c88c1dc13]
[zipkin04,a1c7cc0516de881b,a1c7cc0516de881b]和[zipkin03,a1c7cc0516de881b,2d5a409c88c1dc13]就好像从前一个传递过来一样
观察 zipkin 管理页面
打开
Span ID:a1c7cc0516de881b Parent ID:None
Span ID:04dfe8955136bd89 Parent ID:a1c7cc0516de881b
Span ID:2d5a409c88c1dc13 Parent ID:04dfe8955136bd89
总计:
Span ID:a1c7cc0516de881b Parent ID:None
Span ID:04dfe8955136bd89 Parent ID:a1c7cc0516de881b
Span ID:2d5a409c88c1dc13 Parent ID:04dfe8955136bd89
可以看到其实有 3 个 spanId :
第一个是请求进入 zipkon04 服务时;
第二个是从 zipkin04 到 RestTemplate 调用产生的 ;
第三个是从 RestTemplate 到 zipkon03 产生的;
这就是 zipkin 展示链路的过程,跟 kibana 的功能类似; - 4.所展示的内容就是 es-head 中的数据内容
还可以观看 RabbitMQ,它有一个队列就 zipkin
这就是 Sleuth、zipkin、RabbitMQ、ElasticSearch 搭建的日志查看功能,首先 Sleuth 收集日志,发送给 RabbitMQ 队列,RabbitMQ 队列发送给 ElasticSearch 储存,然后 Zipkin 展示 ElasticSearch 中的内容,以人性化的可视页面显示调用链路过程