在上一篇文章中,通过Spring Cloud Sleuth整合zipkin的时候,已经实现了通过Http方式来收集链路跟踪信息,除了使用http方式之外,还可以使用RabbitMQ等消息中间件来异步收集链路跟踪信息。结合Spring Cloud Stream可以使客户端将跟踪信息输出到消息中间件上,同时Zipkin服务端从消息中间件上异步收集这些信息。本章讲解通过RabbitMQ来收集链路信息。
【a】eureka-server:服务注册中心,端口1111
【b】springcloud_zipkin_stream_server: zipkin服务端,端口2222
【c】springcloud_api_gateway:api网关,端口3333
【d】springcloud_user_service:服务提供者,端口4444
我们准备发送一个类似 【前端发送请求】>>> 【网关服务】>>> 【服务提供者】这样的服务调用过程。这里就不讲解eureka的搭建过程了,可以参考前面文章。
【a】添加依赖,主要添加
spring-cloud-sleuth-zipkin-stream、spring-cloud-starter-stream-rabbit、zipkin-autoconfigure-ui依赖
org.springframework.cloud
spring-cloud-sleuth-zipkin-stream
org.springframework.cloud
spring-cloud-starter-stream-rabbit
io.zipkin.java
zipkin-autoconfigure-ui
具体pom.xml如下:
4.0.0
com.springcloud.wsh
springcloud_zipkin_stream_server
0.0.1-SNAPSHOT
jar
springcloud_zipkin_stream_server
Demo project for Spring Boot
org.springframework.boot
spring-boot-starter-parent
1.5.10.RELEASE
UTF-8
UTF-8
1.8
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-sleuth-zipkin-stream
org.springframework.cloud
spring-cloud-starter-stream-rabbit
io.zipkin.java
zipkin-autoconfigure-ui
org.springframework.cloud
spring-cloud-starter-eureka
org.springframework.cloud
spring-cloud-dependencies
Dalston.SR5
pom
import
org.springframework.boot
spring-boot-maven-plugin
【b】启动类加上@EnableEurekaClient和@EnableZipkinStreamServer
@EnableZipkinStreamServer作用:开启Zipkin通过消息中间件方式收集链路跟踪信息功能
@SpringBootApplication
@EnableZipkinStreamServer
@EnableEurekaClient
public class SpringcloudZipkinStreamServerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudZipkinStreamServerApplication.class, args);
}
}
【c】application.yml:注意需要配置rabbitMQ的一些信息(端口,主机,用户名,密码)、注册到服务注册中心等信息
server:
port: 2222
spring:
application:
name: zipkin-server
#RabbitMQ配置
rabbitmq:
port: 5672
username: guest
password: guest
host: localhost
#服务注册中心地址配置
eureka:
client:
serviceUrl:
defaultZone: http://localhost:1111/eureka/
这样zipkin server就算搭建成功了。
【a】pom依赖:主要引入
spring-cloud-starter-zuul、spring-cloud-starter-sleuth、spring-cloud-sleuth-stream、spring-cloud-starter-stream-rabbit
具体pom.xml:
4.0.0
com.springcloud.wsh
springcloud_api_gateway
0.0.1-SNAPSHOT
jar
springcloud_api_gateway
Demo project for Spring Boot
org.springframework.boot
spring-boot-starter-parent
1.5.10.RELEASE
UTF-8
UTF-8
1.8
Dalston.SR5
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-eureka
org.springframework.cloud
spring-cloud-starter-zuul
org.springframework.cloud
spring-cloud-starter-sleuth
org.springframework.cloud
spring-cloud-sleuth-stream
org.springframework.cloud
spring-cloud-starter-stream-rabbit
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
org.springframework.boot
spring-boot-maven-plugin
注意不需要引入
spring-cloud-sleuth-zipkin这个依赖,这个是采用http方式收集信息才需要引入的,否则会有冲突。
【b】启动类加上@EnableEurekaClient 、@EnableZuulProxy注解
@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
public class SpringcloudApiGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudApiGatewayApplication.class, args);
}
@Bean
public AlwaysSampler alwaysSampler() {
return new AlwaysSampler();
}
}
注意加入了AlwaysSampler只是为了调试,让zipkin100%采集信息。
【c】application.yml:主要配置rabbitmq、zuul路由匹配规则等信息
server:
port: 3333
spring:
application:
name: api-gateway
#RabbitMQ配置
rabbitmq:
host: localhost
username: guest
password: guest
port: 5672
#服务注册中心地址配置
eureka:
client:
serviceUrl:
defaultZone: http://localhost:1111/eureka/
#Zuul路由匹配
zuul:
routes:
user-service:
path: /user/**
serviceId: user-service
这样,网关服务就算搭建起来了。
user-service项目大体上跟网关服务一致,主要多了暴露了一个接口给外部访问。
【a】pom依赖
4.0.0
com.springcloud.wsh
springcloud_user_service
0.0.1-SNAPSHOT
jar
springcloud_user_service
Demo project for Spring Boot
org.springframework.boot
spring-boot-starter-parent
1.5.10.RELEASE
UTF-8
UTF-8
1.8
Dalston.SR5
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-eureka
org.springframework.cloud
spring-cloud-starter-sleuth
org.springframework.cloud
spring-cloud-sleuth-stream
org.springframework.cloud
spring-cloud-starter-stream-rabbit
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
org.springframework.boot
spring-boot-maven-plugin
【b】启动类
@SpringBootApplication
@EnableEurekaClient
public class SpringcloudUserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudUserServiceApplication.class, args);
}
@Bean
public AlwaysSampler alwaysSampler() {
return new AlwaysSampler();
}
}
注意加入了AlwaysSampler只是为了调试,让zipkin100%采集信息。
【c】application.yml配置
server:
port: 4444
spring:
application:
name: user-service
#RabbitMQ配置
rabbitmq:
host: localhost
username: guest
password: guest
port: 5672
#服务注册中心地址配置
eureka:
client:
serviceUrl:
defaultZone: http://localhost:1111/eureka/
【d】暴露接口
/**
* @Title: UserController
* @ProjectName springcloud_sleuth_rabbitmq_stream
* @Description: 测试Controller
* @Author WeiShiHuai
* @Date 2018/9/28 13:52
*/
@RestController
public class UserController {
@RequestMapping("/sayHello/{name}")
public String sayHello(@PathVariable("name") String name) {
return "hello , i am " + name;
}
}
依次启动eureka-server、zipkin-stream-server、api-gateway、user-service,当然前提要先装好rabbitmq并且启动rabbitmq server服务,项目启动完之后,浏览器访问http://localhost:15672 RabbitMQ Web管理界面,如下
可以看到,有一个名为sleuth exchange
的交换机实例对象,其实就是zipkin收集信息的默认主题。
这时候我们访问http://localhost:3333/user/sayHello/weixiaohuai,通过网关服务再去请求后端服务user-service,
可以看到接口成功返回数据,这时候我们访问zipkin可视化管理页面http://localhost:2222/,
由上面图可以看到,zipkin已经成功通过rabbitmq消息中间件收集了相关的链路跟踪数据,并且我们看到依赖关系dependencies。至此,通过Spring Cloud Sleuth 整合RabbitMQ来异步收集跟踪信息就算实现了。
Spring Cloud Sleuth支持通过http方式收集跟踪信息,也支持通过RabbitMQ等消息中间件异步来收集跟踪信息,客户端的一些信息被收集到消息中间件,然后zipkin服务端从消息中间件异步来收集这些链路信息。本文是作者对通过RabbitMQ等消息中间件异步来收集跟踪信息的一些总结,仅供大家参考学习。