Spring Cloud Sleuth链路跟踪之使用RabbitMQ异步收集链路跟踪信息(学习总结)

一、简介

在上一篇文章中,通过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等消息中间件异步来收集跟踪信息的一些总结,仅供大家参考学习。

猜你喜欢

转载自blog.csdn.net/Weixiaohuai/article/details/82883280
今日推荐