一、简介
在上一篇文章中,通过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的搭建过程了,可以参考前面文章。
三、搭建zipkin服务端
【a】添加依赖,主要添加
spring-cloud-sleuth-zipkin-stream、spring-cloud-starter-stream-rabbit、zipkin-autoconfigure-ui依赖
<!--zipkin-rabbitmq支持-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin-stream</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
<!--zipkin可视化界面管理-->
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
</dependency>
具体pom.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.springcloud.wsh</groupId>
<artifactId>springcloud_zipkin_stream_server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>springcloud_zipkin_stream_server</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.10.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--zipkin-rabbitmq支持-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin-stream</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
<!--zipkin可视化界面管理-->
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
【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就算搭建成功了。
四、搭建网关服务springcloud_api_gateway
【a】pom依赖:主要引入
spring-cloud-starter-zuul、spring-cloud-starter-sleuth、spring-cloud-sleuth-stream、spring-cloud-starter-stream-rabbit
具体pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.springcloud.wsh</groupId>
<artifactId>springcloud_api_gateway</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>springcloud_api_gateway</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.10.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Dalston.SR5</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-stream</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
注意不需要引入
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
这样,网关服务就算搭建起来了。
五、搭建springcloud_user_service服务提供者
user-service项目大体上跟网关服务一致,主要多了暴露了一个接口给外部访问。
【a】pom依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.springcloud.wsh</groupId>
<artifactId>springcloud_user_service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>springcloud_user_service</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.10.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Dalston.SR5</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-stream</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
【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等消息中间件异步来收集跟踪信息的一些总结,仅供大家参考学习。