20年大佬深度解析微服务高并发动态数据源:使用Redis动态数据源
mhr18 2025-03-19 00:12 28 浏览 0 评论
动态数据源
Sentinel为每种规则提供一个规则管理器,而规则管理器管理的规则只存在于内存中,在应用重启后,规则会丢失。每个规则管理器都会提供loadRules API,用于在系统运行时为规则管理器注册或更新规则,但是loadRules只接收内存状态的规则对象,如何存储规则由我们自行实现。
由于规则可能会发生改变,如果使用application.yaml(SpringBoot应用)配置文件配置规则,或者直接使用硬编码方式配置规则,则每当要修改规则时都需要重启应用。
为了解决这个问题,我们需要实现规则动态配置。
本篇内容主要包括以下几个方面。
o 实现规则动态配置的两种方式。
o 使用Redis动态数据源。
o 动态配置的实现原理。
o 基于SpringCloud动态配置实现动态数据源。
实现规则动态配置的两种方式
实现规则动态配置有两种方式:一种是先利用Sentinel提供的loadRules API,将规则存储到数据库、文件中等,定时加载规则,再调用loadRules API更新规则;另一种是利用Sentinel提供的DataSource扩展,结合配置中心使用,实现Sentinel提供的ReadableDataSource接口,并实现监听配置中心配置改变以实时获取更新后的配置。
Sentinel控制台支持修改规则配置,使用的是第一种方式,即通过调用loadRules API更新规则,但是并不提供规则持久化的支持,这也是当应用重启后在控制台配置的规则不生效的原因。
Sentinel已提供基于第二种方式的适配多种配置中心的动态数据源,如适配Nacos的NacosDataSource、适配Redis的RedisDataSource。本章只介绍如何使用RedisDataSource实现规则动态配置,如果想要了解如何使用NacosDataSource实现规则动态配置,则可以直接浏览官方文档中的“动态规则扩展”部分。
使用Redis动态数据源
RedisDataSource使用Redis的string数据结构存储规则配置,并且使用Redis的发布-订阅功能监听获取更新后的规则。
要使用RedisDataSource,首先需要导入其jar包。
如果是使用Maven构建的项目,则需要在项目的pom.xml文件中添加如下配置。
如果是使用Gradle构建的项目,则需要在项目的gradle.build文件中添加如下配置。
注意:版本号建议与项目中使用的sentinel-core版本号一致,从而避免因为API差异,配置不生效的情况发生。
在使用RedisDataSource时,需要为用到的每种流量控制规则单独配置一个RedisDataSource。假设当前只需要使用限流功能,那么只需要注册一个用于读取限流规则的RedisDataSource即可,代码如下。
Sentinel提供InitFunc,可用于在Sentinel初始化之前为Sentinel添加配置,在本案例中并未使用InitFunc,而是使用了SpringBoot的配置类实现配置,在SentinelConfiguration类被加载时,为Sentinel注册限流规则的动态数据源,详细步骤分析如下。
①因为规则以string数据结构被存储在Redis中,所以需要一个规则转换器,用于将从Redis中读取的规则配置字符串转换为FlowRule数组,如果是以JSON格式存储的规则,则该转换器就是实现JSON字符串的序列化与反序列化。
② RedisDataSource需要操作Redis,所以需要提供可以连接到Redis的配置。
③ 创建一个RedisDataSource实例。RedisDataSource构造方法有4个参数:config表示Redis连接配置;ruleKey表示缓存规则的key;channel表示发布-订阅的通道;flowConfigParser表示规则转换器。
④ 调用限流规则管理器的register2Property API注册数据源。
提示:在SpringBoot项目中,推荐实现ApplicationRunner接口,并在Spring容器初始化完成时再为Sentinel添加配置,此时应用还未接收请求。
当服务上线后,如果需要修改限流规则,则需要先将修改后的限流规则转换为JSON字符串,再修改ruleKey的value为新的JSON字符串,同时使用Redis的PUBLISH命令向channel中写入新的JSON字符串。
本文给大家讲解的内容是深度解析微服务高并发动态数据源 :实现规则动态配置的两种方式,使用Redis动态数据源
- 下篇文章给大家讲解的内容是深度解析微服务高并发动态数据源 :动态配置的实现原理
- 感谢大家的支持!
相关推荐
- 【推荐】一个开源免费、AI 驱动的智能数据管理系统,支持多数据库
-
如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!.前言在当今数据驱动的时代,高效、智能地管理数据已成为企业和个人不可或缺的能力。为了满足这一需求,我们推出了这款开...
- Pure Storage推出统一数据管理云平台及新闪存阵列
-
PureStorage公司今日推出企业数据云(EnterpriseDataCloud),称其为组织在混合环境中存储、管理和使用数据方式的全面架构升级。该公司表示,EDC使组织能够在本地、云端和混...
- 对Java学习的10条建议(对java课程的建议)
-
不少Java的初学者一开始都是信心满满准备迎接挑战,但是经过一段时间的学习之后,多少都会碰到各种挫败,以下北风网就总结一些对于初学者非常有用的建议,希望能够给他们解决现实中的问题。Java编程的准备:...
- SQLShift 重大更新:Oracle→PostgreSQL 存储过程转换功能上线!
-
官网:https://sqlshift.cn/6月,SQLShift迎来重大版本更新!作为国内首个支持Oracle->OceanBase存储过程智能转换的工具,SQLShift在过去一...
- JDK21有没有什么稳定、简单又强势的特性?
-
佳未阿里云开发者2025年03月05日08:30浙江阿里妹导读这篇文章主要介绍了Java虚拟线程的发展及其在AJDK中的实现和优化。阅前声明:本文介绍的内容基于AJDK21.0.5[1]以及以上...
- 「松勤软件测试」网站总出现404 bug?总结8个原因,不信解决不了
-
在进行网站测试的时候,有没有碰到过网站崩溃,打不开,出现404错误等各种现象,如果你碰到了,那么恭喜你,你的网站出问题了,是什么原因导致网站出问题呢,根据松勤软件测试的总结如下:01数据库中的表空间不...
- Java面试题及答案最全总结(2025版)
-
大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Sprin...
- 数据库日常运维工作内容(数据库日常运维 工作内容)
-
#数据库日常运维工作包括哪些内容?#数据库日常运维工作是一个涵盖多个层面的综合性任务,以下是详细的分类和内容说明:一、数据库运维核心工作监控与告警性能监控:实时监控CPU、内存、I/O、连接数、锁等待...
- 分布式之系统底层原理(上)(底层分布式技术)
-
作者:allanpan,腾讯IEG高级后台工程师导言分布式事务是分布式系统必不可少的组成部分,基本上只要实现一个分布式系统就逃不开对分布式事务的支持。本文从分布式事务这个概念切入,尝试对分布式事务...
- oracle 死锁了怎么办?kill 进程 直接上干货
-
1、查看死锁是否存在selectusername,lockwait,status,machine,programfromv$sessionwheresidin(selectsession...
- SpringBoot 各种分页查询方式详解(全网最全)
-
一、分页查询基础概念与原理1.1什么是分页查询分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难...
- 《战场兄弟》全事件攻略 一般事件合同事件红装及隐藏职业攻略
-
《战场兄弟》全事件攻略,一般事件合同事件红装及隐藏职业攻略。《战场兄弟》事件奖励,事件条件。《战场兄弟》是OverhypeStudios制作发行的一款由xcom和桌游为灵感来源,以中世纪、低魔奇幻为...
- LoadRunner(loadrunner录制不到脚本)
-
一、核心组件与工作流程LoadRunner性能测试工具-并发测试-正版软件下载-使用教程-价格-官方代理商的架构围绕三大核心组件构建,形成完整测试闭环:VirtualUserGenerator(...
- Redis数据类型介绍(redis 数据类型)
-
介绍Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sortedset:有序集合)。1、字符串类型概述1.1、数据类型Redis支持...
- RMAN备份监控及优化总结(rman备份原理)
-
今天主要介绍一下如何对RMAN备份监控及优化,这里就不讲rman备份的一些原理了,仅供参考。一、监控RMAN备份1、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)