本博客记录程序员DD的spring cloud Dalston版教程学习笔记
一、准备工作:
服务注册中心:eureka-server
微服务应用eureka-consumer-servicea、eureka-consumer-serviceb,直接将eureka-consumer-ribbon项目复制做修改。
eureka-consumer-serviceb实现一个REST接口/test2,eureka-consumer-servicea调用接口/test2
1.eureka-consumer-servicea修改,在DemoController中添加如下代码
private final Logger logger = Logger.getLogger(getClass());
......
/**
* <p>Description:创建一个接口调用 eureka-consumer-serviceb的接口通过日志记录调用路径</p>
* <p>version 1.0.0 </p>
* @author likai
* @date 2019/8/29 10:55
*/
@RequestMapping(value = "/test1", method = RequestMethod.GET)
public String test() {
logger.info("===<call test1>===");
return restTemplate.getForEntity("http://eureka-consumer-serviceb/test2", String.class).getBody();
}
修改配置文件
#指定注册到eureka server上的服务名称
spring.application.name=eureka-consumer-servicea
#端口
server.port=8010
#指定eureka server通信地址
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/
# 是否注册IP到eureka server,如不指定或设为false,那就会注册主机名到eureka server
eureka.client.instance.prefer-ip-address=true
eureka.instance.instance-id=${spring.application.name}:${random.int}
2…eureka-consumer-serviceb修改,在DemoController中添加如下代码
private final Logger logger = Logger.getLogger(getClass());
..........
/**
* <p>Description:创建一个接口提供给eureka-consumer-servicea调用 </p>
* <p>version 1.0.0 </p>
* @param
* @return
* @author likai
* @date 2019/8/29 10:57
*/
@RequestMapping(value = "/test2", method = RequestMethod.GET)
public String trace() {
logger.info("===<call test2>===");
return "test";
}
配置文件修改
#指定注册到eureka server上的服务名称
spring.application.name=eureka-consumer-serviceb
#端口
server.port=8011
#指定eureka server通信地址
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/
# 是否注册IP到eureka server,如不指定或设为false,那就会注册主机名到eureka server
eureka.client.instance.prefer-ip-address=true
eureka.instance.instance-id=${spring.application.name}:${random.int}
3.启动服务
访问http://localhost:8010/test1观察后台日志
--service A
2019-08-29 11:23:30.214 INFO 5668 --- [nio-8010-exec-4] c.s.s.controller.DemoController : ===<call test1>===
--service B
2019-08-29 11:23:30.220 INFO 4880 --- [nio-8011-exec-4] c.s.s.controller.DemoController : ===<call test2>===
二、实现跟踪
在eureka-consumer-servicea、eureka-consumer-serviceb pom依赖管理中增加spring-cloud-starter-sleuth依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
到这里,实际上我们已经为service A和service B实现服务跟踪做好了基础的准备,重启service A和service B。访问http://localhost:8010/test1观察后台日志
--service A
2019-08-29 11:30:34.962 INFO [eureka-consumer-servicea,b4ae0fabb112f793,b4ae0fabb112f793,false] 8544 --- [nio-8010-exec-6] c.s.s.controller.DemoController : ===<call test1>===
--service B
2019-08-29 11:30:34.968 INFO [eureka-consumer-serviceb,b4ae0fabb112f793,4df465b0ef103eed,false] 4780 --- [nio-8011-exec-3] c.s.s.controller.DemoController : ===<call test2>===
[eureka-consumer-servicea,b4ae0fabb112f793,b4ae0fabb112f793,false] 从上面的控制台内容中可看出多了一些诸如这样的日志
,而这些元素正是实现分布式服务跟踪的重要组成部分,它们每个值的含义如下:
- 第一个值:eureka-consumer-servicea,它记录了应用的名称,也就是application.properties中spring.application.name参数配置的属性。
- 第二个值:b4ae0fabb112f793,Spring Cloud Sleuth生成的一个ID,称为Trace ID,它用来标识一条请求链路。一条请求链路中包含一个Trace ID,多个Span ID。
- 第三个值:b4ae0fabb112f793,Spring Cloud Sleuth生成的另外一个ID,称为Span ID,它表示一个基本的工作单元,比如:发送一个HTTP请求。
- 第四个值:false,表示是否要将该信息输出到Zipkin等服务中来收集和展示。
上面四个值中的Trace ID和Span ID是Spring Cloud Sleuth实现分布式服务跟踪的核心。在一次服务请求链路的调用过程中,会保持并传递同一个Trace ID,从而将整个分布于不同微服务进程中的请求跟踪信息串联起来,以上面输出内容为例,eureka-consumer-servicea和eureka-consumer-serviceb同属于一个前端服务请求来源,所以他们的Trace ID是相同的,处于同一条请求链路中。