Spring Cloud Alibaba Sentinel 动态规则扩展

news2024/11/18 2:35:49

前言

到目前为止,我们的规则定义是这样的:

    @PostConstruct
    public void initRole(){
        List<FlowRule> rules = new ArrayList<>(1);
        FlowRule rule = new FlowRule();
        // 设置规则匹配的资源名称
        rule.setResource("myFlowResource");
        // 规则作用类型(此为QPS类型,还有一种为FLOW_GRADE_THREAD,线程数类型)
        // 默认为QPS类型
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        // 按Grade设置,此处为限制 QPS 为 2.
        rule.setCount(2);
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }

是使用Java硬编码的方式来定义规则,所有的规则定义都定义在内存中,这样定义无法动态的修改以及持久化规则。

Sentinel 提供两种方式修改规则:

  • 通过 API 直接修改 (loadRules) – 即为我们示例的使用方式
  • 通过 DataSource 适配不同数据源修改(推荐的使用方式)

DataSource 扩展

规则的推送方式

  • 原始模式:API 将规则推送至客户端并直接更新到内存中,扩展写数据源(WritableDataSource)不保证一致性;规则保存在内存中,重启即消失
    在这里插入图片描述

  • 拉模式:客户端主动向某个规则管理中心定期轮询拉取规则,这个规则中心可以是 RDBMS、文件 等。扩展写数据源(WritableDataSource)。不保证一致性;实时性不保证,拉取过于频繁也可能会有性能问题。
    在这里插入图片描述

  • 推模式:规则中心统一推送,客户端通过注册监听器的方式时刻监听变化,比如使用 Nacos、Zookeeper 等配置中心。这种方式有更好的实时性和一致性保证。生产环境下一般采用 push 模式的数据源。扩展读数据源(ReadableDataSource)。
    在这里插入图片描述

推模式支持的数据源有:ZooKeeper, Redis, Nacos, Apollo, etcd等

本文只介绍Nacos实现的推模式。

Nacos实现推模式

Nacos实现推模式主要分为两部分

  1. 客户端从Nacos获取规则

  2. Sentinel控制台发布规则到Nacos(需对控制台代码进行改造,所以前篇我们建议使用源码打包方式部署Sentinel控制台)

    • 如果不用控制台,其实也可以,只要按照规则将规则配置发布到Nacos即可。

改造控制台

控制台关于流控的 Controller 在 com.alibaba.csp.sentinel.dashboard.controller.v2 包中 FlowControllerV2 ,FlowControllerV2 有两个对于流控规则数据的持久化接口(此处修改请注意,本文使用的控制台版本为1.8.6,在界面上设置流控规则,它提交的地址不是flow/v2,而是flow/v1)所以即便修改了如下接口,也无法实现,还需要修改控制台的前端代码。

    @Autowired
    @Qualifier("flowRuleDefaultProvider")
    private DynamicRuleProvider<List<FlowRuleEntity>> ruleProvider;
    @Autowired
    @Qualifier("flowRuleDefaultPublisher")
    private DynamicRulePublisher<List<FlowRuleEntity>> rulePublisher;

控制台的test代码中有提供流控规则的示例代码,我们在此基础上进行扩展
在这里插入图片描述

看过控制台源码的朋友肯定明白,官网提供的控制台程序只提供了简单的实现而已,如果有需求、且资源时间足够,大家可以参考这个控制台源码进行自定义修改,后续我们会大概介绍Sentinel客户端和控制台之间的通信过程。

客户端从Nacos获取规则

只需将规则的定义代码修改为如下即可

 // remoteAddress 代表 Nacos 服务端的地址
 // groupId 和 dataId 对应 Nacos 中相应配置
 ReadableDataSource<String, List<FlowRule>> flowRuleDataSource =
         new NacosDataSource<>(remoteAddress , groupId ,dataId ,
         source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>(){}));
 FlowRuleManager.register2Property(flowRuleDataSource.getProperty());

示例中为流控规则 List<FlowRule> ,要定义 DegradeRule 只需要替换一些参数即可。

NacosDataSource 构造函数最后一个参数为 数据转换类,我们这里定义的json转换而已,最终看你的数据在Nacos中是什么表示。

示例规则

Nacos配置

在这里插入图片描述

客户端规则初始化代码

@PostConstruct
public void initRole(){
     Properties nacosPro = new Properties();
     nacosPro.put(PropertyKeyConst.SERVER_ADDR,"127.0.0.1:8848");
     // 命令空间,如果你是使用的默认public,此处可以不用配置
     nacosPro.put(PropertyKeyConst.NAMESPACE,"855e91a2-60e7-48c3-aa3f-27aa2f8a0f73");

     // remoteAddress 代表 Nacos 服务端的地址
     // groupId 和 dataId 对应 Nacos 中相应配置
     ReadableDataSource<String, List<FlowRule>> flowRuleDataSource =
             new NacosDataSource<>(nacosPro, "Sentinel_Demo_Group", "com.yyoo.sentinel.demo.FlowRule",
             source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>(){}));
     FlowRuleManager.register2Property(flowRuleDataSource.getProperty());
 }

此处它的底层代码就是Nacos的 java SDK代码。本文不做过多介绍了,需要的可以参考我们 Nacos的Java SDK 一文。

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

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

相关文章

基于云原生分布式存储ceph实现k8s数据持久化

文章目录1、初始化集群1.1 集群机器配置1.2 配置主机名1.3 配置hosts文件1.4、配置互信1.5、关闭防火墙1.6、关闭selinux1.7、配置Ceph安装源1.8、配置时间同步1.9、安装基础软件包2、安装ceph集群2.1 安装ceph-deploy2.2 创建monitor节点2.3 安装ceph-monitor2.4 部署osd服务2…

Springboot毕业生生活用品出售网站系统-java ssm

(a) 管理员&#xff1b;管理员进入系统主要功能包括个人中心&#xff0c;用户管理&#xff0c;商家管理&#xff0c;用品分类管理&#xff0c;用品信息管理&#xff0c;系统管理&#xff0c;订单管理等功能并进行操作。 (b) 商家&#xff1b;商家进入系统主要功能包括个人中心&…

2004-2019年285个地级市实际GDP与名义GDP

2004-2019年285个地级市实际GDP和名义GDP 1、时间&#xff1a;2004-2019年 2、范围&#xff1a;285个地级市 3、说明&#xff1a;GDP平减指数采用地级市所在省份当年平减指数 4、代码&#xff1a; "gen rgdp gdp if year 2003 gen rgdp gdp if year 2003" re…

Java集合面试题:HashMap源码分析

文章目录一、HashMap源码二、HashMap数据结构模型图三、HashMap中如何确定元素位置四、关于equals与hashCode函数的重写五、阅读源码基本属性参考文章&#xff1a;史上最详细的 JDK 1.8 HashMap 源码解析参考文章&#xff1a;Hash详解参考文章&#xff1a;hashCode源码分析参考…

elasticsearch映射及字段类型

查询映射关系类型上对字段的类型进行映射&#xff0c;我们前面知道可以通过get方法请求_mapping查询指定类型的映射关系&#xff1a;此语句可以查询get-together索引下的group类型的映射关系更新映射关系使用put方法可以更新类型的映射这里指定了new-events类型的字段映射关系&…

【C语言】qsort——回调函数

目录 1.回调函数 2.qsort函数 //整形数组排序 //结构体排序 3.模拟实现qsort //整型数组排序 //结构体排序 1.回调函数 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另一个函数&#xff0c;当这个指针被用来…

基础篇——如何在HTML元素中设置CSS样式

CSS Id 和 Class选择器 如果你要在HTML元素中设置CSS样式,你需要在元素中设置"id" 和 "class"选择器。 id 选择器 id 选择器可以为标有特定 id 的 HTML 元素指定特定的样式。 HTML元素以id属性来设置id选择器,CSS 中 id 选择器以 "#" 来定义…

四、Java框架之SpringMVC2_SSM整合

黑马课程 文章目录1. SSM整合案例1.1 创建web项目&#xff0c;并导入坐标1.2 完整的配置类SpringConfigJdbcConfigMyBatisConfigSpringMvcConfigSpringMvcSupportServletConfig1.3 创建数据库及表1.4 编写功能模块domain包dao包service包controller包1.5 接口测试2. 表现层与前…

XSS跨站脚本攻击剖析与防御:初识XSS

目录 跨站脚本介绍 1. 什么是XSS跨站脚本 2. XSS跨站脚本实例 3. XSS漏洞的危害 XSS的分类 1. 反射型XSS 2. 持久性XSS XSS构造 1. 利用< >标记注射Html /Javascript 2. 利用HTML标签属性值执行XSS 3. 空格回车Tab 4. 对标签属性值转码 5. 产生自己的事件…

PorterDuffXfermode与圆角图片

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 圆角图片 在项目开发中&#xff0c;我们常用到这样的功能&#xff1a;显示圆角图片。 这个是咋做的呢&#xff1f;我们来瞅瞅其中一种实现方式 /*** param bitmap 原图* p…

ChatGPT的注册与使用方法

ChatGPT无疑是最近最火的一个大模型AI应用,当艺术家还在跟AI争论AI绘画的问题时,NLP领域中的ChatGPT大模型应用,仿佛一下子替代了AI绘画应用,成为了最新争论的话题。最近也看到很多人在讨论ChatGPT,当然,很多人就算不是人工智能领域的也开始讨论ChatGPT,可见ChatGPT的风…

代替swagger的api接口神器

自动化API文档-APIFOX 文章作者&#xff1a;老杨 一&#xff1a;概述 大家在后端开发开发过程中&#xff0c;最痛恨的两天事情&#xff1a;1.写文档&#xff0c;2.别人不写文档。而我们后端开发&#xff0c;必定经历的事情就是要和前端&测试对接&#xff0c;我们需要把我…

vue104-123

影院组件 更改滚动条范围&#xff1a; 动态结算高度 //动态结算高度 this.height document.documentElement.clientHeight-选项卡高度this.height document.documentElement.clientHeight- document.querySelector(footer).offsetHeight px组件库elementUI 网址elementUI…

Docker Compose编排

一、概念1、Docker Compose是什么Docker Compose的前身是Fig&#xff0c;它是一个定义及运行多个Docker容器的工具通过 Compose&#xff0c;不需要使用shell脚本来启动容器&#xff0c;而使用 YAML 文件来配置应用程序需要的所有服务然后使用一个命令&#xff0c;根据 YAML 的文…

Spring Boot课程评价管理系统

文章目录主要功能截图&#xff1a;主要代码展示数据库设计设计总结项目地址&#x1f345; 作者主页&#xff1a;Java韩立 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、【java韩立】公号作者✌ 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 …

handler解析(2) -Handler源码解析

目录 基础了解&#xff1a; 相关概念解释 整体流程图&#xff1a; 源码解析 Looper 总结&#xff1a; sendMessage 总结&#xff1a; ThreadLocal 基础了解&#xff1a; Handler是一套 Android 消息传递机制,主要用于线程间通信。实际上handler其实就是主线程在起了一…

聊聊并发与锁

持续坚持原创输出&#xff0c;点击蓝字关注我吧1.并发与并行并发可以充分地利用 CPU 资源&#xff0c;一般都会使用多线程实现。多线程的作用是提高任务的平均执行速度&#xff0c;但是会导致程序可理解性变差&#xff0c;编程难度加大。关于对并发与并行的概念&#xff0c;大家…

共享模型之无锁(三)

1.原子累加器 示例代码: public class TestAtomicAdder {public static void main(String[] args) {for (int i 0; i < 5; i) {demo(() -> new AtomicLong(0),(adder) -> adder.getAndIncrement());}for (int i 0; i < 5; i) {demo(() -> new LongAdder(),(…

C++复习笔记6

1.String类的实现 注意深浅拷贝&#xff0c; C语言字符串拼接函数strcat() #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<vld.h> #include<assert.h> using namespace std;class String {friend ostream& operator<<(ostream &am…

【DSView逻辑分析抓取波形CAN步骤-硬件连接-数据解析-底层波形认识CAN-工具使用】

【DSView逻辑分析抓取波形CAN步骤-硬件连接-数据解析-底层波形认识CAN】1、概述2、实验环境3、写在前面的一个问题4、实验准备&#xff08;1&#xff09;硬件连接1&#xff09;CAN卡连接开发板&#xff08;2&#xff09;逻辑分析仪连接开发板&#xff08;2) CAN卡连接软件&…