文章目录

  • 一、简介
  • 二、安装运行
    • 1、三种方式安装启动
    • 2、访问测试 zipkin
  • 三、配置启动三个服务
    • 1、Gateway 项目
    • 2、SPRING-BOOT-SERVICE-DISCOVERY-CONSUMER 服务
    • 3、SPRING-CLOUD-SERVICE-OPENFEIGN 服务
  • 四、启动测试
    • 1、nacos 控制台
    • 2、Sentinel 控制台
    • 3、Zipkin 控制台

一、简介

zipkin 官网:https://zipkin.io/

Zipkin 是一个分布式链路追踪系统。它有助于收集解决服务架构中的延迟问题所需的时间数据

1、Sleuth 和 Zipkin 异同

Sleuth 和 Zipkin 都是用来做分布式链路跟踪的,Zipkin 包含了 sleuth (指的 spring-cloud-starter-zipkin 包含 spring-cloud-starter-sleuth),Zipkin 分为服务端和客户端,服务端提供了一个 UI 监控界面,客户端指的每个服务

2、为什么分布式系统要链路追踪?

简单说:假如服务 A -> B -> C -> D 调用顺序,如果 A 服务调用失败,排查失败原因时不能很快明确到底是哪个服务发生错误,使用分布式链路追踪可以很快明确哪个服务发生错误以及错误原因

3、traceid 和 spanid

分布式链路跟踪中的 traceid 和 spanid:https://blog.csdn.net/kevin_tech/article/details/117203420

二、安装运行

1、三种方式安装启动

①、下载可执行 jar

# Linux
curl -sSL https://zipkin.io/quickstart.sh | bash -s
nohup java -jar zipkin.jar >> out.log &
# window
下载地址:https://search.maven.org/search?q=zipkin-server 注意需要下载 exec.jar
start /min java -jar zipkin-server-2.23.16-exec.jar # start /min 类似 Linux 的 nohup 命令

②、源码下载

# get the latest source
git clone https://github.com/openzipkin/zipkin
cd zipkin
# Build the server and also make its dependencies
./mvnw -DskipTests --also-make -pl zipkin-server clean install
# Run the server
java -jar ./zipkin-server/target/zipkin-server-*exec.jar

③、docker 启动

docker pull openzipkin/zipkin
docker run -d -p 9411:9411 openzipkin/zipkin
2、访问测试 zipkin

zipkin 默认端口号 9411,你可以在 zipkin 启动日志查看端口号 http://127.0.0.1:9411/zipkin/

三、配置启动三个服务

首先启动 nacos、sentinel、zipkin 三个服务端,nacos 和 sentinel 不清楚的可以看我以前文章

简单测试项目流程图,其中 sentinel 代表可以配置限流熔断的地方,OpenFeign 选择服务,ribbon 通过负载均衡算法选取调用的服务

以下项目 springboot 版本 2.3.12.RELEASE,nacos 版本 2.2.7.RELEASE,springcloud 版本 Hoxton.SR12

1、Gateway 项目

spring-cloud-starter-gateway 简单理解就是后端的 web 代理服务器,类似于 nginx
pom.xml

      <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!-- 排除部分依赖,否则报错 Spring MVC found on classpath, which is incompatible with Spring Cloud Gateway --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><!-- 排除掉springmvc相关的配置信息 --><exclusion><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId></exclusion><!-- 排除掉tomcat相关的配置 --><exclusion><groupId>org.springframework.bootk</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion><exclusion><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-core</artifactId></exclusion><exclusion><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-el</artifactId></exclusion><exclusion><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-websocket</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId><version>2.2.9.RELEASE</version></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zipkin</artifactId><version>2.2.8.RELEASE</version></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>2.2.7.RELEASE</version></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><version>2.2.7.RELEASE</version></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId><version>2.2.7.RELEASE</version></dependency><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId><version>1.8.1</version></dependency>

从 spring-cloud-starter-zipkin 依赖可以看出包含了 spring-cloud-starter-sleuth (Spring Cloud提供的分布式系统服务链追踪组件)
解决错误

报错:Spring MVC found on classpath, which is incompatible with Spring Cloud Gateway.

原因就是 spring-boot-starter-web 和 spring-cloud-starter-gateway 冲突

方法①

排除 spring-boot-starter-web 相关依赖,如上 pom.xml文件所示(参考其他博客的排除 gateway 的 web 依赖和 webflux 依赖依然报错,或许和版本有关)参考:https://blog.csdn.net/w1073459332/article/details/115857429

方法②

更简单的方法是只使用 spring-cloud-starter-gateway 模块,不使用 spring-boot-starter-web , spring-cloud-starter-gateway 模块包含 spring-boot-starter-webflux

nacos 控制台配置 gateway-127-21000

server:port: 21000
spring:application:name: SPRING-CLOUD-GATEWAY-STUDYcloud:nacos:discovery:server-addr: 127.0.0.1:8848username: nacospassword: nacosnamespace: 2022-4-1-prodcluster-name: SPRINGBOOTephemeral: trueenabled: truegroup: DEFAULT_GROUPip: 127.0.0.1metadata:username: adminpassword: 123456weight: 1config:server-addr: 127.0.0.1:8848sentinel:enabled: truetransport:port: 7832dashboard: 127.0.0.1:28080clientIp: 127.0.0.1log:dir: I:\nacos集群\boot-21000-sentineldatasource:# 名字随意ds:nacos:server-addr: 127.0.0.1:8848username: nacospassword: nacosdata-id: sentinel-gateway-127-2100group-id: DEFAULT_GROUPnamespace: 2022-4-24-sentineldata-type: jsonrule-type: gw-flow # 网关流控规则数据源类型是 gw-flow,若指定为 flow 则不生效filter:enabled: false # 默认是 trueurl-patterns: /*flow:cold-factor: 3scg:fallback:content-type: application/jsonresponse-status: 429response-body: spring-cloud-gateway-study 服务错误redirect: /404mode: responsegateway:enabled: truediscovery:locator:enabled: truelower-case-service-id: falseroutes:- id: service  # 设置路由id(理论上是可以随便写的)order: 0 # order 越小,优先级越高uri: lb://SPRING-BOOT-SERVICE-DISCOVERY-CONSUMER # 设置路由的url  lb://service1(可以使用 nacos 服务注册名,lb 固定写法代表注册) http://localhost:3901(也可以使用绝对地址)predicates:- Path=/service/** # 路径匹配规则,微服务必须有一个统一的入口,不然网关不能访问,yaml 配置文件添加 server.servlet.context-path=/service 或 @RequestMapping("/service")(不方便,每个请求都需要添加)- id: service1order: 0uri: lb://SPRING-CLOUD-SERVICE-OPENFEIGNpredicates:- Path=/service1/**  # 如果前端请求路径包含 api,则应用这条路由规则- After=2022-05-05T02:00:00.000+08:00[Asia/Shanghai] # 路由指定时间后生效、还有其他的参数(Before、Between)filters:# - RewritePath=/service1/(?<segment>.*), /$\{segment} # 重写路由地址,http://127.0.0.1:21000/service1/hystrix/calculate 会转发到 http://127.0.0.1:20004/hystrix/calculate- RewritePath=/service1/(?<segment>.*), /service1/$\{segment}- StripPrefix=0 # 过滤器StripPrefix,作用是去掉请求路径的最前面n个部分截取掉。StripPrefix=1就代表截取路径的个数为1,比如前端过来请求/test/good/1/view,匹配成功后,路由到后端的请求路径就会变成http://localhost:8888/good/1/viewzipkin:base-url: http://127.0.0.1:9411sender:type: weblocator:discovery:enabled: truesleuth:sampler:probability: 1.0

nacos 配置 sentinel 限流规则 sentinel-gateway-127-21002 ,不熟悉 sentinel 参考我上一篇博客

[{"resource": "calculate","limitApp": "default","grade": 1,"count": 1,"strategy": 0,"controlBehavior": 0,"clusterMode": false}
]

bootstrap.yaml 读取 nacos 配置

spring:cloud:nacos:config:server-addr: 127.0.0.1:8848group: DEFAULT_GROUPnamespace: 2022-4-1-devusername: nacospassword: nacosfile-extension: yamlrefresh-enabled: trueprefix: ${config-file-name}

启动项目:idea Edit Configurations 配置启动参数 config-file-name=gateway-127-21000 (nacos 配置文件 id),或者打成 jar 运行时添加 --config-file-name=gateway-127-21000

2、SPRING-BOOT-SERVICE-DISCOVERY-CONSUMER 服务

父模块依赖,主要指定 nacos 和 cloud 版本

    <properties><java.version>1.8</java.version><springcloud.version>Hoxton.SR12</springcloud.version><springcloud.nacos.version>2.2.7.RELEASE</springcloud.nacos.version></properties><dependencyManagement><dependencies><!--spring cloud Hoxton.SR1--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${springcloud.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${springcloud.nacos.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>

pom.xml

       <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zipkin</artifactId></dependency>

nacos 控制台添加配置 boot-discovery-127-20001

server:port: 20001servlet:context-path: /service # gateway 网关,如果不配置,controller 控制层每个接口都需要添加该路径
spring:cloud:nacos:discovery:server-addr: 127.0.0.1:8848username: nacospassword: nacosnamespace: 2022-4-1-prodcluster-name: SPRINGBOOTephemeral: trueenabled: truegroup: DEFAULT_GROUPip: 127.0.0.1metadata:username: adminpassword: 123456weight: 1config:server-addr: 127.0.0.1:8848sentinel:enabled: truetransport:port: 8722dashboard: 127.0.0.1:28080clientIp: 127.0.0.1log:dir: I:\nacos集群\boot-20001-sentineldatasource:# 名字随意ds:nacos:server-addr: 127.0.0.1:8848username: nacospassword: nacosdata-id: sentinel-127-20001group-id: DEFAULT_GROUPnamespace: 2022-4-24-sentineldata-type: jsonrule-type: flowapplication:name: SPRING-BOOT-SERVICE-DISCOVERY-CONSUMERzipkin:base-url: http://127.0.0.1:9411sender:type: weblocator:discovery:enabled: truesleuth:sampler:probability: 1.0

nacos 配置 sentinel 限流规则 sentinel-127-20001

[{"resource": "/discovery/rule","limitApp": "default","grade": 1,"count": 1,"strategy": 0,"controlBehavior": 0,"clusterMode": false}
]

bootstrap.yaml 读取 nacos 配置

spring:cloud:nacos:config:server-addr: 127.0.0.1:8848group: DEFAULT_GROUPnamespace: 2022-4-1-devusername: nacospassword: nacosfile-extension: yamlrefresh-enabled: trueprefix: ${config-file-name}

controller 层 /hystrix/calculate 接口

@RestController
@RequestMapping("/hystrix")
public class HystrixController {@GetMapping("/calculate")@ApiAnnotation@SentinelResource(value = "calculate", blockHandler = "calculateHandleException",blockHandlerClass = ExceptionUtil.class,fallbackClass = FallbackUtil.class,fallback = "calculateFallback")public JSONObject calculate(String a, String b, String type) throws InterruptedException {TimeUnit.SECONDS.sleep(1);int result = 0;int num1 = Integer.parseInt(a);int num2 = Integer.parseInt(b);switch (type) {case "+":result = num1 + num2;break;case "-":result = num1 - num2;break;case "*":result = num1 * num2;break;case "/":result = num1 / num2;break;}JSONObject jsonObject = new JSONObject();jsonObject.put("result",result);return jsonObject;}
}

启动三个 SPRING-BOOT-SERVICE-DISCOVERY-CONSUMER 服务,启动时需要添加 config-file-name= boot-discovery-127-20001 配置,三个服务端口号为 10001,20001,30001

3、SPRING-CLOUD-SERVICE-OPENFEIGN 服务

该服务没有去 nacos 读取配置,没有使用 spring-cloud-starter-alibaba-nacos-config

父模块依赖

    <!--子模块继承之后,提供作用:锁定版本+子module不用写groupId和version--><dependencyManagement><!--定义规范,但不导入--><dependencies><!--spring cloud Hoxton.SR1--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Hoxton.SR12</version><type>pom</type><scope>import</scope></dependency><!--spring cloud 阿里巴巴--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.2.7.RELEASE</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>

pom.xml

     <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
<!--        <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency>--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>io.github.openfeign</groupId><artifactId>feign-httpclient</artifactId></dependency><dependency><groupId>io.github.openfeign</groupId><artifactId>feign-okhttp</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zipkin</artifactId></dependency>

nacos 配置 sentinel 限流规则 sentinel-openfeign-127-20004

[{"resource": "/discovery/rule","limitApp": "default","grade": 1,"count": 1,"strategy": 0,"controlBehavior": 0,"clusterMode": false}
]

OpenFeign 指定服务调用

path = “/service” 表示 SPRING-BOOT-SERVICE-DISCOVERY-CONSUMER 服务的所有接口都添加 /service 前缀

@FeignClient(name = "SPRING-BOOT-SERVICE-DISCOVERY-CONSUMER",path = "/service")
@Service
public interface BootDiscoveryClient {@GetMapping(value = "/hystrix/calculate")String serviceDown(@SpringQueryMap Map map);
}

controller 控制层 /hystrix/calculate 接口

@RestController
@RequestMapping("/hystrix")
public class HystrixController {@Autowiredprivate BootDiscoveryClient bootDiscoveryClient;@GetMapping(value = "/calculate")@SentinelResource(value = "calculate")public String serviceDown(String a,String b,String type) {Map<String,String> map = new HashMap<>();map.put("a",a);map.put("b",b);map.put("type",type);return bootDiscoveryClient.serviceDown(map);}
}

四、启动测试

1、nacos 控制台

nacos 服务列表启动了三个 SPRING-BOOT-SERVICE-DISCOVERY-CONSUMER 服务

2、Sentinel 控制台

Sentinel 流控列表可以看到从 nacos 加载的流控规则

3、Zipkin 控制台

访问 http://127.0.0.1:21000/service1/hystrix/calculate?a=10&b=5&type=/ 接口(使用 gateway 项目的地址),在 zipkin 查看链路,会发现 gateway 会根据你配置的 routers 规则调用 SPRING-CLOUD-SERVICE-OPENFEIGN 服务,该服务有调用了 20001 端口的 SPRING-BOOT-SERVICE-DISCOVERY-CONSUMER 服务

查看依赖(点击每个服务,可以看到详细统计)

zipkin 简单使用相关推荐

  1. SpringCloud F.RC2 整合Zipkin简单步骤

    前言:最近在学习zipkin,看到网上资源很多,但是都和自己的项目不是很一样,所以将自己的过程码出来 1.下载zipkin.jar 启动zipkin-server (配置启动参数) 传送门: http ...

  2. dubbo 整合 zipkin,最简单的方式,亲测有效

    大家好,我是烤鸭. 之前也试过网上很多版本,看了好多文章.现在分享最简单的方式,代码侵入性最小的. 1. 修改pom,引入jar. <!-- https://mvnrepository.com/ ...

  3. apm php zipkin,开源apm zipkin工具简单使用-Go语言中文社区

    声明,本编博客,只是为了记录 架构 流程走向 ┌─────────────┐ ┌───────────────────────┐ ┌─────────────┐ ┌────────────────── ...

  4. 实现一个全链路监控平台很难吗?Pinpoint、skywalking、zipkin,哪个实现比较好?...

    点击上方蓝色"方志朋",选择"设为星标"回复"666"获取独家整理的学习资料! 随着微服务架构的流行,服务按照不同的维度进行拆分,一次请求往 ...

  5. 分布式链路追踪zipkin

    分布式链路追踪 分布式链路追踪最早由谷歌的Dapper论文中提出的,提供提供简单易用的API来记录不同系统之间的调用的链路及耗时情况,从而提供各个系统的性能分析的依据. Dapper论文概述 Dapp ...

  6. Spring Cloud Alibaba 高级特性 基于 Sleuth+Zipkin 实施链路跟踪体系

    介绍微服务链路追踪的原理: 讲解基于 Spring Cloud Sleuth 实现链路追踪: 构建 Zipkin Server 实现链路追踪的可视化管理. 下面咱们先来介绍什么是微服务链路追踪. 微服 ...

  7. 以Dapper、Zipkin和LightStep [x]PM为例阐述分布式跟踪的过去、现在和未来

    \ 核心要点 \\ 在观测分布式系统和微服务时,分布式跟踪已经成为一个越来越重要的组件.现在有一些流行的开源标准和框架,比如OpenTracing API和OpenZipkin:\\t 分布式跟踪的基 ...

  8. java B2B2C 多租户电子商城系统-Spring Cloud Zipkin

    Zipkin是什么 Zipkin分布式跟踪系统:它可以帮助收集时间数据,解决在microservice架构下的延迟问题:它管理这些数据的收集和查找:Zipkin的设计是基于谷歌的Google Dapp ...

  9. Spring Cloud构建微服务架构:分布式服务跟踪(整合zipkin)【Dalston版】

    通过上一篇<分布式服务跟踪(整合logstash)>,我们虽然已经能够利用ELK平台提供的收集.存储.搜索等强大功能,对跟踪信息的管理和使用已经变得非常便利.但是,在ELK平台中的数据分析 ...

最新文章

  1. 【C++】50.编程中切换状态的【有限状态机】
  2. Java输入光标在printf前面_C++ 设置控制台(命令行)窗口 光标位置,及前背景颜色
  3. Java中字符串和数字间转换
  4. Android AIDL使用介绍(2)自定义数据类型的传递
  5. apt-get常用命令及工作原理
  6. vue获取前一个页面路由地址
  7. 小程序iconfont报错_【经验】开发微信小程序经验总结
  8. 结束占用端口号进程(pid)
  9. java线程服务器_一台Java服务器跑多少个线程
  10. Image.FrameDimensionsList 属性-----具体使用案例
  11. C# Sqlite For WP7
  12. ucgui界面 vc_UCGUI在VC下的仿真 | 学步园
  13. (z)无杂散动态范围SFDR--影响通信机性能的因素
  14. Flutter 修改Slider 滑杆刻度
  15. Microsoft CRM 2016 IFD配置
  16. LightOJ--1323 Billiard Balls (数学题)
  17. glusterfs分布式文件系统详细原理
  18. Quartus软件及器件库下载及安装
  19. Word02-隐藏回车换行符
  20. Android JNI之pthread_create的失败(1)

热门文章

  1. mysql 姓刘或姓李_“老子姓李”和“高祖是刘”
  2. [哈希][费用流]JZOJ 3296 【SDOI2013】刺客信条
  3. 赵云java游戏有蓝药红药_倩女幽魂手游红蓝药自给自足方法
  4. html5画布画图形代码,HTML5画布矢量图形?
  5. c语言中f的作用是什么,在C语言中printf中、《f》是什么?
  6. 鸿蒙大陆9.1正式版礼包,鸿蒙大陆4.1正式版攻略
  7. Ogre场景编辑器Ogitor的使用总结
  8. 移动磁盘提示文件或目录损坏且无法读取要怎么办啊
  9. 全栈UI设计各类软件教程
  10. C# 高仿腾讯QQ (实现QQ好友列表-基于ListBox的绘法)