什么是Sleuth Spring Cloud Sleuth 主要功能就是在分布式系统中提供追踪解决方案,并且兼容支持了 zipkin,只需要在pom文件中引入相应的依赖即可。
为什么使用zipkin 在微服务架构中,大的系统会有上百个服务,而且其中服务之间调用关系复杂,在蜘蛛网似的微服务调用链路中寻找一条业务调用线极为复杂,zipkin就是应对这个问题
阅读以下内容时你需要了解 本文使用的springcloud和boot的版本 可查看 springcloud与springboot版本配置
本文目录 1、构建 server-zipkin 2、构建注册中心 3、构建两个服务(模拟调用链) 4、最终调用验证
在spring Cloud为F版本的时候,已经不需要自己构建Zipkin Server了,只需要下载jar即可,可以使用我下面用到的版本 官方地址: https://dl.bintray.com/openzipkin/maven/io/zipkin/java/zipkin-server/ 百度网盘链接:https://pan.baidu.com/s/1QoZQWftn3vpALcmRotpg1A 提取码:3972
下载完执行运行 java -jar zipkin-server-2.12.9-exec.jar 1 默认端口 9411 访问zipkin就绪后 地址 127.0.0.1:9411构建注册中心可查看 服务的注册与发现
注册中心就绪后 地址 127.0.0.1:8761
构建服务provide-server1 和 provide-server2
为了方便演示,我们这里使用rest方式进行服务调用
在idea中创建新的工程 工程名 例: provide-server1
pom.xml依赖配置包含加入如下配置(前提是已经加入 springcloud与springboot版本配置的依赖配置)
<!-- SpringBoot整合Web组件 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- SpringBoot整合eureka客户端 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!-- 引入zipkin 依赖 ,提供zipkin客户端的功能 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zipkin</artifactId> </dependency> 在resources资源文件下创建 application.yml,并在该application.yml文件中加入如下配置 ###服务启动端口号 server: port: 8011 spring: application: ###服务名称(服务注册到eureka名称) name: provide-server1 zipkin: #指定zipkin服务端的url base-url: http://127.0.0.1:9411 sleuth: sampler: ##设定样本收集的比率为100% probability: 1.0 ###服务注册到eureka地址 eureka: client: service-url: #这里是注册中心的ip和端口号 defaultZone: http://127.0.0.1:8761/eureka ###注册到注册中心 register-with-eureka: true ###是否需要从eureka上获取注册信息 fetch-registry: true 在启动类加入如下代码 @SpringBootApplication @EnableEurekaClient public class ProvideServer1App { public static void main(String[] args) { SpringApplication.run(ProvideServer1App.class, args); } @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } } 创建web控制器 @RestController public class DemoController { @Autowired private RestTemplate restTemplate; @GetMapping("/testGet") public Object testGet() { String text = restTemplate.getForObject("http://provide-server2/testRPC", String.class); return text; } } 在idea中创建新的工程 工程名 例: provide-server2 依赖于 provide-server1 一致在resources资源文件下创建 application.yml,并在该application.yml文件中加入如下配置 ###服务启动端口号 server: port: 8021 spring: application: ###服务名称(服务注册到eureka名称) name: provide-server2 zipkin: #指定zipkin服务端的url base-url: http://127.0.0.1:9411 sleuth: sampler: ##设定样本收集的比率为100% probability: 1.0 ###服务注册到eureka地址 eureka: client: service-url: #这里是注册中心的ip和端口号 defaultZone: http://127.0.0.1:8761/eureka ###注册到注册中心 register-with-eureka: true ###是否需要从eureka上获取注册信息 fetch-registry: true 在启动类加入如下代码 @SpringBootApplication @EnableEurekaClient public class ProvideServer2App { public static void main(String[] args) { SpringApplication.run(ProvideServer2App.class, args); } } 创建web控制器 @RestController public class DemoController { @GetMapping("/testRPC") public Object testRPC() { return "Hello,I'm provide-server2"; } }目前为止捋一下服务和环境 eureka-server 127.0.0.1:8761 zipkin-server 127.0.0.1:9411 provide-server1 127.0.0.1:8011 provide-server2 127.0.0.1:8021 全部启动
调用下 provide-server1
provide-server1去调用了 provide-server2,所以返回的是 provide-server2接口的数据,到这里服务调用正常,那么我们再去zipkin看看有没有调用记录呢
查看zipkin调用记录 访问127.0.0.1:9411 如果没有记录的话点击 查找 按钮
点击这条记录 可以看到这次调用的详细信息
我们也可以通过结构图来查看更直观的调用链 可以看到在图中清晰的调用线路,以及请求的流向,真是功能强大,更多功能自己来尝试吧
最后说明一下,这个功能比较消耗性能,生产环境可以关闭,特别是配置 样本收集的比率为100%