spring-cloud-part 9 : spring cloud sleuth(服务链路追踪)

摘自 http://blog.csdn.net/forezp/article/details/70162074

一   简介 

 zipkin 是服务链路追踪组件,在springcloud中,spring cloud sleuth是集成了zipkin的;

换言之,spring cloud sleuth就是在分布式系统中提供追踪解决方案的,而且其兼容支持了zipkin,所以在微服务架构中,一般使用spring cloud sleuth来追踪服务链的调用;

二  服务追踪分析

  在微服务架构中是通过业务来划分服务的,通过REST来进行调用,对外暴露一个接口,通常需要很多个微服务协同作用来实现某个功能,如果其中某一个微服务调用失败或者网络超时,都会造成这个接口不可用。随着业务功能的越来越完善,服务之间的调用越来越复杂。所以随着服务的越来越多,它们的调用链也是越来越复杂。

三  实例操作

  该实例分为三个服务,sleuth-server是zipkin的server服务,service-hi 服务调用 service-miya 服务,service-miya 也调用 service-hi服务;

/**
* 1.sleuth-server
* 01 导包 io.zipkin.java zipkin-server + zipkin-autoconfigure-ui
* 02 配置application.yml
* server.port:9411
* 03 程序主入口类上加上 @EnableZipkinServer
* 2 service-hi
* 01 导包 org.springframework.cloud spring-cloud-starter-zipkin
* 02 配置application.yml配置文件
*   server.port:8988
*   spring.application.name:service-hi
*   spring.zipkin.base-url:http://localhost:9411
* 03 调用service-miya的服务 来使zipkin(sleuth)监控链路调用的组件监控中产生数据
     @SpringBootApplication
         @RestController
         public class ServiceHiApplication {

             @Autowired
             private RestTemplate restTemplate;

             private  static final Logger LOG=Logger.getLogger(ServiceHiApplication.class.getName());

             @RequestMapping("/hi")
             public String callHome(){
             LOG.log(Level.INFO,"calling trace service-hi");
             return restTemplate.getForObject("http://localhost:8989/miya",String.class);
             }

             @RequestMapping("/info")
             public String callInfo(){
             LOG.log(Level.INFO,"calling trace service-hi");
             return "this is service-hi";
             }

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

             @Bean
             public RestTemplate getRestTemplate(){
             return new RestTemplate();
             }

             @Bean  //在访问localhost:9411  时能够监控到调用关系和调用数据
             public AlwaysSampler getAlwaysSampler(){
             return new AlwaysSampler();
             }
         }      
   3  service-miya
01 导包 spring-boot-starter-web spring-cloud-starter-zipkin
02 配置application.yml 文件,端口 8989
03 主类中调用service-hi服务
    @SpringBootApplication
       @RestController
       public class ServiceMiyaApplication {
             @Autowired
             private RestTemplate restTemplate;
            
             private static final Logger LOG=Logger.getLogger(ServiceMiyaApplication.class.getName());
            
             @RequestMapping("/hi")
             public String callHome(){
             LOG.log(Level.INFO,"this is miya 方法");
             return "this is method miya";
             }
            
             @RequestMapping("/miya")
             public String getInfo(){
             LOG.log(Level.INFO,"hi is calling");
             return restTemplate.getForObject("http://localhost:8988/info",String.class);
             }
            
             public static void main(String[] args) {
             SpringApplication.run(ServiceMiyaApplication.class, args);
             }
            
             @Bean
             public RestTemplate getRestTemplate(){
             return new RestTemplate();
             }
        }       
 */

启动工程,演示追踪

依次启动上面的三个工程,打开浏览器访问:http://localhost:9411/,会出现以下界面:

Paste_Image.png

访问:http://localhost:8989/miya,浏览器出现:

i’m service-hi

再打开http://localhost:9411/的界面,点击Dependencies,可以发现服务的依赖关系:

Paste_Image.png

点击find traces,可以看到具体服务相互调用的数据:

Paste_Image.png

*   问题: 1.导包不写版本号   就会显示unknown--同问题3的,<parent></parent>要导正确
* 2.在zipkin界面 看不到服务追踪中的调用关系
* 3. 在一个project下面新建多个modules时候,父pom中导入的包,在子pom中怎样可以不需要重复导包 --子module中的<parent></parent>要导入父pom的groupId等信息,父pom里自己的<parent>要改成spring-boot-starter-parent

父pom中的<parent></parent>的写法

<?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.titter.springcloud</groupId>
    <artifactId>spring-cloud-eureka-s-0119</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.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>                //jdk版本号
        <spring-cloud.version>Edgware.SR1</spring-cloud.version>   //spring cloud的版本号
    </properties>   

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>    //统一整个项目中的spring-cloud的版本号
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    
</project>

  

子module中的写法如下:

<?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.titter.springcloud</groupId>
	<artifactId>eureka-register-service-backup</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>eureka-register-service-backup</name>
	<description>Demo project for Spring Boot</description>

	<parent>
		<groupId>com.titter.springcloud</groupId>
		<artifactId>spring-cloud-eureka-s-0119</artifactId>
		<version>1.0-SNAPSHOT</version>
	</parent>

	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-eureka-server</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<finalName>eureka-register-service-backup</finalName>
	</build>

</project>
原文地址:https://www.cnblogs.com/zdj-/p/8303428.html