SpringCloud之分布式服务跟踪Spring Cloud Sleuth实例

一、简介

随着业务的发展,系统规模也会变得越来越大,各微服务间的调用关系也变得越来越错综复杂。通常一个由客户端发起的请求在后端系统中会经过多个不同的微服务调用来协同产生最后的请求结果,在复杂的微服务架构系统中,几乎每一个前端请求都会形成一条复杂的分布式服务调用链路,在每条链路中任何一个依赖服务出现延迟过高或错误的时候都有可能引起请求最后的失败。这时候,对于每个请求,全链路调用的跟踪就变得越来越重要,通过实现对请求调用的跟踪可以帮助我们快速发现错误根源以及监控分析每条请求链路上的性能瓶颈等。

针对上面所述的分布式服务跟踪问题,Spring Cloud Sleuth提供了 一套完整的解决方案。

二、Zipkin

Zipkin是Twitter的一个开源项目,它基于 Google Dapper 实现。我们可以使用它来收集各个服务器上请求链路的跟踪数据,并通过它提供的REST API接口来辅助查询跟踪数据以实现对分布式系统的监控程序,从而及时发现系统中出现的延迟升高问题并找出系统性能瓶颈的根源。除了面向开发的API接口之外,它还提供了方便的UI组件来帮助我们直观地搜索跟踪信息和分析请求链路明细,比如可以查询某段时间内各用户请求的处理时间等。

下图展示了Zipkin的基础架构, 它主要由4个核心组件构成。

SpringCloud之分布式服务跟踪Spring Cloud Sleuth实例_第1张图片

  • Collector:收集器组件,它主要处理从外部系统发送过来的跟踪信息,将这些信息转换为Zipkin内部处理的Span格式,以支待后续的存储、分析、展示等功能。
  • Storage:存储组件,它主要处理收集器接收到的跟踪信息,默认会将这些信息存储在内存中。我们也可以修改此存储策略, 通过使用其他存储组件将跟踪信息存储到数据库中。
  • RESTful API: API组件,它主要用来提供外部访问接口。比如给客户端展示跟踪信息,或是外接系统访问以实现监控等。
  • Web UI: UI组件,基于API组件实现的上层应用。通过UI组件,用户可以方便而又直观地查询和分析跟踪信息。

三、 搭建Zipkin Server

(1)新建一个SpringBoot项目,命名无要求;

(2)pom.xml,添加zipkin依赖


	
		io.zipkin.java
		zipkin-server
	
	
		io.zipkin.java
		zipkin-autoconfigure-ui
	
	
		org.springframework.boot
		spring-boot-starter-web
	

	
		org.springframework.boot
		spring-boot-starter-test
		test
	
(3)application.yml

spring:
  application:
    name: zipkin-server
server:
  port: 5595
(4)入口类

@EnableZipkinServer
@SpringBootApplication
public class SpringcloudsleuthzipkinApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringcloudsleuthzipkinApplication.class, args);
	}
}
(5)创建完上述工程之后,我们将其启动起来,并访问http: I /localhost:5595/, 可以看到如下图所示的Zipkin管理页面:

SpringCloud之分布式服务跟踪Spring Cloud Sleuth实例_第2张图片

四、搭建trace1-client

(1)创建一个SpringBoot项目,命名无要求;

(2)pom.xml



    4.0.0

    com.example
    springcloudsleuthtrace1
    0.0.1-SNAPSHOT
    jar

    springcloudsleuthtrace1
    Demo project for Spring Boot

    
        org.springframework.boot
        spring-boot-starter-parent
        1.5.9.RELEASE
        
        
    

    
        UTF-8
        UTF-8
        1.8
        Edgware.SR1
    

    
        
            org.springframework.boot
            spring-boot-starter-web
        
        
            org.springframework.cloud
            spring-cloud-starter-zipkin
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    

    
        
            
                org.springframework.cloud
                spring-cloud-dependencies
                ${spring-cloud.version}
                pom
                import
            
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    

(3)application.yml

server:
  port: 5596

spring:
  zipkin:
    base-url: http://localhost:5595
  application:
    name: trace1-client
(4)入口类

@RestController
@EnableDiscoveryClient
@SpringBootApplication
public class Springcloudsleuthtrace1Application {

    private static final Logger log = LoggerFactory.getLogger(Springcloudsleuthtrace1Application.class);

    @Bean
     @LoadBalanced
     RestTemplate restTemplate() {
        return new RestTemplate();
    }

    @RequestMapping(value = "/trace1", method = RequestMethod.GET)
    public String trace() {
        log.info("<<<<<-call trace1->>>>>");
        return restTemplate().getForEntity("http://localhost:5597/trace2", String.class).getBody();
    }

    public static void main(String[] args) {
        SpringApplication.run(Springcloudsleuthtrace1Application.class, args);
    }
}

五、搭建trace2-client

(1)创建一个SpringBoot项目,命名无要求;

(2)pom.xml



	4.0.0

	com.example
	springcloudsleuthtrace2
	0.0.1-SNAPSHOT
	jar

	springcloudsleuthtrace2
	Demo project for Spring Boot

	
		org.springframework.boot
		spring-boot-starter-parent
		1.5.9.RELEASE
		 
	

	
		UTF-8
		UTF-8
		1.8
		Edgware.SR1
	

	
		
			org.springframework.boot
			spring-boot-starter-web
		
		
			org.springframework.cloud
			spring-cloud-starter-zipkin
		
		
			org.springframework.boot
			spring-boot-starter-test
			test
		
	

	
		
			
				org.springframework.cloud
				spring-cloud-dependencies
				${spring-cloud.version}
				pom
				import
			
		
	

	
		
			
				org.springframework.boot
				spring-boot-maven-plugin
			
		
	
	

(3)application.yml

server:
  port: 5597

spring:
  zipkin:
    base-url: http://localhost:5595
  application:
    name: trace2-client
(4)入口类

@RestController
@EnableDiscoveryClient
@SpringBootApplication
public class Springcloudsleuthtrace2Application {

	private static final Logger log = LoggerFactory.getLogger(Springcloudsleuthtrace2Application.class);

	@RequestMapping(value = "/trace2", method = RequestMethod.GET)
	public String trace(){
		log.info("=====<<>>=====");
		return "Trace";
	}

	public static void main(String[] args) {
		SpringApplication.run(Springcloudsleuthtrace2Application.class, args);
	}
}

六、测试

(1)分别启动zipkin-server--端口5595;trace1-client--端口5596;trace2-client--端口5597;

(2)访问http://localhost:5596/trace1

SpringCloud之分布式服务跟踪Spring Cloud Sleuth实例_第3张图片
得到的结果是http://localhost:5597/trace2的内容,程序通过:

restTemplate().getForEntity("http://localhost:5597/trace2", String.class).getBody();
使用RestTemplate调用 trace2应用的接口。

(3)打开zipkin管理界面--依赖分析

SpringCloud之分布式服务跟踪Spring Cloud Sleuth实例_第4张图片

(4)打开zipkin管理界面--查找调用链

SpringCloud之分布式服务跟踪Spring Cloud Sleuth实例_第5张图片
(6)点击上图红框

SpringCloud之分布式服务跟踪Spring Cloud Sleuth实例_第6张图片

  • 通过以上的步骤,可以看到具体服务相互调用的数据


参考资料《Spring Cloud微服务实战》


新手一枚,欢迎拍砖~ ~ ~

你可能感兴趣的:(springcloud)