【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 main

import (
	"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 main

import (
	"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() {
	// 初始化 Sentinel
	err := 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,实现更高效的流量管理和系统保护。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VM虚拟机配置ubuntu网络

目录 桥接模式 NAT模式 桥接模式 特点:ubuntu的IP地址与主机IP的ip地址不同 第一部分:VM虚拟机给ubuntu的网络适配器,调为桥接模式 第二部分:保证所桥接的网络可以上网 第三部分:ubuntu使用DHCP(默认&…

贝叶斯分类——数学模型

贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。 贝叶斯分类是一类利用概率统计知识进行分类的算法,其分类原理是贝叶斯定理。贝叶斯定理是由18世纪概率论和决策论的早期研究者Thomas Bayes发明的&#…

爬虫与反爬虫实现全流程

我选取的网页爬取的是ppt nba版 需要的工具:pycharm,浏览器 爬虫需要观察它的网页信息,然后开始首先爬取它的html,可以看到有人气,标题,日期,咨询 可以看到用get方法 import requests url"https://img-home.csdnimg.cn/images/20230724024159.png?origin_urlhttps%3A%2…

云计算学习架构篇之HTTP协议、Nginx常用模块与Nginx服务实战

一.HTTP协议讲解 1.1rsync服务重构 bash 部署服务端: 1.安装服务 [rootbackup ~]# yum -y install rsync 2.配置服务 [rootbackup ~]# vim /etc/rsyncd.conf uid rsync gid rsync port 873 fake super yes use chroot no max connections 200 timeout 600 ignore erro…

【210】成绩管理系统

--基于springboot毕业设计成绩管理系统 主要功能: 个人中心 管理员管理 毕业论文管理 答辩秘书管理 基础数据管理 公告信息管理 公告信息管理 评阅教师管理 用户管理 指导教师管理 开发技术栈: 开发语言 : Java 开发软件 : Eclipse/MyEclipse/IDEA JDK版本 : JDK8…

Delphi历史版本对照及主要版本特性

Delphi编程的关键特性包括: 可视化开发:Delphi以其独特的开发方法而闻名,它允许开发者通过直观的表单设计器来创建用户界面。这种快速应用程序开发(RAD)的方法大大简化并加速了图形用户界面(GUI&#xff09…

嵌入式系统 第九讲 设备驱动程序设计基础

• 9.1 Linux设备驱动程序简介 • 系统调用:是操作系统内核(Linux系统内核)和应用程序之间 的接口。 • 设备驱动程序:是操作系统内核(Linux系统内核)和机器硬件 之间的接口,设备驱动程序为应用…

算法学习(19)—— 队列与 BFS

关于bfs bfs又称宽搜,全称是“宽度优先遍历”,然后就是关于bfs的三个说法:“宽度优先搜索”,“宽度优先遍历”,“层序遍历”,这三个都是同一个东西,前面我们介绍了大量的深度优先遍历的题目已经…

cellphoneDB进行CCI以及可视化

除了cellchat,在单细胞转录组或者空间组的分析中,cellphoneDB也是一个常用的细胞通讯软件,这个数据库更注重配受体关系,对于有明确先验知识的配受体研究比较友好。 但值得注意的是,它的数据库只包括人的基因名称信息&…

003 字节码

字节码的位置 当我们讨论到字节码,我们需要清楚它在整个学习框架中的位置 如图,字节码是我们写的代码编译之后的结果,与虚拟机很近。 字节码是Java能实现跨平台的基础。 字节码基本知识体系 我们需要关注的点在于class文件的构成上。 字节…

基本算法——回归

本节将通过分析能源效率数据集(Tsanas和Xifara,2012)学习基本的回归算法。我们将基 于建筑的结构特点(比如表面、墙体与屋顶面积、高度、紧凑度)研究它们的加热与冷却负载要 求。研究者使用一个模拟器设计了12种不…

U盘文件剪切丢失的全方位解析与恢复指南

一、U盘文件剪切丢失现象描述 在日常使用U盘的过程中,我们时常会遇到需要将文件从一个位置移动到另一个位置的情况,而剪切加粘贴便是最常用的操作之一。然而,有时在剪切文件后,却意外发现目标位置并没有出现这些文件,…

洛谷 P1075 [NOIP2012 普及组] 质因数分解 C语言

题目: P1075 [NOIP2012 普及组] 质因数分解 - 洛谷 | 计算机科学教育新生态 题目描述 已知正整数 n 是两个不同的质数的乘积,试求出两者中较大的那个质数。 输入格式 输入一个正整数 n。 输出格式 输出一个正整数 p,即较大的那个质数。…

Lecture 17

10’s Complement Representation 主要内容: 1. 10’s 补码表示: • 10’s 补码表示法需要指定表示的数字位数(用 n 表示)。 • 表示的数字取决于 n 的位数,这会影响具体数值的解释。 2. 举例: • 如果采用 3 位补码&…

电子电器架构 --- 智能座舱HUD技术革新

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源&…

零基础微信小程序开发——全局配置之tabBar(保姆级教程+超详细)

🎥 作者简介: CSDN\阿里云\腾讯云\华为云开发社区优质创作者,专注分享大数据、Python、数据库、人工智能等领域的优质内容 🌸个人主页: 长风清留杨的博客 🍃形式准则: 无论成就大小,…

docker redis安装

一.镜像拉取 docker pull redis:5.0新建文件 touch /home/redis/redis.conf touch /home/redis/redis_6379.pid # bind 192.168.1.100 10.0.0.1 # bind 127.0.0.1 ::1 #bind 127.0.0.1protected-mode noport 6379tcp-backlog 511requirepass roottimeout 0tcp-keepali…

0基础跟德姆(dom)一起学AI 自然语言处理08-认识RNN模型

1 什么是RNN模型 RNN(Recurrent Neural Network), 中文称作循环神经网络, 它一般以序列数据为输入, 通过网络内部的结构设计有效捕捉序列之间的关系特征, 一般也是以序列形式进行输出. 一般单层神经网络结构: RNN单层网络结构: 以时间步对RNN进行展开后的单层网络结构: RNN的…

Xilinx PCIe高速接口入门实战(三)

引言:为保证FPGA设备可以连接并被系统识别,本节讨论了PCIe基础规范和PCIe板卡电气规范的对FPGA配置时间具体要求。 1. 配置访问时间 在PCIe的标准系统中,当系统通电时,处理器上运行的配置软件开始扫描PCIe总线以发现机器拓扑。…

InfoNCE Loss详解(上)

引言 InfoNCE对比学习损失是学习句嵌入绕不开的知识点,本文就从头开始来探讨一下它是怎么来的。 先验知识 数学期望与大数定律 期望(expectation,expected value,数学期望,mathematical expectation)是随机变量的平均值&#…