Spring Cloud Sleuth配置

浅浅的花香味﹌ 2022-03-10 07:10 625阅读 0赞

将业务系统划分为数量众多的微服务,各个微服务之间通过Rest协议进行调用,如果
调用链路上的任意一个微服务出现故障或网络超时,都会导致整个功能失败,伴随
微服务模块数量越来越多,微服务之间的调用链条的关系也越来越复杂,可靠性越来
越低。Spring Cloud Sleuth为服务之间提供调用链条跟踪,可以跟踪微服务执行时间、
可视化错误展示,必须通过集成Zipkin显示、调用链条优化,对于调用比较频繁的服务,
实施优化措施

例程:在前面SERVICE-ORDER-CLIENT的基础上修改如下配置

POM.xml

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>com.gf</groupId>
  5. <artifactId>eureka-order-client</artifactId>
  6. <packaging>war</packaging>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <name>eureka-order-client Maven Webapp</name>
  9. <url>http://maven.apache.org</url>
  10. <!--
  11. SpringCloud是基于SpringBoot框架的,必须引入SpringBoot的依赖
  12. -->
  13. <parent>
  14. <groupId>org.springframework.boot</groupId>
  15. <artifactId>spring-boot-starter-parent</artifactId>
  16. <version>1.5.2.RELEASE</version>
  17. </parent>
  18. <properties>
  19. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  20. </properties>
  21. <dependencies>
  22. <dependency>
  23. <groupId>org.springframework.boot</groupId>
  24. <artifactId>spring-boot-starter-web</artifactId>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.springframework.cloud</groupId>
  28. <artifactId>spring-cloud-starter-eureka</artifactId>
  29. </dependency>
  30. <dependency>
  31. <groupId>org.springframework.cloud</groupId>
  32. <artifactId>spring-cloud-starter-feign</artifactId>
  33. </dependency>
  34. <dependency>
  35. <groupId>org.springframework.cloud</groupId>
  36. <artifactId>spring-cloud-starter-hystrix</artifactId>
  37. </dependency>
  38. <!-- feign hystrix+ribbon -->
  39. <dependency>
  40. <groupId>org.springframework.boot</groupId>
  41. <artifactId>spring-boot-starter-actuator</artifactId>
  42. </dependency>
  43. <dependency>
  44. <groupId>org.springframework.cloud</groupId>
  45. <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
  46. </dependency>
  47. <dependency>
  48. <groupId>org.springframework.cloud</groupId>
  49. <artifactId>spring-cloud-starter-sleuth</artifactId>
  50. </dependency>
  51. </dependencies>
  52. <!--
  53. Spring Cloud的命名没有按照版本方式管理,是采用命名方式,
  54. 版本名称采用伦敦地铁站的名称命名,根据字母表的顺序对应版本时间顺序,
  55. 比如最早的Release版本号为Angel,第二个Release版本为Brixton
  56. -->
  57. <dependencyManagement>
  58. <dependencies>
  59. <dependency>
  60. <groupId>org.springframework.cloud</groupId>
  61. <artifactId>spring-cloud-dependencies</artifactId>
  62. <version>Dalston.SR1</version>
  63. <type>pom</type>
  64. <scope>import</scope>
  65. </dependency>
  66. </dependencies>
  67. </dependencyManagement>
  68. <!--
  69. 根据SpringCloud约定打成可以独立执行Jar包,使用Maven命令
  70. mvn package spring-boot:repackage
  71. -->
  72. <build>
  73. <plugins>
  74. <plugin>
  75. <groupId>org.springframework.boot</groupId>
  76. <artifactId>spring-boot-maven-plugin</artifactId>
  77. </plugin>
  78. </plugins>
  79. </build>
  80. </project>

在这里插入图片描述

修改配置文件

将application.properties部分配置内容转移到bootstrap.properties配置文件中,bootstrap.properties优先加载,这样日志记录中可以跟踪服务名称。

bootstrap.properties

  1. server.port=8130
  2. spring.application.name=order-service-web

application.properties

  1. eureka.instance.hostname=localhost
  2. eureka.instance.server.port=8110
  3. eureka.client.serviceUrl.defaultZone=http://localhost:8110/eureka/
  4. feign.hystrix.enabled=true

添加日志文件logback-spring.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration>
  3. <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
  4. <springProperty scope="context" name="springAppName" source="spring.application.name"/>
  5. <property name="LOG_FILE" value="${BUILD_FOLDER:-build}/${springAppName}"/>
  6. <property name="CONSOLE_LOG_PATTERN" value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
  7. <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
  8. <layout class="ch.qos.logback.classic.PatternLayout">
  9. <Pattern>
  10. %d{yyyy-MM-dd HH:mm:ss SSS} [%thread] %-5level %logger{36} - %msg%n
  11. </Pattern>
  12. </layout>
  13. </appender>
  14. <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
  15. <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
  16. <level>DEBUG</level>
  17. </filter>
  18. <encoder>
  19. <pattern>${CONSOLE_LOG_PATTERN}</pattern>
  20. <charset>utf8</charset>
  21. </encoder>
  22. </appender>
  23. <root level="INFO">
  24. <appender-ref ref="console"/>
  25. </root>
  26. </configuration>

在这里插入图片描述

运行例程,日志输出如下
在这里插入图片描述

日志中输出信息[order-service-web,7e48eb3cbfcc11b3,7e48eb3cbfcc11b3,false]是
Sleuth的跟踪数据,格式为:[appname,traceId,spandId,exportable].
appname:是服务名称
traceId/spanId:是Sleuth调用链条的两个术语
exportable:是否发送给Zipkin

Sleuth术语:
Span:是最基本工作单元,Span通过唯一ID标识,一个RPC调用就是一个Span,Span有起始和结束。
Trace:一个树状结构的Span集合
Annotation:用于记录一个事件的时间信息,主要的Annotation如下
cs:代表客户端发送(Client Send),标识一个Span的开始
sr:服务端接收(Server Received),表示服务端接收到请求,并开始处理,如果减去cs的时间戳,可以计算出网络传输耗时。
ss:服务端完成请求处理(Server Send),应答信息返回客户端,如果减去sr的时间戳,可以计算出服务端处理请求的耗时。
cr:客户端接收(Client Received),标识着Span的结束,客户端成功的接收到服务端的应答信息,如果减去cs的时间戳,可以计算出请求的响应耗时。

集成Zipkin

Zipkin主要收集分布式服务的时间数据,主要包括四个组件
collector:数据采集;
storage:数据存储;
search:数据查询;
UI:数据展示
Zipkin提供可插拔数据存储方式:主要包括In-Memory,MySql,Cassandra或者Elasticsearch

新建工程Eurka-Zipkin

POM.xml

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>com.gf</groupId>
  5. <artifactId>eureka-order</artifactId>
  6. <packaging>war</packaging>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <name>eureka-order Maven Webapp</name>
  9. <url>http://maven.apache.org</url>
  10. <!--
  11. SpringCloud是基于SpringBoot框架的,必须引入SpringBoot的依赖
  12. -->
  13. <parent>
  14. <groupId>org.springframework.boot</groupId>
  15. <artifactId>spring-boot-starter-parent</artifactId>
  16. <version>1.5.2.RELEASE</version>
  17. </parent>
  18. <properties>
  19. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  20. </properties>
  21. <dependencies>
  22. <dependency>
  23. <groupId>org.springframework.boot</groupId>
  24. <artifactId>spring-boot-starter-web</artifactId>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.springframework.cloud</groupId>
  28. <artifactId>spring-cloud-starter-eureka</artifactId>
  29. </dependency>
  30. <dependency>
  31. <groupId>org.springframework.cloud</groupId>
  32. <artifactId>spring-cloud-starter-hystrix</artifactId>
  33. </dependency>
  34. <dependency>
  35. <groupId>org.springframework.boot</groupId>
  36. <artifactId>spring-boot-starter-actuator</artifactId>
  37. </dependency>
  38. <dependency>
  39. <groupId>io.zipkin.java</groupId>
  40. <artifactId>zipkin-server</artifactId>
  41. </dependency>
  42. <dependency>
  43. <groupId>io.zipkin.java</groupId>
  44. <artifactId>zipkin-autoconfigure-ui</artifactId>
  45. <scope>runtime</scope>
  46. </dependency>
  47. <!--
  48. <dependency>
  49. <groupId>org.springframework.cloud</groupId>
  50. <artifactId>spring-cloud-starter-sleuth</artifactId>
  51. </dependency>
  52. -->
  53. </dependencies>
  54. <!--
  55. Spring Cloud的命名没有按照版本方式管理,是采用命名方式,
  56. 版本名称采用伦敦地铁站的名称命名,根据字母表的顺序对应版本时间顺序,
  57. 比如最早的Release版本号为Angel,第二个Release版本为Brixton
  58. -->
  59. <dependencyManagement>
  60. <dependencies>
  61. <dependency>
  62. <groupId>org.springframework.cloud</groupId>
  63. <artifactId>spring-cloud-dependencies</artifactId>
  64. <version>Dalston.SR1</version>
  65. <type>pom</type>
  66. <scope>import</scope>
  67. </dependency>
  68. </dependencies>
  69. </dependencyManagement>
  70. <!--
  71. 根据SpringCloud约定打成可以独立执行Jar包,使用Maven命令
  72. mvn package spring-boot:repackage
  73. -->
  74. <build>
  75. <plugins>
  76. <plugin>
  77. <groupId>org.springframework.boot</groupId>
  78. <artifactId>spring-boot-maven-plugin</artifactId>
  79. </plugin>
  80. </plugins>
  81. </build>
  82. </project>

新建配置文件
bootstrap.properties

  1. server.port=8140
  2. spring.application.name=service-zipkin

启动类

  1. package com.gf.eureka_order;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
  5. import zipkin.server.EnableZipkinServer;
  6. @EnableZipkinServer
  7. @SpringBootApplication
  8. public class ZipkinServer {
  9. public static void main( String[] args )
  10. {
  11. SpringApplication.run(ZipkinServer.class, args);
  12. }
  13. }

修改Service-Order,Service-Order-Client工程

修改Service-Order工程
POM.xml

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>com.gf</groupId>
  5. <artifactId>eureka-order</artifactId>
  6. <packaging>war</packaging>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <name>eureka-order Maven Webapp</name>
  9. <url>http://maven.apache.org</url>
  10. <!--
  11. SpringCloud是基于SpringBoot框架的,必须引入SpringBoot的依赖
  12. -->
  13. <parent>
  14. <groupId>org.springframework.boot</groupId>
  15. <artifactId>spring-boot-starter-parent</artifactId>
  16. <version>1.5.2.RELEASE</version>
  17. </parent>
  18. <properties>
  19. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  20. </properties>
  21. <dependencies>
  22. <dependency>
  23. <groupId>org.springframework.boot</groupId>
  24. <artifactId>spring-boot-starter-web</artifactId>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.springframework.cloud</groupId>
  28. <artifactId>spring-cloud-starter-eureka</artifactId>
  29. </dependency>
  30. <dependency>
  31. <groupId>org.springframework.cloud</groupId>
  32. <artifactId>spring-cloud-starter-hystrix</artifactId>
  33. </dependency>
  34. <dependency>
  35. <groupId>org.springframework.boot</groupId>
  36. <artifactId>spring-boot-starter-actuator</artifactId>
  37. </dependency>
  38. <!--
  39. <dependency>
  40. <groupId>org.springframework.cloud</groupId>
  41. <artifactId>spring-cloud-starter-sleuth</artifactId>
  42. </dependency>
  43. -->
  44. <dependency>
  45. <groupId>org.springframework.cloud</groupId>
  46. <artifactId>spring-cloud-starter-zipkin</artifactId>
  47. </dependency>
  48. </dependencies>
  49. <!--
  50. Spring Cloud的命名没有按照版本方式管理,是采用命名方式,
  51. 版本名称采用伦敦地铁站的名称命名,根据字母表的顺序对应版本时间顺序,
  52. 比如最早的Release版本号为Angel,第二个Release版本为Brixton
  53. -->
  54. <dependencyManagement>
  55. <dependencies>
  56. <dependency>
  57. <groupId>org.springframework.cloud</groupId>
  58. <artifactId>spring-cloud-dependencies</artifactId>
  59. <version>Dalston.SR1</version>
  60. <type>pom</type>
  61. <scope>import</scope>
  62. </dependency>
  63. </dependencies>
  64. </dependencyManagement>
  65. <!--
  66. 根据SpringCloud约定打成可以独立执行Jar包,使用Maven命令
  67. mvn package spring-boot:repackage
  68. -->
  69. <build>
  70. <plugins>
  71. <plugin>
  72. <groupId>org.springframework.boot</groupId>
  73. <artifactId>spring-boot-maven-plugin</artifactId>
  74. </plugin>
  75. </plugins>
  76. </build>
  77. </project>

在这里插入图片描述
修改配置文件application.properties

  1. eureka.client.service-url.defaultZone=http://localhost:8110/eureka,http://localhost:8111/eureka
  2. eureka.client.register-with-eureka=true
  3. eureka.client.registry-fetch-interval-seconds=10
  4. eureka.client.fetch-registry=true
  5. spring.zipkin.base-url=http://localhost:8140
  6. spring.sleuth.sampler.percentage=1.0

在这里插入图片描述

同样修改Service-Order-Client工程

分布启动Eureka-Server,Service-Order,Service-Order-Client,Eureka-Zipkin

在浏览器中输入http://localhost:8140
在这里插入图片描述
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,625人围观)

还没有评论,来说两句吧...

相关阅读

    相关 spring cloud-sleuth原理浅析

    > 本文基于sleuth 2.2.5版本 sleuth是一个链路追踪工具,通过它在日志中打印的信息可以分析出一个服务的调用链条,也可以得出链条中每个服务的耗时,这为我们在实际

    相关 Spring Cloud Sleuth配置

    将业务系统划分为数量众多的微服务,各个微服务之间通过Rest协议进行调用,如果 调用链路上的任意一个微服务出现故障或网络超时,都会导致整个功能失败,伴随 微服务模块数量