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的时间戳,可以计算出请求的响应耗时。
集成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
还没有评论,来说两句吧...