一个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>
通过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";
}
}
spring.sleuth.sampler.percentage=1
采样率默认10%,这里修改为100%,否则容易误以为Zipkin没工作
(用Spring Cloud CLI)
spring cloud zipkin
http get :8080/
(一次即可)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();
}