您的位置:首页 > 教育 > 培训 > 云匠网接单能信吗_广告词大全_互联网广告行业分析_东莞疫情最新消息

云匠网接单能信吗_广告词大全_互联网广告行业分析_东莞疫情最新消息

2025/7/19 7:54:12 来源:https://blog.csdn.net/qq_34272964/article/details/144791045  浏览:    关键词:云匠网接单能信吗_广告词大全_互联网广告行业分析_东莞疫情最新消息
云匠网接单能信吗_广告词大全_互联网广告行业分析_东莞疫情最新消息

前言

在现代微服务架构中,流量控制是确保系统高可用性和稳定性的关键。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,实现更高效的流量管理和系统保护。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com