springcloud-sleuth+zipkin入门一

淺唱寂寞╮ 提交于 2019-12-07 10:14:52

说明

zipkin是twitter公司基于Google的drapper论文,创建一套分布式、服务计时框架,可以用于链路跟踪。目前有的java版本的实现有DropWizard zipkin和Springcloud-sleuth+zipkin等。本文是搭建Springcloud的入门实例。

重要概念

trace:个人理解,是一条链路的抽象,表示了一次完成的链路信息。traceid是该链路的唯一标识
span:是链路调用的节点,是链路上一次方法执行的过程。spanId是该过程的标识,同时span可以通过添加tag的方式附加业务信息。
Springcloud针对链路节点过程抽象了四种类型:
sr:server receive服务端接收
ss:server send 服务端发送
cr: client receive 客户端接收
cs:Client send 客户端发送。
下图说明了Springsleuth的链路调用图:
这里写图片描述
引入上下级span关系后可以形成下面链路图:
这里写图片描述

搭建Springcloud-sleuth+zipkin

1环境说明

  • 开发IDE:intellij IDEA2017
  • jdk:1.8
  • maven:3.3.9
  • springboot:1.5.2RELEASE
  • springcloud:Camden.SR7

2创建zipkin服务器

创建maven工程,并在pom.xml中引入zipkin相关依赖如下:

<!--引入Springzipkinserver-->
        <dependency>
            <groupId>io.zipkin.java</groupId>
            <artifactId>zipkin-server</artifactId>
            <version>2.4.2</version>
        </dependency>
        <!--引入Springzipkinwebui-->
        <dependency>
            <groupId>io.zipkin.java</groupId>
            <artifactId>zipkin-autoconfigure-ui</artifactId>
            <version>2.4.2</version>
        </dependency>

zipkinui是用于页面显示用的。
创建Springboot启动类,并添加注解@EnableZipkinServer,表示为zipkin服务器。

@SpringBootApplication
@EnableZipkinServer
public class ZipkinServerApplicatoin {

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

启动后访问http://localhost:8080即可看到zipkin页面。当然目前服务名没有选项。

3创建zipkin监控服务

创建maven项目并在pom.xml文件中加入如下代码:

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Camden.SR7</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--引入zipkin-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zipkin</artifactId>
        </dependency>
    </dependencies>

注意Springcloud依赖管理的版本,不同的版本可能会报错。这里我们使用的是Camden.SR7版本。

在resources/application.yml中加入如下配置:

server:
  port: 8082
spring:
  application:
    name: zipkinclientserverone
  zipkin:
    base-url: http://localhost:8080
  sleuth:
    sampler:
      percentage: 1.0

这里我们将抽样率percentage:设置为100%,表示会抽取所有记录。
创建rest客户端:


@RestController
public class SleuthController {

    @ResponseBody
    @RequestMapping("/sayHello/{name}")
    public String sayHello(@PathVariable String name) {
        return "hello " + name;
    }
}

启动服务后访问http://localhost:8082/sayHello/lisi,然后在http://localhost:8080中查看:
这里写图片描述
在服务列表中可以看到我们的客户端,选中查询,可以看到服务调用记录和耗时。

到这里最简单的单个服务的链路耗时调用就 完成了。

说明

  • 这种集成的zipkin信息是默认保存在内存中的
  • 客户端的sleuth信息,是通过socket请求发送到zipkin服务器的,客户端会不停扫描sleuth队列,一旦有信息就推送到zipkin服务器
  • 客户端多级服务链路采集是通过添加请求头实现的,原理是通过AOP切面,在请求头里添加链路信息,二级服务,通过filter获取链路信息并发送到zipkin服务器。
  • Spring支持的二级服务调用方式有:feign、resttemplate两种方式,当然,这两种方式都要求通过Spring容器来做。如果自己创建连接或者resttemplate是不可能被Spring处理的,毕竟是AOP方式实现链路信息添加。
  • zipkin服务端是通过HttpProcesser来处理链路信息,因此想要通过webfilter实现拦截是不可能的。

4多级服务调用链路

上面完成了单级服务调用,这里我们在创建一个zipkin监视服务,并且该服务为上面服务提供服务支持。创建过程如上面一致,只是将端口改为8888。这里不再赘述

5修改第一个工程加入RestTemplate支持和Feign支持

增加RestTemplate配置,由Spring管理restTemplate,否则不能被链路调用拦截。

@Configuration
public class RestTemplateConfiguration {

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

创建feign调用api

@FeignClient(name = "sleuthService",url = "http://localhost:8888")
public interface SleuthService {
    @RequestMapping("/sayHello/{name}")
    public String sayHello(@PathVariable(name="name")String name);
}

修改controller


@RestController
public class SleuthController {
    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private SleuthService sleuthService;

    @ResponseBody
    @RequestMapping("/sayHello/{name}")
    public String sayHello(@PathVariable String name) {
        return "hello " + name;
    }
    @ResponseBody
    @RequestMapping("/restHello/{name}")
    public String restHello(@PathVariable String name){
        return restTemplate.getForObject("http://localhost:8888/sayHello/" + name,String.class );
    }
    @ResponseBody
    @RequestMapping("/feignHello/{name}")
    public String feignHello(@PathVariable String name){
        return sleuthService.sayHello(name);
    }
}

启动后,访问系统我们可以在http://localhost:8080中看到如下依赖关系
这里写图片描述

参考资料
Spring官网资料
本文代码:
zipkinserver代码
监听目标服务一
监听目标服务二

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!