Spring Cloud Sleuth配置

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

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

POM.xml

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.gf</groupId>
  <artifactId>eureka-order-client</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>eureka-order-client Maven Webapp</name>
  <url>http://maven.apache.org</url>

	<!-- 
		SpringCloud是基于SpringBoot框架的,必须引入SpringBoot的依赖
	 -->
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.2.RELEASE</version>
	</parent>


  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </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-feign</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix</artifactId>
        </dependency>
        <!-- feign hystrix+ribbon -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
        </dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-sleuth</artifactId>
		</dependency>
  </dependencies>
  
	<!-- 
		Spring Cloud的命名没有按照版本方式管理,是采用命名方式,
		版本名称采用伦敦地铁站的名称命名,根据字母表的顺序对应版本时间顺序,
		比如最早的Release版本号为Angel,第二个Release版本为Brixton
	 -->
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>Dalston.SR1</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>
	
	<!-- 
	 根据SpringCloud约定打成可以独立执行Jar包,使用Maven命令
	 mvn  package  spring-boot:repackage
	 -->
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

  
</project>

在这里插入图片描述

修改配置文件

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

bootstrap.properties

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

application.properties


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

添加日志文件logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	<include resource="org/springframework/boot/logging/logback/defaults.xml"/>

	<springProperty scope="context" name="springAppName" source="spring.application.name"/>

	<property name="LOG_FILE" value="${BUILD_FOLDER:-build}/${springAppName}"/>
	<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}"/>
	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
		<layout class="ch.qos.logback.classic.PatternLayout">
			<Pattern>
				%d{yyyy-MM-dd HH:mm:ss SSS} [%thread] %-5level %logger{36} - %msg%n
			</Pattern>
		</layout>
	</appender>
	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
		<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
			<level>DEBUG</level>
		</filter>
		<encoder>
			<pattern>${CONSOLE_LOG_PATTERN}</pattern>
			<charset>utf8</charset>
		</encoder>
	</appender>
	<root level="INFO">
		<appender-ref ref="console"/>
	</root>
</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的时间戳,可以计算出请求的响应耗时。

扫描二维码关注公众号,回复: 5726130 查看本文章

集成Zipkin

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

新建工程Eurka-Zipkin

POM.xml

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.gf</groupId>
  <artifactId>eureka-order</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>eureka-order Maven Webapp</name>
  <url>http://maven.apache.org</url>
	<!-- 
	SpringCloud是基于SpringBoot框架的,必须引入SpringBoot的依赖
	-->
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.2.RELEASE</version>
	</parent>
	
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</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-hystrix</artifactId>
		</dependency>
		
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-actuator</artifactId>
		</dependency>
		<dependency>
			<groupId>io.zipkin.java</groupId>
			<artifactId>zipkin-server</artifactId>
		</dependency>
		<dependency>
			<groupId>io.zipkin.java</groupId>
			<artifactId>zipkin-autoconfigure-ui</artifactId>
			<scope>runtime</scope>
		</dependency>
		<!-- 
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-sleuth</artifactId>
		</dependency>
		 -->
	</dependencies>
  
	<!-- 
		Spring Cloud的命名没有按照版本方式管理,是采用命名方式,
		版本名称采用伦敦地铁站的名称命名,根据字母表的顺序对应版本时间顺序,
		比如最早的Release版本号为Angel,第二个Release版本为Brixton
	 -->
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>Dalston.SR1</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>
	
	<!-- 
	 根据SpringCloud约定打成可以独立执行Jar包,使用Maven命令
	 mvn  package  spring-boot:repackage
	 -->
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

新建配置文件
bootstrap.properties

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

启动类

package com.gf.eureka_order;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

import zipkin.server.EnableZipkinServer;

@EnableZipkinServer
@SpringBootApplication
public class ZipkinServer {
    public static void main( String[] args )
    {
    	SpringApplication.run(ZipkinServer.class, args);
    }
}

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

修改Service-Order工程
POM.xml

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.gf</groupId>
  <artifactId>eureka-order</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>eureka-order Maven Webapp</name>
  <url>http://maven.apache.org</url>
	<!-- 
	SpringCloud是基于SpringBoot框架的,必须引入SpringBoot的依赖
	-->
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.2.RELEASE</version>
	</parent>
	
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</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-hystrix</artifactId>
		</dependency>
		
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-actuator</artifactId>
		</dependency>
		<!-- 
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-sleuth</artifactId>
		</dependency>
		 -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-zipkin</artifactId>
		</dependency>
	</dependencies>
  
	<!-- 
		Spring Cloud的命名没有按照版本方式管理,是采用命名方式,
		版本名称采用伦敦地铁站的名称命名,根据字母表的顺序对应版本时间顺序,
		比如最早的Release版本号为Angel,第二个Release版本为Brixton
	 -->
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>Dalston.SR1</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>
	
	<!-- 
	 根据SpringCloud约定打成可以独立执行Jar包,使用Maven命令
	 mvn  package  spring-boot:repackage
	 -->
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

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


eureka.client.service-url.defaultZone=http://localhost:8110/eureka,http://localhost:8111/eureka
eureka.client.register-with-eureka=true
eureka.client.registry-fetch-interval-seconds=10
eureka.client.fetch-registry=true

spring.zipkin.base-url=http://localhost:8140
spring.sleuth.sampler.percentage=1.0

在这里插入图片描述

同样修改Service-Order-Client工程

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

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

猜你喜欢

转载自blog.csdn.net/qixiang_chen/article/details/88374656