将业务系统划分为数量众多的微服务,各个微服务之间通过Rest协议进行调用,如果
调用链路上的任意一个微服务出现故障或网络超时,都会导致整个功能失败,伴随
微服务模块数量越来越多,微服务之间的调用链条的关系也越来越复杂,可靠性越来
越低。Spring Cloud Sleuth为服务之间提供调用链条跟踪,可以跟踪微服务执行时间、
可视化错误展示,必须通过集成Zipkin显示、调用链条优化,对于调用比较频繁的服务,
实施优化措施
例程:在前面SERVICE-ORDER-CLIENT的基础上修改如下配置
4.0.0
com.gf
eureka-order-client
war
0.0.1-SNAPSHOT
eureka-order-client Maven Webapp
http://maven.apache.org
org.springframework.boot
spring-boot-starter-parent
1.5.2.RELEASE
UTF-8
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-eureka
org.springframework.cloud
spring-cloud-starter-feign
org.springframework.cloud
spring-cloud-starter-hystrix
org.springframework.boot
spring-boot-starter-actuator
org.springframework.cloud
spring-cloud-starter-hystrix-dashboard
org.springframework.cloud
spring-cloud-starter-sleuth
org.springframework.cloud
spring-cloud-dependencies
Dalston.SR1
pom
import
org.springframework.boot
spring-boot-maven-plugin
将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
%d{yyyy-MM-dd HH:mm:ss SSS} [%thread] %-5level %logger{36} - %msg%n
DEBUG
${CONSOLE_LOG_PATTERN}
utf8
日志中输出信息[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主要收集分布式服务的时间数据,主要包括四个组件
collector:数据采集;
storage:数据存储;
search:数据查询;
UI:数据展示
Zipkin提供可插拔数据存储方式:主要包括In-Memory,MySql,Cassandra或者Elasticsearch
POM.xml
4.0.0
com.gf
eureka-order
war
0.0.1-SNAPSHOT
eureka-order Maven Webapp
http://maven.apache.org
org.springframework.boot
spring-boot-starter-parent
1.5.2.RELEASE
UTF-8
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-eureka
org.springframework.cloud
spring-cloud-starter-hystrix
org.springframework.boot
spring-boot-starter-actuator
io.zipkin.java
zipkin-server
io.zipkin.java
zipkin-autoconfigure-ui
runtime
org.springframework.cloud
spring-cloud-dependencies
Dalston.SR1
pom
import
org.springframework.boot
spring-boot-maven-plugin
新建配置文件
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工程
POM.xml
4.0.0
com.gf
eureka-order
war
0.0.1-SNAPSHOT
eureka-order Maven Webapp
http://maven.apache.org
org.springframework.boot
spring-boot-starter-parent
1.5.2.RELEASE
UTF-8
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-eureka
org.springframework.cloud
spring-cloud-starter-hystrix
org.springframework.boot
spring-boot-starter-actuator
org.springframework.cloud
spring-cloud-starter-zipkin
org.springframework.cloud
spring-cloud-dependencies
Dalston.SR1
pom
import
org.springframework.boot
spring-boot-maven-plugin
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