前言概述:
Zipkin 是一款开源的分布式实时数据追踪系统,主要功能是聚集来自各个异构系统的实时监控数据,和微服务架构下的接口直接的调用链路和系统延时问题。
Spring Cloud Sleuth是对ZipKin的进一步封装。在Spring Cloud Sleuth的封装中,Zipkin分为两端,一个是Zipkin服务端,一个是Zipkin客户端,客户端也就是微服务的应用,客户端会配置服务端的url地址,一旦发生服务间的调用的时候,会被配置在微服务里面的Sleuth的监听器监听,并生成相应的 Trace 和 Span 信息写进http报文头里面,并同时向Zipkin服务端上传这些信息,上传这些信息的主要方式有两种,一种是消息总线的方式如RabbitMq发送,还有一种是http报文的方式发送,向 Zipkin 服务端发送gzip的数据包,服务端接收到gzip的数据包进行解析,根据每个调用链路汇总成调用链路的信息。
项目搭建
1.新建项目一 (zipkin-server)
pom.xml添加依赖
<!-- zipkin server -->
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-server</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
</dependency>
application.yml
server:
port: 2001
spring:
application:
name: spc-zipkin-server
启动类
package com.portal;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import zipkin.server.EnableZipkinServer;
@SpringBootApplication
@EnableZipkinServer //启动服务链路跟踪
public class SpcZipkinServerApplication {
public static void main(String[] args) {
SpringApplication.run(SpcZipkinServerApplication.class, args);
}
}
配置完毕,启动项目,http:/localhost:2001
2.新建项目2 (zipkin-client)
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
application.yml
server:
port: 2002
spring:
zipkin:
#指定Zipkin路径
base-url: http://localhost:2001
application:
name: zipkin-client
测试类
package com.portal;
import java.util.LinkedHashMap;
import java.util.Map;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ControllerTest {
@GetMapping("/zipkin-test")
public Map<String, Object> getZipkin()
{
Map<String, Object> map = new LinkedHashMap<>();
map.put("姓名", "小北");
map.put("性别", "男");
map.put("地址", "北京市丰台区");
return map;
}
@GetMapping("/zipkin-str")
public String getStr()
{
return "I am SuperMan~~~";
}
}
启动类
package com.portal;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpcZipkinClientApplication {
public static void main(String[] args) {
SpringApplication.run(SpcZipkinClientApplication.class, args);
}
}
3,新建项目3(结合feign声明式调用项目2中的方法 ,zipkin-client)
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
<!-- feign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
application.yml
server:
port: 2003
spring:
zipkin:
base-url: http://localhost:2001
application:
name: zipkin-feign-client
新建接口类,注意:feign消费方式是基于接口的
我这里没有注册到eureka,所以采用的是指定接口名称和url的方式,参考的同学可以试试注册打Eureka会省事。因为我要测试两个方法,所以新建了两个接口类文件。
ZipkinMapper.class
package com.portal.mapper;
import java.util.Map;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
@FeignClient(name="zipkin-test",url="http://localhost:2002")
public interface ZipkinMapper {
@RequestMapping("/zipkin-test")
public Map<String, Object> getZipkin();
}
ZipkinMapper2.class
package com.portal.mapper;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
@FeignClient(name="zipkin-str",url="http://localhost:2002")
public interface ZipkinMapper2 {
@RequestMapping("/zipkin-str")
public String getZipkin();
}
编写测试类 ZipkinController.class
package com.portal.controller;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import com.portal.mapper.ZipkinMapper;
import com.portal.mapper.ZipkinMapper2;
@RestController
public class ZipkinController {
@Autowired
private ZipkinMapper _ZipkinMapper;
@Autowired
private ZipkinMapper2 _ZipkinMapper2;
@GetMapping("/getZipkin")
public Map<String, Object> getZipkin()
{
return _ZipkinMapper.getZipkin();
}
@GetMapping("/getStr")
public String getStr()
{
return _ZipkinMapper2.getZipkin();
}
}
OK~三个项目全部启动,测试项目接口,feign方式调用成功。
接口没问题,我们再来看一下Zipkin Server,访问http://localhost:2001
图中两个框框,就是我的项目实例名,并且可以直观的看出调用关系,里面有很多系统可供查看。到此Zipkin项目搭建成功。