Sentinel结合Nacos实现配置持久化(全面)

news2024/11/18 23:27:12

1、前言

我们在进行分布式系统的开发中,无论是在开发环境还是发布环境,配置一定不能是内存形式的,因为系统可能会在中途宕机或者重启,所以如果放在内存中,那么配置在服务停到就是就会消失,那么此时就需要重新再进行配置,一个两个服务还好,如果服务一多,那就是一件很费时费力的事情了。
所以我们还是需要把我们的配置信息持久化到配置中心,这也是目前主流的方式。

分布式系统中常见的配置中心有Nacos、ZooKeeper、Apollo、Consul等等,
本文中使用Nacos作为配置中心和服务中心。

配置持久化主要有以下原因:

  1. 数据安全性:持久化配置可以保证在系统或者应用重启后,重要的配置数据不会丢失,可以确保数据的安全性和稳定性。
  2. 数据可恢复性:持久化配置可以在数据丢失或者损坏时进行恢复,保证系统的正常运行。
  3. 支持分布式系统:对于分布式系统来说,配置的持久化可以确保各个节点的一致性,避免因为节点的临时变动导致的问题。
  4. 可扩展性:持久化配置易于进行扩展和修改,可以适应不同的应用场景和业务需求。
  5. 提高系统性能:通过实现配置的持久化,可以有效减少读取配置文件的次数,提高系统的运行效率。
  6. 降低耦合性:持久化配置可以使得应用和配置之间松散耦合,方便系统的维护和升级。

2、微服务整合Sentinel和Nacos

在分布式的系统中,微服务是最基本的要求,所以我们就需要对微服务进行服务注册发现、配置和流控。

2.1、引入依赖

在微服务整合sentinel和Nacos是需要父pom中已经引入了spring-cloud-alibaba-dependencies这个依赖,这个依赖中管理里当前版本中所有组件的版本信息。切记:在微服务中要特别注意各种依赖的版本。

<!--nacos服务注册与发现-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

<!--nacos配置中心-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

<!--sentinel依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

<!--以nacos作为sentinel数据源的依赖-->
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

2.2、application.yaml文件的编写

spring:
  application:
    name: ${application_name}
  main:
    banner-mode: off
    lazy-initialization: true
  cloud:
    nacos: # 配置nacos信息
      discovery:
        server-addr: ${nacos_server}
      config:
        server-addr: ${nacos_server}
        file-extension: yaml

因为我们用nacos作为了配置中心,我们可以将sentinel的基本配置放入到nacos中就可以了,所以当前服务的yaml配置文件中只需要写一些基本的配置就可以了。

2.3、在Nacos中配置sentinel信息

spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080 ##sentinel的控制面板地址
      datasource: # sentinel用nacos作为数据源的配置
        flux-control: # 流控管理(这个名称可以自定义)
          nacos: # 告诉sentinel用nacos作为数据源
            data-id: feign-test_flux-control_config.json # 配置中心里执行文件的dataId
            server-addr: ${nacos_server} # nacos的地址
            rule-type: flow # 指定文件配置的是那种规则
        degrade-control: # 熔断管理(这个名称可以自定义)
          nacos:
            data-id: feign-test_degrade-control_config.json
            server-addr: ${nacos_server}
            rule-type: degrade
        param-flow-control: # 热点参数管理(这个名称可以自定义)
          nacos:
            data-id: feign_test-hot_flux-config.json
            server-addr: ${nacos_server}
            rule-type: param-flow

我们使用nacos配置文件来对服务进行流控、熔断等操作,所以就需要有以下几个必须的参数:

  1. data-id:需要告诉sentinel读取配置中心中的哪个配置文件。
  2. rule-type:告诉sentinel配置文件配置的控制规则,flow:流控、degrade:熔断、param-flow热点参数,想看有哪些规则参数可以查看com.alibaba.cloud.sentinel.datasource包下的枚举类:RuleType
public enum RuleType {
    FLOW("flow", FlowRule.class),
    DEGRADE("degrade", DegradeRule.class),
    PARAM_FLOW("param-flow", ParamFlowRule.class),
    SYSTEM("system", SystemRule.class),
    AUTHORITY("authority", AuthorityRule.class),
    GW_FLOW("gw-flow", "com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayFlowRule"),
    GW_API_GROUP("gw-api-group", "com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiDefinition");
   //省略部分代码
}

2.4、配置信息

我们这里使用的是配置文件的形式对sentinel的控制信息进行持久化,所以会存在一个问题:nacos中的配置文件对于sentinel来讲是单项数据读入,sentinel能监听到nacos中配置的变化,但是我们在sentinel中修改了配置,nacos是不会监听到并进行修改。
如果想进行双向绑定,就需要对sentinel的代码进行修改。

2.4.1、流控配置

流控指的是流量控制,也称作限流。它主要是用来限制每单位时间进入系统的请求数量,主要用来保证系统的可用性,防止大流量把系统压死。

[
  {
    "resource": "/test", // 资源名
    "limitApp": "default", // // 针对来源,若为 default 则不区分调用来源
    "grade": 1, // 限流阈值类型(1:QPS;  0:并发线程数)
    "count": 1, // 阈值
    "clusterMode": false, // 是否是集群模式
    "controlBehavior": 0, // 流控效果 (0:快速失败;  1:Warm Up(预热模式);  2:排队等待)
    "strategy": 0,  // 流控模式(0:直接; 1:关联; 2:链路)
    "warmUpPeriodSec": 10, // 预热时间(秒,预热模式需要此参数)
    "maxQueueingTimeMs": 500, // 超时时间(排队等待模式需要此参数)
    "refResource": "rrr" // 关联资源、入口资源(关联、链路模式)
  }
]

流控配置

2.4.2、熔断降级配置

在微服务中,熔断降级是一种保障服务稳定性的策略。
熔断降级可以简单理解为一个“保险丝”的作用。当某个服务发生严重故障(例如超时、异常等),为了防止整个系统的崩溃,会切断对这个服务的调用。这就像电流过大,保险丝会熔断以保护电路。

具体来说,熔断降级有两个目的:

防止应用程序不断地尝试执行可能会失败的操作给系统造成“雪崩”。
当某个服务提供者发生故障的时候,向调用方返回一个错误响应或者替代响应,而不是让调用方等待超时。
这样,即使个别服务出现问题,整个系统的运行也不会受到影响,这就是熔断降级的作用。

[
    {
        "resource": "/degrade",
        "grade": 0, // 熔断策略,支持慢调用比例(0),异常比例(1),异常数(2)策略
        "count": 1000, // 慢调用比例模式下为慢调用临界 RT(超出该值计为慢调用,单位ms);异常比例/异常数模式下为对应的阈值
        "slowRatioThreshold": 0.1,// 慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入)
        "minRequestAmount":  10, //熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断
        "timeWindow": 10, // 熔断时长,单位为 s
        "statIntervalMs": 1000 // 统计时长(单位为 ms),如 60*1000 代表分钟级
    }
]	

熔断降级

2.4.3、热点参数配置

在微服务中,热点参数限流是一种特殊的限流方法。

热点参数限流主要是对参数值相同的请求进行分别统计,判断是否超过每秒事务处理量(QPS)的阈值。这种方法相较于传统的限流方式,更精细化和个性化,可以针对具体的应用和服务的瓶颈进行限流。

例如,在一个微服务系统中,“查询用户信息”这个服务可能存在一个热点参数“用户ID”,我们可以通过热点参数限流来控制单位时间内对同一个用户ID的查询请求数量,防止因为某个热点的参数导致整体服务的故障。

[
  {
    "resource": "/test1",
    "grade": 1, // 限流模式(QPS 模式,不可更改)
    "paramIdx": 0, // 参数索引
    "count": 13, // 单机阈值
    "durationInSec": 6, // 统计窗口时长
    "clusterMode": false, // 是否集群 默认false
    "controlBehavior": 0, // 流控效果(支持快速失败和匀速排队模式)
    "limitApp": "default",
    // 高级选项
    "paramFlowItemList": [{
        "classType": "int", // 参数类型
        "count": 222, // 限流阈值
        "object": "2" // 参数值
      }]
  }
]

热点参数限流

2.4.4、系统规则配置

系统规则是用于定义和配置分布式系统的流量控制和防护的一种策略。

可以根据不同的维度(如Load、CPU使用率、总体平均RT、入口QPS和并发线程数等)来设定系统保护规则,以保证系统的入口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。

[
  {
    "avgRt": 1, // RT
    "highestCpuUsage": -1, // CPU 使用率
    "highestSystemLoad": -1, // LOAD
    "maxThread": -1, // 线程数
    "qps": -1, // 入口 QPS
    "count": 55, // 阈值,在CPU使用率中是百分比
  }
]

系统规则

2.4.5、授权规则配置

授权规则是用于控制服务请求者访问受保护资源的一种权限判断。它可以基于请求的来源或其他因素,对请求进行授权或者拒绝。

授权规则有多种实现方式,例如白名单和黑名单。白名单是允许来源在白名单内的调用者访问受保护资源,而黑名单则是禁止来源在黑名单内的调用者访问受保护资源。

在Sentinel中,可以通过自定义RequestOriginParser接口,从请求对象中获取请求者的来源,并按照白名单或黑名单的规则进行授权判断。

[
  {
    "resource": "sentinel_spring_web_context",
    "limitApp": "/test",
    "strategy": 0 // 授权类型(0代表白名单;1代表黑名单。)
  }
]

授权规则

3、Gateway整合Sentinel和Nacos

在分布式系统中,一般使用Gateway网关来作为系统的入口,整合了网关后,请求会通过Gateway进行转发,就相当于Servlet中的forward,转发过程不会在浏览器中进行记录。
所以当我们为系统添加了Gateway之后,我们就可以不为每一个微服务添加流控效果了,只需要在Gateway中设置流控就可以了。

我们在Gateway中进行流控、熔断等操作,resource指的就是我们的服务名称。

3.1、流控配置

Gateway的流控配置和普通的流控配置不一样。

[
	{
        "resource": "feign-test",  // 资源名
        "resourceMode": 0, // API类型, 0: ROUTE ID区分, 1: API
        "count": 1, // 阈值,QPS类型就是限制时间间隔的请求数,线程数类型就是指并行的线程数
        "grade": 1, // 阈值类型,0:线程数,1:QPS
		"controlBehavior": 2, // 流控方式,0:快速失败,2:匀速排队
        "intervalSec": 10, // 间隔,单位是秒
        "burst": 0, // burst,只有在快速失败时才有效
        "maxQueueingTimeoutMs": 1000 // 超时时间,单位是毫秒
	}
]

在这里插入图片描述

3.1.1、网关流控的所有配置参数

参数名参数描述
resourceModeAPI类型,0:ROUTE ID,1:API
resource资源名
grade阈值类型,0:线程数,1:QPS
count阈值,QPS类型就是限制时间间隔的请求数,线程数类型就是指并行的线程数
intervalSec间隔 ,单位是秒
controlBehavior流控方式,0:快速失败,2:匀速排队
burst额外流量,快速失败流控方式下,允许突出的流量数
maxQueueingTimeoutMs排队时间,单位是毫秒,匀速排队流控方式下,允许排队的时间
paramItem请求属性key,json对象,为配置的json key,value就是余下的配置项
parseStrategy参数属性,0 :ClientIP,1:RemoteHost,2:Header ,3:URL参数,4 Cookie
fieldName参数名称,若参数属性选择 Header 模式或 URL 参数模式,则需要指定对应的 header 名称或 URL 参数名称
matchStrategy参数值匹配策略,0: 精确匹配,1:子串查询匹配,2:正则表达式匹配
pattern参数值匹配内容,按匹配策略来配置的值,只有匹配该模式的请求属性值会纳入统计和流控;若为空则统计该请求属性的所有值。

3.1.2、注意事项

  1. 参数值如果是数字,那么字符串和数字都可以。
  2. 当Gateway使用了流控配置的持久化,那么sentinel中datasource配置下的rule-type参数值就得是gw_flow, 不能是flow,但也不是一定不能。
spring:
  cloud:
    sentinel:
      transport:
        dashboard: http://localhost:8080
      datasource:
        flow-control:
          nacos:
            server-addr: ${nacos_server}
            data-id: gateway_flux-control_config.json
#            rule-type: flow
            rule-type: gw_flow

1、如果配置的是flow,那么在sentinle中就不会显示处Gateway的流控配置,但是不影响功能。
2、如果配置的是gw_flow,才会在sentinel中显示Gateway的流控配置,同时也不影响功能。

3.2、熔断降级配置

Gateway的熔断降级配置和之前的配置是一样的。

[
	{
	  "resource": "feign-test", // 资源名
	  "count": 1000, // 当熔断策略是慢调用时,此值为最大RT,单位是毫秒。当熔断是策略是异常比例时,此值为异常比例。当熔断策略是异常数时,此值为异常数目
	  "timeWindow": 5, // 熔断时长,单位是秒
	  "grade": 0, // 0: 慢调用, 1: 异常比例,2:异常数
	  "minRequestAmount": 2,  // 最小请求数
	  "slowRatioThreshold": 0.2, // 比例阈值
	  "statIntervalMs": 10000 // 统计时长,单位毫秒
	}
]

熔断降级

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

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

相关文章

javascript 使用async/await简化异步操作实践

实现的功能简述&#xff1a; 新增申请单时&#xff0c;申请单的业务日期由两个因素决定&#xff1a; 异步获取的仓库的业务日期。异步获取的日期偏移天数规则。 业务日期 仓库的业务日期 偏移天数。比如仓库的业务日期是2023-01-01,偏移天数是5&#xff0c;那么最终的业务日期…

【轨道机器人】成功驱动伺服电机(学生电源、DCH调试软件、DH系列伺服驱动器)

1、硬件平台 工控机 学生电源 DH系列伺服驱动器 电机 调试平台&#xff1a;DCH 2、如何利用dch驱动电机 点击可驱动电机 下面的步骤是比较关键的几步&#xff1a; 3、遇到的问题 不能成功驱动电机&#xff0c;还和厂家那边打电话&#xff0c;询问 发现是这…

霍金《时间简史》A Brief History of Time 学习笔记(第二章)

CHAPTER 2 : SPACE & TIME Footnote: Second chapter. Mainly talks about spacetime. Footnote: “Thought Experiment”, which is quite common in the field of physics. False: Galileo dropping weights from the Tower of Pisa (Assertedly) True: Galileo rolling…

【企业级SpringBoot单体项目模板 】——Mybatis-plus自动代码生成

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;SpringBoot项目模版、企业级、模版☀️每日 一言&#xff1a;我们之所以这样认为&#xff0c;是因为他们这样说。他们之所以那样说&#xff0c;是因为他们想让我们那样认为。所以实践才是检验真理…

漏刻有时数据可视化Echarts组件开发(30):自定义方向的数据流向动画

let points = [{name: 市城市管理局,desc: {type: 1,},},{name: 科大讯飞,desc: {type: 2,},},{name: 市水利局,desc: {type: 1,},},{name: 市政法委,desc: {type: 1,},},{name: 市自然资源和规划局,desc: {type: 1,},},{name: 市生态环境局,desc: {type: 1,},},{name: 市大数据…

资源分享 | 情绪脑电研究公开数据集

SEED SEED数据集是由上海交大类脑计算与机器智能研究中心(BCMI)开发的。该数据集是基于脑电的情绪分类任务而设计的数据集。该数据集记录了15名被试在观看积极、中性和消极情绪电影片段时的EEG信号&#xff0c;每个视频片段的时间为3-5分钟。每个参与者重复采集三天&#xff0…

BST搜索二叉树

目录 二叉搜索树概念 ​编辑 1 二叉搜索树的构建 2. 二叉搜索树的删除 3二叉搜索树中放入元素 4. 二叉搜索树中元素的删除 5. 二叉搜索树中元素的遍历 6 二叉搜索树中元素的查找 7二叉搜索树的拷贝构造 二叉搜索树概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一…

【lesson10】fork创建进程的现象解答

文章目录 fork现象fork问题 fork现象 我们先来看一段代码。 大家觉得这段代码的printf会打印几次&#xff1f; 结果&#xff1a; 我们可以清楚的看到&#xff0c;第二个printf打印了2次。 我们再来看一段不可思议的代码&#xff1a; 运行结果&#xff1a; 我们可以看到这r…

编写Dockerfile

Dockerfile 编写Dockerfile 制作 FROM java:7 MAINTAINER bunny <邮箱qq.com> ADD easybbs-web-release-1.0.jar app.jar CMD java -jar app.jar构建 docker build -f ./my_dockerfile -t app:1.0 .启动 docker rm my_app docker ps -a docker run -d -p 9000:7070 …

前端教程-总览

现已经更新完毕图中教程汇总后期收集所有教程资料整理

【考研】2023暨南大学848答案 2020-2023 计算机基础综合 830答案

&#x1f525;&#x1f525; I 仓库 还在更新&#xff0c;敬请期待 &#x1f525;暨南大学计算机848报考信息汇总仓库 仓库内有20年真题答案 https://github.com/zhanjuex/JNU_848 备用仓库 (目录可能用不了 https://xindon.coding.net/public/open/JNU_848/git/files &#x1…

基于springboot+vue的入校申报审批系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

基于Java+SpringBoot+Vue+Uniapp的美容预约平台小程序设计与实现(开题报告+任务书+源码+lw+ppt +部署文档+讲解)

文章目录 前言用户微信小程序端的主要功能有&#xff1a;管理员的主要功能有&#xff1a;具体实现截图详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考论文参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌…

Spring的后处理器-BeanFactoryPostprocessor

目录 Spring后处理器 Bean工厂后处理器-BeanFactoryPostProcessor 修改beanDefinition对象 添加beanDefiniton对象 方法一 方法二 自定义Component Spring后处理器 Spring后处理器是Spring对外开放的重要拓展点&#xff08;让我们可以用添加自己的逻辑&#xff09;&…

使用 PyTorch 的计算机视觉简介 (4/6)

一、说明 在本单元中&#xff0c;我们将了解卷 积神经网络&#xff08;CNN&#xff09;&#xff0c;它是专门为 计算机视觉设计的。 多层卷积层允许我们从图像中提取某些图像模式&#xff0c;池化层&#xff0c;以及在 CIFAR-10上的表现。 二、多层 CNN 在上一个单元中&#xf…

拦截|篡改|伪造.NET类库中不限于public的类和方法

大家好&#xff0c;我是沙漠尽头的狼。 本文首发于Dotnet9&#xff0c;介绍使用Lib.Harmony库拦截第三方.NET库方法&#xff0c;达到不修改其源码并能实现修改方法逻辑、预期行为的效果&#xff0c;并且不限于只拦截public访问修饰的类及方法&#xff0c;行文目录&#xff1a;…

Mysql004:用户管理

前言&#xff1a;本章节讲解的是mysql中的用户管理&#xff0c;包括&#xff08;管理数据用户&#xff09;、&#xff08;控制数据库的访问权限&#xff09;。 目录 1. 查询用户 2. 创建用户 3. 修改用户密码 4. 删除用户 5. 权限控制 1. 查询用户 在mysql数据库中&#xff0…

P-GaN栅极HEMT开关瞬态分析中的动态栅极电容模型

标题&#xff1a;Dynamic Gate Capacitance Model for Switching Transient Analysis in P-GaN Gate HEMTs 摘要 在这项工作中&#xff0c;提出了一种用于P-GaN栅极HEMT的高效开关瞬态分析模型&#xff0c;该模型考虑了开关瞬态过程中的动态栅极电容CG(VDS, VGS)特性。同时&a…

【STM32教程】第五章 STM32的定时器

案例代码及相关资料下载链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1hsIibEmsB91xFclJd-YTYA?pwdjauj 提取码&#xff1a;jauj 1 定时器综述 1.1 定时器简介 TIM&#xff08;Timer&#xff09;定时器&#xff0c;最基本功能就是定时触发中断&#xff1…

python随手小练3

题目&#xff1a; 写出一个判断闰年的python代码&#xff1a; 闰年的条件&#xff1a; 如果N能够被4整除&#xff0c;并且不能被100整除&#xff0c;则是闰年 或者&#xff1a;N能被400整除&#xff0c;也是闰年 即&#xff1a;4年一润并且百年不润&#xff0c;每400年再润一…