谷粒商城のsentinelzipkin

文章目录

  • 前言
  • 一、Sentinel
    • 1、什么是Sentinel
    • 2、项目配置
    • 3、使用案例
      • 3.1、流控
      • 3.2、降级
      • 3.3、黑白名单设置
  • 二、Zipkin
    • 1、什么是Zipkin
    • 2、项目配置
    • 3、整合案例


前言

  本篇介绍Spring Cloud Ali的sentinel组件,用于对微服务的熔断降级,以及链路追踪zipkin的使用,对应视频P326-P338。本篇为谷粒商城分布式高级部分的最后一篇,重点在于sentinel和zipkin在项目中的运用。后续更新集群部署篇


一、Sentinel

1、什么是Sentinel

  Sentinel是Spring Cloud Ali的组件,主要用于分布式系统中的流量控制、熔断降级和系统监控。在原生Spring Cloud中,是Hystrix承担着同样的作用。Sentinel 的主要概念和功能:

  1. 流量控制:Sentinel 通过限流策略控制请求的数量,其中常见的限流策略有:QPS(每秒请求数),并发线程数,令牌桶和漏斗算法。
  2. 熔断与降级:在系统出现异常(如请求超时或错误率过高)时,Sentinel 可以自动触发熔断机制,拒绝后续请求以保护系统。降级功能允许你在系统负载过高时,自动将某些服务的请求转向较简单的处理,保障系统的整体可用性。

  其中限流策略,QPS是通过控制台设定某个资源每秒允许的最大请求数量,超出这个数量的请求会被拒绝或延迟。而并发线程数则是通过限制同一时刻可以处理的请求数量来实现流量控制。令牌桶算法则是请求的到来需要从桶中获取令牌。令牌以固定的速率生成,当请求到来时,需要消耗一个令牌才能通过。如果没有可用的令牌,请求会被拒绝或延迟。漏斗算法通过维护一个“漏斗”来控制请求的流入速率。请求以恒定的速率流入漏斗,当请求超过漏斗容量时,多余的请求会被拒绝。
  而熔断主要体现在,A服务调用B服务,如果B服务长时间没有返回响应,或者直接出现错误,则会直接返回失败,后续A也不会再调用B服务了。在熔断状态持续一段时间后,熔断器会进入“半开”状态。在这个状态下,系统会允许一部分请求(例如,1%或2%的请求)尝试访问该服务,以检查服务是否已恢复。如果这些请求成功,则熔断器会完全恢复,重新允许所有请求。如果请求仍然失败,熔断器将保持熔断状态,继续拒绝请求。降级主要体现在,例如双11电商系统访问量激增,而主要的业务可能体现在下单,秒杀,后端服务可能无法承受大量请求。此时可以选择对一些非核心功能进行降级,将用户的某些请求引导到默认的页面(实现服务的基本可用)。

2、项目配置

  需要在项目中运用Sentinel,首先引入依赖(我是直接加入到了common模块下,注意,common模块中加入了某项依赖,除了需要刷新common模块,还需要刷新所有引用了common模块的微服务maven,否则可能不会生效):

			<!--        开启sentinel--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency><!--        sentinel的图表统计--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId><version>2.1.8.RELEASE</version></dependency>

  并且配置文件中加入:

# 控制台的端口号
spring.cloud.sentinel.transport.dashboard=localhost:8080
spring.cloud.sentinel.transport.port=8719
#使用 * 表示允许所有管理端点都被暴露。即所有可用的 Actuator 端点都将通过 web 访问。
management.endpoints.web.exposure.include=*
## 开启远程调用支持
feign.sentinel.enabled=true

  如果需要在网页上通过可视化界面进行操作,则需要下载sentinel的dashboard,使用java -jar 运行,默认是8080端口。如果有冲突可以自行修改:
在这里插入图片描述  访问localhost:8080进入控制台

3、使用案例

3.1、流控

  启动服务,在浏览器中直接访问某个链接:
在这里插入图片描述  在控制台配置流控规则:
在这里插入图片描述  设置1s只能访问一次:
在这里插入图片描述  同时可以自定义配置降级页面;

@Configuration
public class SeckillSentinelConfig {public SeckillSentinelConfig() {WebCallbackManager.setUrlBlockHandler((httpServletRequest, httpServletResponse, e) -> {R error = R.error(ExceptionEnum.TOO_MANY_REQUEST_EXCEPTION.getCode(), ExceptionEnum.TOO_MANY_REQUEST_EXCEPTION.getValue());httpServletResponse.setContentType("application/json;charset=utf-8");httpServletResponse.getWriter().write(JSON.toJSONString(error));});}
}

  1s内多次刷新页面,说明流控规则生效:
在这里插入图片描述  sentinel也提供了多种定义受保护资源的方式,包括jdk8的新特性try-with-resource,以及@SentinelResource注解:
  try-with-resource定义受保护资源的用法:

    public SecKillSkuRedisTO getCurrentSeckillSkuById(Long skuId) {//定义受保护的资源方式一try(Entry entry = SphU.entry("getCurrentSeckillSkuById")) {//自己的业务逻辑} catch (BlockException e) {log.info("{}:流控规则生效","getCurrentSeckillSkuById");}return null;}

  @SentinelResource注解定义受保护资源的用法:

    /*** 创建流控规则方式二* @param ex* @return*/public List<SecKillSkuRedisTO> CurrentSeckillSkusHandler(BlockException ex) {log.info("{}:流控规则生效","getCurrentSeckillSkus");return null;}@Override@SentinelResource(value = "getCurrentSeckillSkus",blockHandler = "CurrentSeckillSkusHandler")public List<SecKillSkuRedisTO> getCurrentSeckillSkus() {//自己的业务逻辑}

3.2、降级

  可基于响应时间,异常数,异常比例设定降级策略:
  例如基于异常数,如图所示,只要出现1个异常,就触发降级,降级持续时间为1000ms:
在这里插入图片描述  对于被保护的资源,手动抛出一个异常:

    @GetMapping("/currentSeckillSkus")public R getCurrentSeckillSkus(){int i = 1/0;List<SecKillSkuRedisTO> secKillSkuRedisTOS =  secKillSkuService.getCurrentSeckillSkus();return R.ok().put("data",secKillSkuRedisTOS);}

  由于出现了异常,第一次访问就出现了自定义的降级提示,也就是降级的操作生效了
在这里插入图片描述

3.3、黑白名单设置

  sentinel也支持对于访问受保护资源的权限进行控制,例如假设我访问的路径中包含currentSeckillSkus,则不允许访问,直接返回失败,则需要进行配置:

@Component
public class RequestOriginParserImpl implements RequestOriginParser {@Overridepublic String parseOrigin(HttpServletRequest httpServletRequest) {String requestURI = httpServletRequest.getRequestURI();if (requestURI.contains("/currentSeckillSkus")) {return "blackList";}return "whiteList";}
}

  控制台加入流控应用
在这里插入图片描述  再次访问被拦截,直接进入失败页面
在这里插入图片描述  以上就是关于sentinel的简单用法的案例演示,同时需要提醒注意的是,在 Sentinel 中,默认情况下流控规则和配置是在内存中存储的,因此每次应用重启后,原有的流控规则会丢失。所以我们需要配置持久化策略,常见的有持久化入数据库,或是Redis。
  而对于feign远程调用的熔断,个人理解通常应该是在调用方进行设置。如果设置在被调用方,可能会存在一种情况,即A和B两个服务同时调用C,而A对于C的访问频率大于B对于C的访问频率,如果是在C进行熔断设置,则有可能导致B无法正常访问C。


二、Zipkin

1、什么是Zipkin

  Zipkin是一个用于链路追踪的组件,可以追踪一个请求在微服务架构中的整个生命周期,包括其经过的服务、调用时间和执行顺序,并且提供了详细的执行时间信息以及错误记录。
  下面介绍几个Zipkin 中的概念:

  • Span 是 Zipkin 中的基本概念,表示一次请求的执行过程。每个 Span 包含信息,如开始时间、结束时间、执行状态和标签等。一个请求通常由多个 Span 组成,每个服务调用都生成一个 Span。
  • Trace 是由一系列相关的 Span 组成的完整请求路径。一个 Trace 描述了请求在微服务中的完整执行过程。
  • 在 Span 中,开发者可以添加不同的注解(Annotations),用于记录特定事件(如请求开始、结束、错误等)。这些注解可以帮助更好地理解请求的执行过程。

  Span中的Annotations有:

  1. cs (Client Send):表示客户端发送请求的时间。
  2. cr (Client Receive):表示客户端接收到响应的时间。
  3. ss (Server Send):表示服务器发送响应的时间。
  4. sr (Server Receive):表示服务器接收到请求的时间。

  通过sr-cs,可以计算出发送请求所消耗的时间,通过ss-cr,可以计算出服务端处理业务消耗的时间,通过cr-ss,可以计算出响应请求消耗的时间。
  在Zipkin中如何自定义一个Annotations?下面是一个简单的案例:

@Service
public class MyService {@Autowiredprivate Tracer tracer;public void myMethod() {// 获取 Span,并开始一个新的 SpanSpan span = tracer.nextSpan().name("myMethod").start();try {// 添加自定义 Annotationspan.annotate("Starting processing"); // 自定义开始处理的注解// 模拟处理逻辑processBusinessLogic();span.annotate("Processing completed"); // 自定义处理完成的注解} catch (Exception e) {span.error(e); // 记录异常} finally {span.finish(); // 结束 Span}}private void processBusinessLogic() {// 业务处理逻辑}
}

2、项目配置

  在docker或本地安装Zipkin服务器,实现页面可视化监控

docker run -d -p 9411:9411 openzipkin/zipkin

  引入依赖:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>

  配置文件中添加:

logging.level.org.springframework.cloud.openfeign: debug
logging.level.org.springframework.cloud.sleuth: debug
spring.zipkin.base-url= http://自己的虚拟机地址:9411/
#不将zipkin自身进行注册
spring.zipkin.discovery-client-enabled=false
spring.zipkin.sender.type=web
#抽样统计因子,1为全部统计
spring.sleuth.sampler.probability=1

3、整合案例

  整合完成后重启项目,执行业务,登录控制台页面,即可查看对应业务调用的链路信息,包括开始时间,结束时间,远程调用,异步调用信息,都会有所体现。
在这里插入图片描述

下一篇:k8s

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/59096.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Freertos学习日志(1)-基础知识

目录 1.什么是Freertos&#xff1f; 2.为什么要学习RTOS&#xff1f; 3.Freertos多任务处理的原理 1.什么是Freertos&#xff1f; RTOS&#xff0c;即&#xff08;Real Time Operating System 实时操作系统&#xff09;&#xff0c;是一种体积小巧、确定性强的计算机操作系统…

2. Flink快速上手

文章目录 1. 环境准备1.1 系统环境1.2 安装配置Java 8和Scala 2.121.3 使用集成开发环境IntelliJ IDEA1.4 安装插件2. 创建项目2.1 创建工程2.1.1 创建Maven项目2.1.2 设置项目基本信息2.1.3 生成项目基本框架2.2 添加项目依赖2.2.1 添加Flink相关依赖2.2.2 添加slf4j-nop依赖2…

TIA 中用 GSD 方式组态 ET200SP 安全模块时如何用 S7-FCT 分配安全目标地址

1 概述 用 GSD 方式组态的 ET200SP 的分布式从站上&#xff0c;现在可以使用安全模块&#xff08;早期 是无法支持&#xff09;&#xff0c;这种用法对 ET200SP 接口模块的版本和编程软件的版本都有要求。 ET200SP 故障安全模块可通过 GSD 文件用于以下接口模块&#xff1a; …

0,国产FPGA(紫光同创)-新建PDS工程

国产FPGA正在蓬勃发展&#xff0c;紫光同创FPGA是大家竞赛时经常遇到的一款国产FPGA&#xff0c;本专栏从IP核开始一直到后续图像处理等。 开发板&#xff1a;盘古50K标准板 1&#xff0c;新建PDS工程 点击File&#xff08;1&#xff09;&#xff0c;然后是New Projects&#…

视频Qoe测量学习笔记(一)

目录 流媒体协议详解 RTSP&#xff1a;实时流式协议 RTCP&#xff1a;实时运输控制协议 RTP&#xff1a;实时运输协议 H.264 流媒体协议详解 RTSP&#xff1a;实时流式协议 由IETF MMusic小组开发&#xff0c;已成为互联网建议标准[RFC 2326]。RTSP本身并不传送数据&…

计算机视觉常用数据集Foggy Cityscapes的介绍、下载、转为YOLO格式进行训练

我在寻找Foggy Cityscapes数据集的时候花了一番功夫&#xff0c;因为官网下载需要用公司或学校邮箱邮箱注册账号&#xff0c;等待审核通过后才能进行下载数据集。并且一开始我也并不了解Foggy Cityscapes的格式和内容是什么样的&#xff0c;现在我弄明白后写下这篇文章&#xf…

单向函数、单向陷门函数、困难问题

1、单向函数 设函数 yf(x) &#xff0c; 对于给定的x&#xff0c;计算出y很容易&#xff1b;对于给定的y&#xff0c;计算出x很难。 2、单向陷门函数 设函数 yf(x) &#xff0c;且f有陷门&#xff0c; 对于给定的x&#xff0c;计算出y很容易&#xff1b;对于给定的y&#…

js 获取当前时间与前一个月时间

// 获取当前时间的毫秒数 var currentTimeMillis new Date().getTime();// 获取前一个月的Date对象 var dateLastMonth new Date(); dateLastMonth.setMonth(dateLastMonth.getMonth() - 1);// 获取前一个月的毫秒数 var timeMillisLastMonth dateLastMonth.getTime();conso…

Linux_02 Linux常用软件——vi、vim

vi编辑器有三种主要模式&#xff0c;每种模式的功能和用途不同&#xff1a; 一、命令模式 (Command Mode)&#xff1a; - 启动 vi 时默认进入此模式。 - 你可以在此模式下移动光标&#xff0c;输入各种命令&#xff08;如删除、复制、粘贴等&#xff09;。 yy&#xff1a;…

C++设计模式结构型模式———装饰模式

文章目录 一、引言二、装饰器模式三、总结 一、引言 装饰模式是一种结构型设计模式&#xff0c; 允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。 该模式展现出了运行时的一种扩展能力&#xff0c;以及比继承更强大和灵活的设计视角和设计能力&#x…

「iOS」——知乎日报一二周总结

知乎日报仿写 前言效果Manager封装网络请求线程冲突问题下拉刷新添加网络请求的图片通过时间戳和日期格式化获取时间 总结 前言 前两周内容的仿写&#xff0c;主要完成了首页的仿写&#xff0c;进度稍慢。 效果 Manager封装网络请求 知乎日报的仿写需要频繁的申请网络请求&am…

Profinet、Ethernet/IP 工业以太网无线通信解决方案

在工业现场&#xff0c;我们常常会面临这样的困扰&#xff1a;两个PLC之间、PLC 跟远程IO之间或者PLC 跟伺服之间由于种种原因不方便布线&#xff0c;严重影响了通讯效率和生产进程。为了解决这一难题&#xff0c;三格电子设计了一款工业以太网无线网桥&#xff0c;这款无线网桥…

【数据结构】二叉树——前中后序遍历

一、如何遍历二叉树 以图上这个二叉树作为例子&#xff0c;我们若想要访问二叉树中每一个元素 我们一般是采用递归的方式 比如我们要访问完整个二叉树&#xff0c;我们进行递归先访问根的左子树&#xff0c;然后因为递归再次调用&#xff0c;我们会先一直访问二叉树左子树&…

桑基图在医学数据分析中的更复杂应用示例

桑基图&#xff08;Sankey Diagram&#xff09;能够有效地展示复杂的流动关系&#xff0c;特别适合用于医学数据分析中的多种转归和治疗路径的可视化。接下来&#xff0c;我们将构建一个稍微复杂的示例&#xff0c;展示不同疾病患者在治疗过程中的流动&#xff0c;以及他们的治…

WPS 表格奇数行或偶数行填充颜色(Excel也适用)

今天在做项目测试用例&#xff0c;全都是白色底纹&#xff0c;日以继夜的赶项目 大家都头脑不清晰了&#xff0c;看着容易错行&#xff0c;看我一键更新 如本次测试用例&#xff0c;单元格区域的奇数行填充灰色。 点击单元格最左上角选定区域&#xff0c;然后依次点击【开始】…

RT-DETR:替代YOLO的更快实时对象检测模型(附代码)

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

JavaScript。—关于语法基础的理解—

一、程序控制语句 JavaScript 提供了 if 、if else 和 switch 3种条件语句&#xff0c;条件语句也可以嵌套。 &#xff08;一&#xff09;、条件语句 1、单向判断 &#xff1a; if... &#xff08;1&#xff09;概述 < if >元素用于在判断该语句是否满足特定条…

ComfyUI - ComfyUI 工作流中集成 SAM2 + GroundingDINO 处理图像与视频 教程

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/143359538 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 SAM2 与…

Android13预置应用及授权开发

在android13中&#xff0c;要预置一个对讲应用&#xff0c;从预置和授权&#xff0c;梳理了一下&#xff0c;以便后续查询使用。在此记录 一放置应用 我的apk应用放在vendor下面&#xff0c; 路径&#xff1a;projectroot/vendor/fly/package/apps/DMR/flydmr.apk (vendor/fl…

【密码学】全同态加密基于多项式环计算的图解

全同态加密方案提供了一种惊人的能力 —— 能够在不知道数据具体内容的情况下对数据进行计算。这使得你可以在保持潜在敏感源数据私密的同时&#xff0c;得出问题的答案。 这篇文章的整体结构包括多项式环相关的数学介绍&#xff0c;基于多项式环的加密和解密是如何工作的&…