白季飞龙的个人主页

Zipkin大杂烩

1. 客户端依赖

一个SpringCloudStarterZipkin即可。Spring会自动启用Zipkin和Sleuth。Zipkin服务端默认为本机9411端口

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zipkin</artifactId>
    <version>1.2.1.RELEASE</version>
</dependency>

2. 客户端

通过SpringMVC提供HTTP服务即可

package bj;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }

    @RequestMapping("/")
    public String index() {
        return "Hello World";
    }
}

3. 客户端配置(可选)

spring.sleuth.sampler.percentage=1

采样率默认10%,这里修改为100%,否则容易误以为Zipkin没工作

4.服务端

(用Spring Cloud CLI)

spring cloud zipkin

试验

  1. 访问本机http get :8080/(一次即可)
  2. 访问Zipkin服务(http://localhost:9411),刷新页面即可看到Zipkin探测到的服务和截获的请求

备注

如果用RestTemplate调用另一个服务的话,不能直接new一个RestTemplate,应该为RestTemplate定义一个全局的Bean。因为Zipkin需要在RestTemplate上做手脚,添加自己的header,用来标记请求是否在同一个链路。否则,Zipkin将记录下两条独立的请求,而不是一条完整的请求链路。

Zipkin分Zipkin1和Zipkin2,如果客户端用的Zipkin2,客户端用的Zipkin1,就会调用失败,因为接口404了。

尤其注意的是,Zipkin默认吞异常,所有的异常基本都吞,所以容易让人折腾半天搞不定。所以,最好将zipkin的日志级别调低至debug(logging.level.zipkin2=debug)

另外:SpringCloudCLI跑的Zipkin(spring cloud zipkin)可能是Zipkin1...

要与Feign结合使用的话,直接引入Feign依赖(spring-cloud-starter-feign),启用注解@EnableFeignClients即可

注意:自定义Sampler的Bean会导致Feign不调用Zipkin,最终导致调用端和被调用端成为两个独立的链路!记得,在框架的世界里,用不到的代码早点删掉!!!

/// 折腾死你没商量
@Bean
public Sampler defaultSampler() {
    return new AlwaysSampler();
}

漫漫路,莫论逍遥;潜心修,只为悟道