摘自 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/,会出现以下界面:
访问:http://localhost:8989/miya,浏览器出现:
i’m service-hi
再打开http://localhost:9411/的界面,点击Dependencies,可以发现服务的依赖关系:
点击find traces,可以看到具体服务相互调用的数据:
* 问题: 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>