本文是SpringCloud实战(七)-服务链路追踪(Spring Cloud Sleuth),若要关注前文,请点击传送门:
SpringCloud实战(六)-高可用的分布式配置中心(Spring Cloud Config)
前文我们介绍了分布式配置中心。本文主要讲述服务追踪组件zipkin,Spring Cloud Sleuth集成了zipkin组件。
一、Sleuth简介
Spring Cloud Sleuth 主要功能就是在分布式系统中提供追踪解决方案,并且兼容支持了 zipkin,你只需要在pom文件中引入相应的依赖即可。
二、服务追踪分析
微服务架构上通过业务来划分服务的,通过REST调用,对外暴露的一个接口,可能需要很多个服务协同才能完成这个接口功能,如果链路上任何一个服务出现问题或者网络超时,都会形成导致接口调用失败。随着业务的不断扩张,服务之间互相调用会越来越复杂。
随着服务的越来越多,对调用链的分析会越来越复杂。它们之间的调用关系也许如下:
三、构建server-zipkin
在spring Cloud为F版本的时候,已经不需要自己构建Zipkin Server了,只需要下载jar即可,下载地址:
https://dl.bintray.com/openzipkin/maven/io/zipkin/java/zipkin-server/
也可以在这里下载:
链接: https://pan.baidu.com/s/1k9YnUCpZzGfAeU2IlMuKxA 密码: jkpg
下载完成jar 包之后,需要运行jar,如下:
java -jar zipkin-server-2.10.1-exec.jar
访问浏览器localhost:9411
四、改造service-hi工程
本文基于前文的service-hi工程进行改造,将它改造为zipkin工程。
4.1 maven依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
4.2 配置文件(application.yml)
server:
port: 8762
spring:
application:
name: service-hi
zipkin:
base-url: http://localhost:9411/
sleuth:
sampler:
probability: 1
eureka:
client:
serviceUrl:
defaultZone: http://eureka-serve-01:8759/eureka/
feign:
hystrix:
enabled: true
在其配置文件application.yml通过 spring.zipkin.base-url 指定zipkin server的地址,这样我们通过引入spring-cloud-starter-zipkin依赖和设置spring.zipkin.base-url就完成了zipkin的集成。
4.3 启动类(EurekaClientApplication)
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@EnableHystrix
@EnableHystrixDashboard
@EnableCircuitBreaker
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run( EurekaClientApplication.class, args);
}
@Bean
public ServletRegistrationBean getServlet(){
HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
registrationBean.setLoadOnStartup(1);
registrationBean.addUrlMappings("/hystrix.stream");
registrationBean.setName("HystrixMetricsStreamServlet");
return registrationBean;
}
}
4.4 Controller层
@RestController
public class HelloController {
@Resource
LucyServiceHi lucyServiceHi;
@RequestMapping(value = "/hiLucy")
public String hiLucy(@RequestParam String name){
String str = lucyServiceHi.sayHiFromClientOne(name);
return str;
}
}
4.5 Service层
@FeignClient(value = "service-lucy",fallback = SchedualServiceHiHystric.class)
public interface LucyServiceHi {
@RequestMapping(value = "/hi",method = RequestMethod.GET)
String sayHiFromClientOne(@RequestParam(value = "name") String name);
}
@Component
public class SchedualServiceHiHystric implements LucyServiceHi {
@Override
public String sayHiFromClientOne(String name) {
return "sorry " + name;
}
}
五、创建service-lucy工程
创建过程同service-hi,引入相同的依赖,配置下spring.zipkin.base-url。
对外暴露接口:
@SpringBootApplication
@EnableEurekaClient
@RestController
public class EurekaLucyApplication {
public static void main(String[] args) {
SpringApplication.run( EurekaLucyApplication.class, args);
}
@Value("${server.port}")
String port;
@RequestMapping("/hi")
public String home(@RequestParam(value = "name", defaultValue = "zzx") String name) {
return "hi " + name + " ,i am from port:" + port;
}
}
六、演示追踪
依次启动上面的工程,打开浏览器访问:http://localhost:9411/,会出现以下界面:
访问 http://localhost:8762/hiLucy?name=zzx,浏览器出现
hi zzx ,i am from port:8767
再打开http://localhost:9411/的界面,点击Dependencies,可以发现服务的依赖关系:
点击find traces,可以看到具体服务相互调用的数据:
服务链路追踪(Spring Cloud Sleuth)搭建完成。