欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go Sentinel 動(dòng)態(tài)數(shù)據(jù)源配置指南(示例詳解)

 更新時(shí)間:2025年01月09日 10:30:58   作者:尋找09之夏  
本文介紹了如何使用Go語(yǔ)言配置Sentinel的動(dòng)態(tài)數(shù)據(jù)源,并通過(guò)本地文件和Nacos兩種方式實(shí)現(xiàn)動(dòng)態(tài)配置,通過(guò)這種方式,可以靈活地管理和更新限流規(guī)則,提升系統(tǒng)的穩(wěn)定性和響應(yīng)速度,感興趣的朋友跟隨小編一起看看吧

前言

在現(xiàn)代微服務(wù)架構(gòu)中,流量控制是確保系統(tǒng)高可用性和穩(wěn)定性的關(guān)鍵。Sentinel 是一款由阿里巴巴開(kāi)源的流量控制組件,它不僅支持熔斷降級(jí)和流量整形,還能通過(guò)動(dòng)態(tài)數(shù)據(jù)源(如本地文件或 Nacos)加載規(guī)則,從而為應(yīng)用提供更加靈活的服務(wù)保護(hù)機(jī)制。本文將詳細(xì)指導(dǎo)您如何利用 Go 語(yǔ)言配置 Sentinel 的動(dòng)態(tài)數(shù)據(jù)源,并分享一些最佳實(shí)踐。

一、準(zhǔn)備工作

  • 安裝 Docker:確保本地已經(jīng)安裝了 Docker 環(huán)境。如果尚未安裝,請(qǐng)?jiān)L問(wèn) Docker官網(wǎng) 獲取最新版本的安裝指南。
  • 下載 Sentinel 客戶端:根據(jù)你的應(yīng)用語(yǔ)言環(huán)境選擇對(duì)應(yīng)的 Sentinel SDK 或者中間件集成方式。
  • 準(zhǔn)備規(guī)則文件:在項(xiàng)目根目錄下創(chuàng)建名為rules.json的文件,用來(lái)存放流控規(guī)則。

示例如下:

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

二、使用 Docker 部署動(dòng)態(tài)配置中心

我們將以兩個(gè)流行的配置中心為例,分別是基于鍵值存儲(chǔ)的 etcd 和提供豐富配置管理功能的 Nacos。這兩個(gè)工具都可以輕松地通過(guò) Docker 來(lái)部署。

2.1. 本地文件

2.1.1準(zhǔn)備規(guī)則文件

在項(xiàng)目目錄下創(chuàng)建一個(gè)名為 rules.json 的文件,用于存放流控規(guī)則。例如:

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

2.1.2編寫(xiě) 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() {
	// 定義流控規(guī)則的文件路徑
	filePath := "./file/rules.json"
	// 創(chuàng)建一個(gè)處理流量控制規(guī)則的處理器
	h := datasource.NewFlowRulesHandler(datasource.FlowRuleJsonArrayParser)
	// 創(chuàng)建一個(gè)基于文件的數(shù)據(jù)源,使用指定的文件路徑和處理器
	ds := file.NewFileDataSource(filePath, h)
	// 初始化數(shù)據(jù)源,如果失敗則記錄錯(cuò)誤并退出程序
	err := ds.Initialize()
	if err != nil {
		log.Fatalf("創(chuàng)建文件數(shù)據(jù)源失敗: %+v", err)
	}
	// 啟動(dòng)一個(gè) goroutine 模擬請(qǐng)求
	go func() {
		for {
			// 創(chuàng)建 Sentinel 入口節(jié)點(diǎn),資源名為 "test"
			e, b := api.Entry("test", api.WithTrafficType(base.Inbound))
			if b != nil {
				// 如果請(qǐng)求被 Sentinel 阻止,打印阻止類(lèi)型
				fmt.Printf("請(qǐng)求被 Sentinel 阻止: %v\n", b.BlockType())
			} else {
				// 如果請(qǐng)求通過(guò) Sentinel,打印通過(guò)信息
				fmt.Println("請(qǐng)求通過(guò) Sentinel")
				// 退出 Sentinel 入口節(jié)點(diǎn)
				e.Exit()
			}
			// 模擬處理時(shí)間,隨機(jī)睡眠 10-90 毫秒
			time.Sleep(time.Duration(rand.Uint64()%80+10) * time.Millisecond)
		}
	}()
	// 主 goroutine 無(wú)限阻塞,防止程序退出
	select {}
}

2.1.3 測(cè)試動(dòng)態(tài)配置

運(yùn)行項(xiàng)目,所有請(qǐng)求都被阻斷。


修改 rules.json 文件中的規(guī)則(比如修改threshold:100)。Sentinel 自動(dòng)檢測(cè)到了文件的變化,并相應(yīng)地更新了內(nèi)部規(guī)則。此時(shí),所有請(qǐng)求都通過(guò)了。

2.2.部署 Nacos

2.2.1 拉取 Nacos 鏡像

docker pull nacos/nacos-server:latest

2.2.2啟動(dòng) Nacos 單機(jī)版實(shí)例

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

上述命令啟動(dòng)了一個(gè)名為 nacos 的容器,并映射了 Nacos 的默認(rèn)端口(8848)。你可以

2.2.3在 Nacos 中存儲(chǔ)規(guī)則

通過(guò) http://localhost:8848/nacos 訪問(wèn) Nacos 控制臺(tái)(賬號(hào):nacos,密碼:nacos),配置 Namespace、Group、Data ID,之后配置限流規(guī)則。

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

2.2.4 編寫(xiě) 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 相關(guān)配置
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 服務(wù)器信息
	sc := []constant.ServerConfig{
		{
			ContextPath: "/nacos",
			Port:        8848,
			IpAddr:      "10.225.254.130",
		},
	}
	// 配置 Nacos 客戶端信息
	cc := constant.ClientConfig{
		TimeoutMs:   5000,
		NamespaceId: NamespaceID,
	}
	// 創(chuàng)建 Nacos 配置客戶端
	client, err := clients.CreateConfigClient(map[string]interface{}{
		"serverConfigs": sc,
		"clientConfig":  cc,
	})
	if err != nil {
		log.Fatalf("創(chuàng)建 Nacos 配置客戶端失敗: %+v", err)
	}
	// 創(chuàng)建一個(gè)處理流量控制規(guī)則的處理器
	h := datasource.NewFlowRulesHandler(datasource.FlowRuleJsonArrayParser)
	// 創(chuàng)建 Nacos 數(shù)據(jù)源
	nds, err := nacos.NewNacosDataSource(client, Group, DataID, h)
	if err != nil {
		log.Fatalf("創(chuàng)建 Nacos 數(shù)據(jù)源失敗: %+v", err)
	}
	// 初始化 Nacos 數(shù)據(jù)源并加載規(guī)則
	err = nds.Initialize()
	if err != nil {
		log.Fatalf("初始化 Nacos 數(shù)據(jù)源失敗: %+v", err)
	}
	// 模擬請(qǐng)求
	go func() {
		for {
			// 創(chuàng)建 Sentinel 入口節(jié)點(diǎn),資源名為 "test"
			e, b := api.Entry("test", api.WithTrafficType(base.Inbound))
			if b != nil {
				// 如果請(qǐng)求被 Sentinel 阻止,打印阻止類(lèi)型
				fmt.Printf("請(qǐng)求被 Sentinel 阻止: %v\n", b.BlockType())
			} else {
				// 如果請(qǐng)求通過(guò) Sentinel,打印通過(guò)信息
				fmt.Println("請(qǐng)求通過(guò) Sentinel")
				// 退出 Sentinel 入口節(jié)點(diǎn)
				e.Exit()
			}
			// 模擬處理時(shí)間,隨機(jī)休眠 10-90 毫秒
			time.Sleep(time.Duration(rand.Uint64()%80+10) * time.Millisecond)
		}
	}()
	// 保持主 goroutine 運(yùn)行,防止程序退出
	select {}
}

2.2.5 測(cè)試動(dòng)態(tài)配置

運(yùn)行項(xiàng)目,所有請(qǐng)求都被阻斷。

修改 Nacos 中 限流規(guī)則(比如修改threshold:100)。Nacos自動(dòng)檢測(cè)到到規(guī)則的變化,Sentinel 相應(yīng)地更新了內(nèi)部規(guī)則。此時(shí),所有請(qǐng)求都通過(guò)了。

總結(jié)

通過(guò)結(jié)合 Sentinel 和本地文件或 Nacos,我們?yōu)?Go 應(yīng)用創(chuàng)建了一個(gè)靈活且高效的動(dòng)態(tài)配置管理系統(tǒng)。此方案提升了系統(tǒng)的響應(yīng)速度,減少了配置更新導(dǎo)致的服務(wù)中斷風(fēng)險(xiǎn),非常適合生產(chǎn)環(huán)境的大規(guī)模部署。希望本文的指南能幫助您更好地應(yīng)用 Sentinel,實(shí)現(xiàn)更高效的流量管理和系統(tǒng)保護(hù)。

到此這篇關(guān)于Go Sentinel 動(dòng)態(tài)數(shù)據(jù)源配置指南的文章就介紹到這了,更多相關(guān)Go Sentinel 數(shù)據(jù)源配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go條件控制語(yǔ)句詳解(if-else、switch和select)

    Go條件控制語(yǔ)句詳解(if-else、switch和select)

    條件語(yǔ)句用于檢查一個(gè)條件是否為真,并根據(jù)條件的真假來(lái)決定是否執(zhí)行相應(yīng)的代碼,下面這篇文章主要給大家介紹了關(guān)于Go條件控制語(yǔ)句(if-else、switch和select)的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • golang解析yaml文件操作

    golang解析yaml文件操作

    這篇文章主要介紹了golang解析yaml文件操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • golang 占位符和fmt常見(jiàn)輸出介紹

    golang 占位符和fmt常見(jiàn)輸出介紹

    這篇文章主要介紹了golang 占位符和fmt常見(jiàn)輸出介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • 如何解析golang中Context在HTTP服務(wù)中的角色

    如何解析golang中Context在HTTP服務(wù)中的角色

    這篇文章主要介紹了如何解析golang中Context在HTTP服務(wù)中的角色問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • graphql---go http請(qǐng)求使用詳解

    graphql---go http請(qǐng)求使用詳解

    這篇文章主要介紹了graphql---go http請(qǐng)求使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • go語(yǔ)言編程學(xué)習(xí)實(shí)現(xiàn)圖的廣度與深度優(yōu)先搜索

    go語(yǔ)言編程學(xué)習(xí)實(shí)現(xiàn)圖的廣度與深度優(yōu)先搜索

    這篇文章主要為大家介紹了go語(yǔ)言編程學(xué)習(xí)實(shí)現(xiàn)圖的廣度與深度優(yōu)先搜索示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-10-10
  • golang如何獲得一個(gè)變量的類(lèi)型

    golang如何獲得一個(gè)變量的類(lèi)型

    這篇文章主要介紹了golang獲得一個(gè)變量類(lèi)型的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05
  • go語(yǔ)言方法集為類(lèi)型添加方法示例解析

    go語(yǔ)言方法集為類(lèi)型添加方法示例解析

    這篇文章主要為大家介紹了go語(yǔ)言方法集以及為類(lèi)型添加方法示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • Go實(shí)現(xiàn)數(shù)據(jù)脫敏的方案設(shè)計(jì)

    Go實(shí)現(xiàn)數(shù)據(jù)脫敏的方案設(shè)計(jì)

    在一些常見(jiàn)的業(yè)務(wù)場(chǎng)景中可能涉及到用戶的手機(jī)號(hào),銀行卡號(hào)等敏感數(shù)據(jù),對(duì)于這部分的數(shù)據(jù)經(jīng)常需要進(jìn)行數(shù)據(jù)脫敏處理,就是將此部分?jǐn)?shù)據(jù)隱私化,防止數(shù)據(jù)泄露,所以本文給大家介紹了Go實(shí)現(xiàn)數(shù)據(jù)脫敏的方案設(shè)計(jì),需要的朋友可以參考下
    2024-05-05
  • GO項(xiàng)目配置與使用的方法步驟

    GO項(xiàng)目配置與使用的方法步驟

    本文主要介紹了GO項(xiàng)目配置與使用的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧<BR>
    2022-06-06

最新評(píng)論