【Go】:Sentinel 动态数据源配置指南

前言

在现代微服务架构中,流量控制是确保系统高可用性和稳定性的关键。Sentinel 是一款由阿里巴巴开源的流量控制组件,它不仅支持熔断降级和流量整形,还能通过动态数据源(如本地文件或 Nacos)加载规则,从而为应用提供更加灵活的服务保护机制。本文将详细指导您如何利用 Go 语言配置 Sentinel 的动态数据源,并分享一些最佳实践。

一、准备工作

  • 安装 Docker:确保本地已经安装了 Docker 环境。如果尚未安装,请访问 Docker官网 获取最新版本的安装指南。
  • 下载 Sentinel 客户端:根据你的应用语言环境选择对应的 Sentinel SDK 或者中间件集成方式。
  • 准备规则文件:在项目根目录下创建名为 rules.json 的文件,用来存放流控规则。示例如下:
[{"resource": "test","threshold": 0,"tokenCalculateStrategy": 0,"controlBehavior": 0,"statIntervalInMs": 1000}
]

二、使用 Docker 部署动态配置中心

我们将以两个流行的配置中心为例,分别是基于键值存储的 etcd 和提供丰富配置管理功能的 Nacos。这两个工具都可以轻松地通过 Docker 来部署。

2.1. 本地文件

2.1.1 准备规则文件

在项目目录下创建一个名为 rules.json 的文件,用于存放流控规则。例如:

[{"resource": "test","threshold": 0,"tokenCalculateStrategy": 0,"controlBehavior": 0,"statIntervalInMs": 1000}
]

2.1.2 编写 Sentinel 限流 Demo

package mainimport ("fmt""github.com/alibaba/sentinel-golang/api""github.com/alibaba/sentinel-golang/core/base""github.com/alibaba/sentinel-golang/ext/datasource""log""math/rand""time""github.com/alibaba/sentinel-golang/ext/datasource/file"
)func main() {// 定义流控规则的文件路径filePath := "./file/rules.json"// 创建一个处理流量控制规则的处理器h := datasource.NewFlowRulesHandler(datasource.FlowRuleJsonArrayParser)// 创建一个基于文件的数据源,使用指定的文件路径和处理器ds := file.NewFileDataSource(filePath, h)// 初始化数据源,如果失败则记录错误并退出程序err := ds.Initialize()if err != nil {log.Fatalf("创建文件数据源失败: %+v", err)}// 启动一个 goroutine 模拟请求go func() {for {// 创建 Sentinel 入口节点,资源名为 "test"e, b := api.Entry("test", api.WithTrafficType(base.Inbound))if b != nil {// 如果请求被 Sentinel 阻止,打印阻止类型fmt.Printf("请求被 Sentinel 阻止: %v\n", b.BlockType())} else {// 如果请求通过 Sentinel,打印通过信息fmt.Println("请求通过 Sentinel")// 退出 Sentinel 入口节点e.Exit()}// 模拟处理时间,随机睡眠 10-90 毫秒time.Sleep(time.Duration(rand.Uint64()%80+10) * time.Millisecond)}}()// 主 goroutine 无限阻塞,防止程序退出select {}
}

2.1.3 测试动态配置

运行项目,所有请求都被阻断。


修改 rules.json 文件中的规则(比如修改 threshold:100)。Sentinel 自动检测到了文件的变化,并相应地更新了内部规则。此时,所有请求都通过了。

2.2.部署 Nacos

2.2.1 拉取 Nacos 镜像

docker pull nacos/nacos-server:latest

2.2.2 启动 Nacos 单机版实例

docker run -d --name nacos -p 8848:8848 -e MODE=standalone nacos/nacos-server:latest

上述命令启动了一个名为 nacos 的容器,并映射了 Nacos 的默认端口(8848)。你可以

2.2.3 在 Nacos 中存储规则

通过 http://localhost:8848/nacos 访问 Nacos 控制台(账号:nacos,密码:nacos),配置 Namespace、Group、Data ID,之后配置限流规则。

[{"resource": "test","threshold": 0,"tokenCalculateStrategy": 0,"controlBehavior": 0,"statIntervalInMs": 1000}
]

2.2.4 编写 Sentinel 限流 Demo

package mainimport ("fmt""log""math/rand""time""github.com/alibaba/sentinel-golang/api""github.com/alibaba/sentinel-golang/core/base""github.com/alibaba/sentinel-golang/ext/datasource""github.com/alibaba/sentinel-golang/pkg/datasource/nacos""github.com/nacos-group/nacos-sdk-go/clients""github.com/nacos-group/nacos-sdk-go/common/constant"
)// Nacos 相关配置
const (NamespaceID = "1bfc7fd2-e727-4ec5-b6af-941718755d16"Group       = "testGroup"DataID      = "testDataId"
)func main() {// 初始化 Sentinelerr := api.InitDefault()if err != nil {log.Fatalf("初始化 Sentinel 失败: %v", err)}// 配置 Nacos 服务器信息sc := []constant.ServerConfig{{ContextPath: "/nacos",Port:        8848,IpAddr:      "10.225.254.130",},}// 配置 Nacos 客户端信息cc := constant.ClientConfig{TimeoutMs:   5000,NamespaceId: NamespaceID,}// 创建 Nacos 配置客户端client, err := clients.CreateConfigClient(map[string]interface{}{"serverConfigs": sc,"clientConfig":  cc,})if err != nil {log.Fatalf("创建 Nacos 配置客户端失败: %+v", err)}// 创建一个处理流量控制规则的处理器h := datasource.NewFlowRulesHandler(datasource.FlowRuleJsonArrayParser)// 创建 Nacos 数据源nds, err := nacos.NewNacosDataSource(client, Group, DataID, h)if err != nil {log.Fatalf("创建 Nacos 数据源失败: %+v", err)}// 初始化 Nacos 数据源并加载规则err = nds.Initialize()if err != nil {log.Fatalf("初始化 Nacos 数据源失败: %+v", err)}// 模拟请求go func() {for {// 创建 Sentinel 入口节点,资源名为 "test"e, b := api.Entry("test", api.WithTrafficType(base.Inbound))if b != nil {// 如果请求被 Sentinel 阻止,打印阻止类型fmt.Printf("请求被 Sentinel 阻止: %v\n", b.BlockType())} else {// 如果请求通过 Sentinel,打印通过信息fmt.Println("请求通过 Sentinel")// 退出 Sentinel 入口节点e.Exit()}// 模拟处理时间,随机休眠 10-90 毫秒time.Sleep(time.Duration(rand.Uint64()%80+10) * time.Millisecond)}}()// 保持主 goroutine 运行,防止程序退出select {}
}

 2.2.5 测试动态配置

运行项目,所有请求都被阻断。

修改 Nacos 中  限流规则(比如修改 threshold:100)。Nacos 自动检测到到规则的变化,Sentinel 相应地更新了内部规则。此时,所有请求都通过了。

总结

通过结合 Sentinel 和本地文件或 Nacos,我们为 Go 应用创建了一个灵活且高效的动态配置管理系统。此方案提升了系统的响应速度,减少了配置更新导致的服务中断风险,非常适合生产环境的大规模部署。希望本文的指南能帮助您更好地应用 Sentinel,实现更高效的流量管理和系统保护。

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

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

相关文章

STM32学习之通信协议1 USART

时钟特性,比如发送一个波形高电平,然后低电平,接收方怎么知道是1、0还是1、1、0、0 ? 这就需要有一个时钟信号来告诉接收方什么时候需要采集数据。时钟特性分为同步和异步。 I2C和SPI有单独的时钟线,所以它们是同步的&…

Arduino 小白的 DIY 空气质量检测仪(3)- TVOC模块、CO2模块

接上回 逐个分析 m_TVOC.h #include <Arduino.h>#include <SoftI2C.h>#include "DFRobot_SGP40.h"// TVOC指数 // 型号&#xff1a;sgp_40 // 接口&#xff1a;VCC->VCC(5V)、GND->GND、SDA->D6、SCL->D7、WAK->GND // 协议&#xff1…

主数据驱动的数据治理框架

目录 数据资产分类 数据治理的重要性 数据质量框架的4个方面 数据治理的核心是加强对数据资产的管控,通过深化数据服务,持续创造价值。数据治 理是在数据资产价值创造的过程中,治理团队对数据资产管理的评价、指导、控制,如下图所示。 数据资产分类 数据资产划分成为主数据…

【大模型实战篇】LLaMA Factory微调ChatGLM-4-9B模型

1. 背景介绍 虽然现在大模型微调的文章很多&#xff0c;但纸上得来终觉浅&#xff0c;大模型微调的体感还是需要自己亲自上手实操过&#xff0c;才能有一些自己的感悟和直觉。这次我们选择使用llama_factory来微调chatglm-4-9B大模型。 之前微调我们是用两块3090GPU显卡&…

AnnotationConfigApplicationContext流程看实例化的beanPostProcessor

接上一篇https://blog.csdn.net/qq_26437925/article/details/144865082 探究一下beanPostProcessors怎么加进来的 目录 首先register(annotatedClasses);后添加了重要的beanDefinition: ConfigurationClassPostProcessorinvokeBeanFactoryPostProcessors(beanFactory);执行后…

pip 下载安装时使用国内源配置

pip 是 Python 的包管理工具&#xff0c;用于安装和管理第三方库。然而&#xff0c;在某些情况下&#xff0c;默认的 PyPI&#xff08;Python Package Index&#xff09;源可能由于网络原因导致下载速度慢或者连接不稳定。幸运的是&#xff0c;我们可以轻松地配置 pip 使用国内…

LinuxC高级day4

作业: 1.思维导图 2.终端输入一个C源文件名(.c结尾)判断文件是否有内容&#xff0c;如果没有内容删除文件&#xff0c;如果有内容编译并执行改文件。 3.终端输入两个文件名&#xff0c;判断哪个文件的时间戳更新

RuoYi-Vue从http升级为https(Jar+Nginx)

一、前提条件 1.已通过数字证书管理服务控制台签发证书。 2.SSL证书绑定的域名已完成DNS解析,即域名与主机IP地址相互映射。 附:阿里云网站运维检测平台 3.已在Web服务器开放443端口(HTTPS通信的标准端口)。 如果使用的是阿里云ECS服务器,请确保已经在安全组规则入方向…

OpenCV相机标定与3D重建(39)计算校正畸变后的新相机内参矩阵函数getOptimalNewCameraMatrix()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 根据自由缩放参数返回新的相机内参矩阵。 cv::getOptimalNewCameraMatrix 是 OpenCV 库中的一个函数&#xff0c;用于计算校正畸变后的新相机内…

OkHttp深度解析:请求流程、分发器机制、拦截器工作及TCP连接复用

目录 一、OkHttp请求的请求流程是怎样的? 二、OkHttp分发器是怎样工作的? 2.1 请求队列与线程池维护 2.2 异步请求处理 2.3 同步请求处理 2.4 请求执行 2.5 请求完成处理&#xff1a; 2.6 线程池设计 三、OkHttp拦截器是如何工作的? 四、应用拦截器和网络拦截器的…

云计算课程报告实验-WordCount算法实验 过程记录

内容描述 本实验指导书通过在华为鲲鹏上&#xff0c;编译运行WordCount程序。完成实验操作后&#xff0c;读者会掌握简单的程序编写&#xff0c;如WordCount中的getWords、countWords、treeMerge。 实验环境 华为鲲鹏云主机、openEuler 20.03操作系统&#xff1b;安装mpich-3…

2018年全国硕士研究生入学统一考试管理类专业学位联考英语(二)试题-纯享题目版

&#x1f3e0;个人主页&#xff1a;fo安方的博客✨ &#x1f482;个人简历&#xff1a;大家好&#xff0c;我是fo安方&#xff0c;目前中南大学MBA在读&#xff0c;也考取过HCIE Cloud Computing、CCIE Security、PMP、CISP、RHCE、CCNP RS、PEST 3等证书。&#x1f433; &…

kafka使用常见问题

连接不上kafka,报下边的错 org.apache.kafka.common.KafkaException: Producer is closed forcefully.at org.apache.kafka.clients.producer.internals.RecordAccumulator.abortBatches(RecordAccumulator.java:760) [kafka-clients-3.0.2.jar:na]at org.apache.kafka.client…

Jenkins(持续集成与自动化部署)

Jenkins 是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具。 官网&#xff1a;https://www.jenkins.io/ GitLab安装使用 安装前提&#xff1a;内存至少需要4G 官方网站&#xff1a;https://about.gitlab.com/ 安装文档&#xff1a;https://docs.gitlab.c…

MyBatis执行一条sql语句的流程(源码解析)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 MyBatis执行一条sql语句的流程&#xff08;源码解析&#xff09; MyBatis执行sql语句的流程加载配置文件加载配置文件的流程 创建sqlsessionFactory对象解析Mapper创建sqlses…

【C++】探索C++11中的范围for循环与auto关键字

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;1. 范围for循环的基础用法1.1 什么是范围for循环&#xff1f;1.2 示例代码代码解析 1.3 范围for的特点传统for循环与范围for循环对比 1.4 使用引用修改元素 &#x1f4af;2…

mac下载Homebrew安装nvm

通过Homebrew安装 - 国内下载地址 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"安装nvm brew install nvm 配置nvm环境变量 export NVM_DIR“$HOME/.nvm” [ -s “/usr/local/opt/nvm/nvm.sh” ] && . “/usr/…

解決當前IP地址僅適用於本地網路

想要解決“當前IP地址僅適用於本地網路”其實並不困難。本篇文章將介紹其發生的原因以及如何解決。 “僅限本地網路”是什麼意思&#xff1f; 當IP地址為“僅限本地網路”時&#xff0c;意味著設備正在使用私人網路內部IP地址&#xff0c;但無法連接到互聯網。如果將本地IP視…

HANA数据库 XS 503 Service not available

http_url配置正确 在将单个数据库系统转换为多租户数据库容器系统之后&#xff0c;无法通过URL访问新租户数据库的独立XS引擎服务。调用相应的URL会产生这样的错误&#xff1a;503服务不可用 Solution &#xff08;启用租户数据库引擎的嵌套模式&#xff08;HDD不用&#xff…

【大模型实战篇】Mac本地部署RAGFlow的踩坑史

1. 题外话 最近一篇文章还是在11月30日写的&#xff0c;好长时间没有打卡了。最近工作上的事情特别多&#xff0c;主要聚焦在大模型的预训练、微调和RAG两个方面。主要用到的框架是Megatron-DeepSpeed&#xff0c;后续会带来一些分享。今天的文章主要聚焦在RAG。 近期调研了一系…