Spring Cloud 小试牛刀 之 Sleuth(六)
2018-02-24 09:37
363 查看
在分布式架构中,需要对分布式服务进行治理,也就是要记录到服务的调用和被调用的具体信息,比如调用时间,响应时间等等。称为服务的调用链。记录每个服务的调用链–分布式服务服务跟踪。
Spring Cloud Sleuth为Spring Cloud实现分布式跟踪解决方案。
Span:工作的基本单位 例如,发送RPC是一个新的跨度,以及向RPC发送响应。Span由跨度的唯一64位ID标识,跨度是其中一部分的跟踪的另一个64位ID。跨度还具有其他数据,例如描述,时间
4000
戳记事件,键值注释(标签),导致它们的跨度的ID以及进程ID(通常是IP地址)。
跨距开始和停止,他们跟踪他们的时间信息。创建跨度后,必须在将来的某个时刻停止。
启动跟踪的初始范围称为root span。该跨度的跨度id的值等于跟踪ID。
跟踪:一组spans形成树状结构。例如,如果您正在运行分布式大数据存储,则可能会由put请求形成跟踪。
注释: 用于及时记录事件的存在。用于定义请求的开始和停止的一些核心注释是:
cs - 客户端发送 - 客户端已经发出请求。此注释描绘了跨度的开始。
sr - 服务器接收 - 服务器端得到请求,并将开始处理它。如果从此时间戳中减去cs时间戳,则会收到网络延迟。
ss - 服务器发送 - 在完成请求处理后(响应发送回客户端时)注释。如果从此时间戳中减去sr时间戳,则会收到服务器端处理请求所需的时间。
cr - 客户端接收 - 表示跨度的结束。客户端已成功接收到服务器端的响应。如果从此时间戳中减去cs时间戳,则会收到客户端从服务器接收响应所需的整个时间。
可视化Span和Trace将与Zipkin注释一起查看系统:
构建项目server-zipkin,添加依赖
完整pom文件
启动类上加上注解@EnableZipkinServer,
配置文件作配置
server.port=9411
构建ZipkinClient项目,添加依赖
org.springframework.cloud
spring-cloud-starter-zipkin
完整pom文件
配置文件作如下配置
server.port=8999
spring.zipkin.base-url=http://localhost:9411
spring.application.name=service-sayhi
接口暴露
构建zipclient2,pom文件:
server.port=8989
spring.zipkin.base-url=http://localhost:9411
spring.application.name=service-sayhello
接口暴露
浏览器访问http://localhost:9411/
浏览器访问http://localhost:8989/sayHello
http://localhost:9411/dependency
可以看到服务之间相互调用的数据。
注意:接口名称不能使用info,info应该已经被内部使用了,调用info返回空数据。
Spring Cloud Sleuth为Spring Cloud实现分布式跟踪解决方案。
Span:工作的基本单位 例如,发送RPC是一个新的跨度,以及向RPC发送响应。Span由跨度的唯一64位ID标识,跨度是其中一部分的跟踪的另一个64位ID。跨度还具有其他数据,例如描述,时间
4000
戳记事件,键值注释(标签),导致它们的跨度的ID以及进程ID(通常是IP地址)。
跨距开始和停止,他们跟踪他们的时间信息。创建跨度后,必须在将来的某个时刻停止。
启动跟踪的初始范围称为root span。该跨度的跨度id的值等于跟踪ID。
跟踪:一组spans形成树状结构。例如,如果您正在运行分布式大数据存储,则可能会由put请求形成跟踪。
注释: 用于及时记录事件的存在。用于定义请求的开始和停止的一些核心注释是:
cs - 客户端发送 - 客户端已经发出请求。此注释描绘了跨度的开始。
sr - 服务器接收 - 服务器端得到请求,并将开始处理它。如果从此时间戳中减去cs时间戳,则会收到网络延迟。
ss - 服务器发送 - 在完成请求处理后(响应发送回客户端时)注释。如果从此时间戳中减去sr时间戳,则会收到服务器端处理请求所需的时间。
cr - 客户端接收 - 表示跨度的结束。客户端已成功接收到服务器端的响应。如果从此时间戳中减去cs时间戳,则会收到客户端从服务器接收响应所需的整个时间。
可视化Span和Trace将与Zipkin注释一起查看系统:
构建项目server-zipkin,添加依赖
<dependency> <groupId>io.zipkin.java</groupId> <artifactId>zipkin-server</artifactId> </dependency> <dependency> <groupId>io.zipkin.java</groupId> <artifactId>zipkin-autoconfigure-ui</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zipkin</artifactId> </dependency>
完整pom文件
<?xml version="1.0" encoding="UTF-8"?> <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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.heyuanjun.server-zipkin</groupId> <artifactId>server-zipkin</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>server-zipkin</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.8.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Camden.SR7</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zipkin</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>io.zipkin.java</groupId> <artifactId>zipkin-server</artifactId> </dependency> <dependency> <groupId>io.zipkin.java</groupId> <artifactId>zipkin-autoconfigure-ui</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> </repository> <repository> <id>repository.springframework.maven.snapshot</id> <name>Spring Framework Maven Snapshot Repository</name> <url>http://repo.spring.io/snapshot/</url> </repository> </repositories> </project>
启动类上加上注解@EnableZipkinServer,
/** * @author heyuanjun */ @SpringBootApplication @EnableZipkinServer public class ServerZipkinApplication { public static void main(String[] args) { SpringApplication.run(ServerZipkinApplication.class, args); } }
配置文件作配置
server.port=9411
构建ZipkinClient项目,添加依赖
org.springframework.cloud
spring-cloud-starter-zipkin
完整pom文件
<?xml version="1.0" encoding="UTF-8"?> <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. 107c4 0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.heyuanjun.zipkin-client</groupId> <artifactId>zipkin-client</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>zipkin-client</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.8.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Camden.SR7</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zipkin</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> </repository> <repository> <id>repository.springframework.maven.snapshot</id> <name>Spring Framework Maven Snapshot Repository</name> <url>http://repo.spring.io/snapshot/</url> </repository> </repositories> </project>
配置文件作如下配置
server.port=8999
spring.zipkin.base-url=http://localhost:9411
spring.application.name=service-sayhi
接口暴露
package com.heyuanjun.zipkinclient.zipkinclient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.cloud.sleuth.sampler.AlwaysSampler; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import java.util.logging.Level; import java.util.logging.Logger; /** * @author DELL */ @SpringBootApplication @RestController public class ZipkinClientApplication { public static void main(String[] args) { SpringApplication.run(ZipkinClientApplication.class, args); } private static final Logger LOG = Logger.getLogger(ZipkinClientApplication.class.getName()); @Autowired private RestTemplate restTemplate; @Bean @LoadBalanced public RestTemplate getRestTemplate(){ return new RestTemplate(); } @RequestMapping("/sayHello") public String callHome(){ LOG.log(Level.INFO, "调用zipClient2的sayHello"); return restTemplate.getForObject("http://127.0.0.1:8989/hi", String.class); } @RequestMapping("/hi") public String info(){ LOG.log(Level.INFO, "调用zipClient"); return "这里是 zipClint1 的info接口"; } @Bean public AlwaysSampler defaultSampler(){ return new AlwaysSampler(); } }
构建zipclient2,pom文件:
<?xml version="1.0" encoding="UTF-8"?> <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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.heyuanjun.zipclient2</groupId> <artifactId>zipclient2</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>zipclient2</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.8.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Camden.SR7</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zipkin</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> </repository> <repository> <id>repository.springframework.maven.snapshot</id> <name>Spring Framework Maven Snapshot Repository</name> <url>http://repo.spring.io/snapshot/</url> </repository> </repositories> </project>
server.port=8989
spring.zipkin.base-url=http://localhost:9411
spring.application.name=service-sayhello
接口暴露
package com.heyuanjun.zipclient2.zipclient2; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.cloud.sleuth.sampler.AlwaysSampler; import org.springframework.context.annotation.Bean; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import java.util.logging.Level; import java.util.logging.Logger; /** * @author DELL */ @SpringBootApplication @RestController public class Zipclient2Application { public static void main(String[] args) { SpringApplication.run(Zipclient2Application.class, args); } private static final Logger LOG = Logger.getLogger(Zipclient2Application.class.getName()); @RequestMapping("/hi") public String home(){ LOG.log(Level.INFO, "hi is being called"); return "这里是Cilent2的hi接口"; } @RequestMapping("/sayHello") public String info(){ LOG.log(Level.INFO, "调用zipClient的info"); return restTemplate.getForObject("http://127.0.0.1:8999/hi",String.class); } @Autowired private RestTemplate restTemplate; @Bean @LoadBalanced public RestTemplate getRestTemplate(){ return new RestTemplate(); } @Bean public AlwaysSampler defaultSampler(){ return new AlwaysSampler(); } }
浏览器访问http://localhost:9411/
浏览器访问http://localhost:8989/sayHello
http://localhost:9411/dependency
可以看到服务之间相互调用的数据。
注意:接口名称不能使用info,info应该已经被内部使用了,调用info返回空数据。
相关文章推荐
- 史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)
- springcloud(十二):使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪
- 使用Spring Cloud Sleuth实现链路监控
- Spring Cloud Sleuth 链路追踪
- Spring Cloud Sleuth使用简介
- Spring Cloud Sleuth
- 全链路spring cloud sleuth+zipkin
- Spring Cloud应用进行服务追踪分析(Zipkin和spring cloud Sleuth)
- Spring Cloud Sleuth Zipkin 升级使用
- Spring Cloud Sleuth 教程
- Spring Boot + Spring Cloud 构建微服务系统(八):分布式链路追踪(Sleuth、Zipkin)
- SpringCloud微服务实战之分布式服务跟踪Sleuth
- 使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪
- 企业级 SpringCloud 教程 (九) 服务链路追踪(Spring Cloud Sleuth)
- SpringCloud 教程 (二) 服务链路追踪(Spring Cloud Sleuth)
- Spring Cloud Sleuth进阶实战
- 史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)
- Spring Cloud Sleuth进阶实战
- 史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)
- spring cloud sleuth