前言
网上很多文章都提到过,springCloud2.X以后,官方不在推荐自己搭建Zipkin-server,确实是的。因为搭建过程太复杂,本身也不属于核心业务,没有太大必要,直接使用官方的zipkin-server的jar包,再简单配置一下客户端(采集端)即可以完美使用,这样才是正解。
但是本人最近项目比较闲,所以自己尝试玩玩吧,谁知已入红尘深似海啊,5天时间搭进去了···不过成就感还是有的,而且顺便练习了一下看源码。而且真的有体会的一件事是,还是官方文档和代码靠谱啊!
0.官方推荐用法
0.1Zipkin-server搭建
下载官方jar包
直接从maven下载
https://dl.bintray.com/openzipkin/maven/io/zipkin/java/zipkin-server/
尽量下载最新版本。
运行jar包
在jar的所在目录下运行cmd(这里说的是windows环境下),敲入下面的启动命令
java -jar zipkin-server-2.19.2-exec.jar --zipkin.collector.rabbitmq.addresses=localhost --zipkin.collector.rabbitmq.username=guest --zipkin.collector.rabbitmq.password=guest --STORAGE_TYPE=mysql --MYSQL_JDBC_URL=jdbc:mariadb://127.0.0.1:3306/zipkin?pass=123456^&user=root^&charset=utf8mb4^&password=123456^&useSSL=false^&useUnicode=yes^&characterEncoding=UTF-8
# 也可以用下面这种方式,总之要指定启动时的参数,主要是rabbitmq和数据库的。
java -jar zipkin-server-2.19.2-exec.jar --zipkin.collector.rabbitmq.addresses=localhost --zipkin.collector.rabbitmq.username=guest --zipkin.collector.rabbitmq.password=guest --STORAGE_TYPE=mysql --zipkin.storage.mysql.host=localhost --zipkin.storage.mysql.port=3306 --zipkin.storage.mysql.password=123456 --zipkin.storage.mysql.username=root
程序启动系欸按如下:(我这里运行的是2.19.2版本)
备注:
执行命令启动(Linux):
java -jar zipkin-server-2.19.2-exec.jar --STORAGE_TYPE=mysql --MYSQL_JDBC_URL=jdbc:mariadb://127.0.0.1:3306/zipkin?pass=lbl0168\&user=root\&charset=utf8mb4\&password=lbl0168\&useSSL=false\&useUnicode=yes\&characterEncoding=UTF-8
执行命令启动(windows):
java -jar zipkin-server-2.19.2-exec.jar --zipkin.collector.rabbitmq.addresses=localhost --zipkin.collector.rabbitmq.username=lbl --zipkin.collector.rabbitmq.password=123456 --STORAGE_TYPE=mysql --MYSQL_JDBC_URL=jdbc:mariadb://127.0.0.1:3306/zipkin?pass=lbl0168^&user=root^&charset=utf8mb4^&password=lbl0168^&useSSL=false^&useUnicode=yes^&characterEncoding=UTF-8
需要注意的是:Linux下的shell和Windows的cmd所使用的URL拼接符是不同的,windows的是^ , linux的是\
启动成功后,访问http://127.0.0.1:9411/zipkin/
客户端部署和配置
这里就不再重复写客户端的部署和设置了,和下面写的自己搭建zipkin-server的方式下搭建客户端方面没有任何区别。参见下文3.zipkin-consumer
的内容即可。
下面我们来自己尝试搭建zipkin-server服务端。作死开始····
1.eureka服务端
1.1pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
1.2application.yml
server:
port: 6868
spring:
application:
name: eureka # 服务名称
eureka:
instance:
hostname: localhost
server:
enableSelfPreservation: false # 关闭保护模式
client:
register-with-eureka: false # 不要注册自己到eureka服务中
fetch-registry: false # 是否从eureka中获取信息
service-url: # 配置注册中心访问地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
1.3启动引导类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
2.ZipnKin-Server配置
2.1pom.xml
<dependencies>
<!--eureka客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-eureka-client</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
<!-- zipkin 服务类-->
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-server</artifactId>
<version>2.12.3</version>
<!--排除日志,否则报错-->
<exclusions>
<exclusion>
<artifactId>log4j-slf4j-impl</artifactId>
<groupId>org.apache.logging.log4j</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- zipkin 界面-->
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
<version>2.12.3</version>
</dependency>
<!-- zipkin 存储到数据库需要引入此类 -->
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-storage-mysql</artifactId>
<version>2.12.3</version>
</dependency>
<!--保存到数据库需要如下依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--<!–包含spring-cloud-starter-sleuth和spring-cloud-sleuth-zipkin两个依赖–>-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
<!--连接rabbitmq并配置-->
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-collector-rabbitmq</artifactId>
<version>2.12.3</version>
</dependency>
</dependencies>
这里必须说一下,rabbitmq的依赖我测试了非常多,什么带stream的,binder的,统统不行,项目能启动,但是不见听队列,能看到数据被发送到了队列但是没有消费方,直到第5天,我看了源码,从collector的源码里拷贝了
zipkin-autoconfigure-collector-rabbitmq
,再加上yml的配置,一切都安静了。搞了我5天······原因都是没有消费方!自己写监听,是可以消费的,但就是不能自动创建监听消费队列里的数据。
2.2application.yml
zipkin:
collector:
rabbitmq:
addresses: 127.0.0.1
# username: guest
# password: guest
# concurrency: ${RABBIT_CONCURRENCY:1}
# # TCP connection timeout in milliseconds
# connection-timeout: ${RABBIT_CONNECTION_TIMEOUT:60000}
# queue: ${RABBIT_QUEUE:zipkin}
# virtual-host: ${RABBIT_VIRTUAL_HOST:/}
# useSsl: ${RABBIT_USE_SSL:false}
# uri: ${RABBIT_URI:}
storage:
type: mysql
MySQL
The MySQL v1 component uses MySQL 5.6+ features, but is tested against MariaDB 10.3.
意思是说,mysql版本5.6+以上。
下面的截图和说明都是自己5天时间里的尝试过程的总结,可以不用看。
zipkin-> collector->rabbitmq的设置是直接从源码的yml里拷贝的,因为有默认值所以不是所有的数据都要设置。下面来看源码:
autoconfigration的类依赖了zipkin-collector-rabbitmq是,我们去看这个工程的源码:
说实话没太仔细看源码,但是读出了一些信息:
- 我们引入的EnabledZipkinServer是属于zipkin2包下的,所以我们应该去找zipkin2的包中的源码,而不是去找zipkin包;
- 我们应该去找
zipkin.storage.type
这个配置,而且它默认的是mem
存储;
那我们就去找这个配置,肯定是去找yml配置文件了。
可以看到resources里面有两个yml,点看一看,管用的其实就只有一个,只是被另外一个引用。点进去看,我在这里直接涂有用的。
这样一看应该很清楚了,很多都已经设置了默认值,所以基本不用配置太多,但是我们要用到的addresses没有给定默认值。再往下看,下面的存储类型肯定是要改的。
而且改完之后,可以想到,后面肯定会进行各种数据库的设置。
但是,前面我们已经在spring->datasource节点下设置了数据源的配置,这怎么办呢?难道设置两遍?我自己测试的是,不需要按照源文件中的设置MySQL节点下的配置,直接配置datasource就可以。而且如果不配置datasource会报各种错。因为已经浪费了好几天就没再细测,反正只配置datasource是可用的**
。
所以最后的完整配置为:
server:
port: 9411
spring:
zipkin:
enabled: true
discovery-client-enabled: false # 关闭本工程的推送到zipkin服务的功能
# # 配置mysql
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/zipkin?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: 123456
continue-on-error: true
##数据库脚本创建地址,当有多个是可使用[x]表示集合第几个元素
schema[0]: classpath:/mysql.sql
sleuth:
enabled: false # 不开启数据采集,服务端不需要开启,否则页面会发出请求造成数据干扰
## zipkin启动报错无法访问的解决方法
management:
metrics:
web:
server:
auto-time-requests: false
zipkin:
collector:
rabbitmq:
addresses: 127.0.0.1
storage:
type: mysql
2.3启动引导类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import zipkin2.server.internal.EnableZipkinServer;
//import org.springframework.context.annotation.Bean;
//import zipkin2.storage.mysql.v1.MySQLStorage;
//import javax.sql.DataSource;
@SpringBootApplication
@EnableEurekaClient
@EnableZipkinServer
public class QddFreightZipkinApplication {
public static void main(String[] args) {
SpringApplication.run(QddFreightZipkinApplication.class, args);
}
}
3.zipkin-consumer
3.1pom.xml
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.qdd</groupId>
<artifactId>qdd_freight_service</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.qdd</groupId>
<artifactId>qdd_freight_count</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>qdd_freight_count</name>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.qdd</groupId>
<artifactId>qdd_freight_common_db</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!--eureka客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- 服务追踪 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
<!-- 使用消息的方式收集数据(使用rabbitmq) -->
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-collector-rabbitmq</artifactId>
<version>2.12.3</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
</dependencies>
</project>
3.2application.yml
server:
port: 8080 # 服务端口号
spring:
application:
name: freight-count # 服务名称
datasource: # 配置数据源
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/atest?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: 123456
zipkin:
base-url: http://localhost:9411
sender:
type: rabbit #sleuth 使用 rabbitmq 来向 zipkin 发送数据
# type: web # 使用默认 http 方式收集 span 需要配置此项
sleuth:
sampler:
probability: 1.0 # 配置采样率
# mq配置
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
# listener: # 这里配置了重试策略
# direct:
# retry:
# enabled: true
# simple:
# retry:
# enabled: true
# <!--构建springCloud微服务架构需放开注释-->
# main:
# allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册
# redis: # 配置redis数据库链接信息
# host: 127.0.0.1
# port: 6379
# password:
# jedis: # 配置jedis连接池
# pool:
# max-active: 8 # 最大并发数
# max-idle: 8 # 最大空闲数
# min-idle: 0 # 最小空闲数
# rabbitmq: # 消息中间件配置
# host: 192.168.200.128
eureka: # 配置注册中心
client:
service-url:
defaultZone: http://127.0.0.1:6868/eureka/
instance: # 优先使用ip
prefer-ip-address: true
#feign:
# hystrix:
# enabled: false
# client:
# config:
# default: #配置全局的feign的调用超时时间 如果 有指定的服务配置 默认的配置不会生效
# connectTimeout: 60000 # 指定的是 消费者 连接服务提供者的连接超时时间 是否能连接 单位是毫秒
# readTimeout: 20000 # 指定的是调用服务提供者的 服务 的超时时间() 单位是毫秒
##hystrix 配置
#hystrix:
# command:
# default:
# execution:
# timeout:
# #如果enabled设置为false,则请求超时交给ribbon控制
# enabled: true
# isolation:
# strategy: SEMAPHORE
# thread:
# # 熔断器超时时间,默认:1000/毫秒
# timeoutInMilliseconds: 100000
有些配置被注释掉了,都是可以用的,懒得改了。
3.3启动引导类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import tk.mybatis.spring.annotation.MapperScan;
@SpringBootApplication(exclude = SecurityAutoConfiguration.class)
@MapperScan(basePackages = {"com.qdd.mapper"})
@EnableEurekaClient
//@EnableFeignClients(basePackages = {"com.smartcomm.goods.feign", "com.smartcomm.pay.feign"})
public class FrieghtCountSystemApplication {
public static void main(String[] args) {
SpringApplication.run(FrieghtCountSystemApplication.class, args);
}
}
4.发起请求
请求成功后,查看zipkin的界面。
点进去看看细节:
用新版的LenUI查看也是可以的,好像显示的也更清晰。不过不影响咱们使用,个人习惯吧,我也没仔细琢磨过新的界面的用法。