最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前言

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

一、準備工作

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

示例如下:

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

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

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

2.1. 本地文件

2.1.1準備規(guī)則文件

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

[
  {
    "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() {
	// 定義流控規(guī)則的文件路徑
	filePath := "./file/rules.json"
	// 創(chuàng)建一個處理流量控制規(guī)則的處理器
	h := datasource.NewFlowRulesHandler(datasource.FlowRuleJsonArrayParser)
	// 創(chuàng)建一個基于文件的數(shù)據(jù)源,使用指定的文件路徑和處理器
	ds := file.NewFileDataSource(filePath, h)
	// 初始化數(shù)據(jù)源,如果失敗則記錄錯誤并退出程序
	err := ds.Initialize()
	if err != nil {
		log.Fatalf("創(chuàng)建文件數(shù)據(jù)源失敗: %+v", err)
	}
	// 啟動一個 goroutine 模擬請求
	go func() {
		for {
			// 創(chuàng)建 Sentinel 入口節(jié)點,資源名為 "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 入口節(jié)點
				e.Exit()
			}
			// 模擬處理時間,隨機睡眠 10-90 毫秒
			time.Sleep(time.Duration(rand.Uint64()%80+10) * time.Millisecond)
		}
	}()
	// 主 goroutine 無限阻塞,防止程序退出
	select {}
}

2.1.3 測試動態(tài)配置

運行項目,所有請求都被阻斷。


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

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 中存儲規(guī)則

通過 http://localhost:8848/nacos 訪問 Nacos 控制臺(賬號:nacos,密碼:nacos),配置 Namespace、Group、Data ID,之后配置限流規(guī)則。

[
    {
        "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 相關(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)建一個處理流量控制規(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)
	}
	// 模擬請求
	go func() {
		for {
			// 創(chuàng)建 Sentinel 入口節(jié)點,資源名為 "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 入口節(jié)點
				e.Exit()
			}
			// 模擬處理時間,隨機休眠 10-90 毫秒
			time.Sleep(time.Duration(rand.Uint64()%80+10) * time.Millisecond)
		}
	}()
	// 保持主 goroutine 運行,防止程序退出
	select {}
}

2.2.5 測試動態(tài)配置

運行項目,所有請求都被阻斷。

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

總結(jié)

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

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

相關(guān)文章

  • 淺談GO中的Channel以及死鎖的造成

    淺談GO中的Channel以及死鎖的造成

    本文主要介紹了淺談GO中的Channel以及死鎖的造成,文中根據(jù)實例編碼詳細介紹的十分詳盡,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Go中各種newreader和newbuffer的使用總結(jié)

    Go中各種newreader和newbuffer的使用總結(jié)

    這篇文章主要為大家詳細介紹了Go語言中各種newreader和newbuffer的使用的相關(guān)資料,文中的示例代碼講解詳細,具有一定的參考價值,感興趣的小伙伴可以了解下
    2023-11-11
  • 基于Go和PHP語言實現(xiàn)爬樓梯算法的思路詳解

    基于Go和PHP語言實現(xiàn)爬樓梯算法的思路詳解

    這篇文章主要介紹了Go和PHP 實現(xiàn)爬樓梯算法,本文通過動態(tài)規(guī)劃和斐波那契數(shù)列兩種解決思路給大家講解的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • Golang的CSP模型簡介(最新推薦)

    Golang的CSP模型簡介(最新推薦)

    Golang采用了CSP(Communicating?Sequential?Processes,通信順序進程)并發(fā)模型,通過goroutine和channel提供了一種更為簡潔和安全的并發(fā)編程方式,本文將詳細介紹Golang的CSP并發(fā)模型及其使用方法,感興趣的朋友一起看看吧
    2025-01-01
  • Golang?手寫一個簡單的并發(fā)任務(wù)?manager

    Golang?手寫一個簡單的并發(fā)任務(wù)?manager

    這篇文章主要介紹了Golang?手寫一個簡單的并發(fā)任務(wù)?manager,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • Go語言中工作池的原理與實現(xiàn)

    Go語言中工作池的原理與實現(xiàn)

    工作池是一種并發(fā)編程模式,它使用一組固定數(shù)量的工作線程來執(zhí)行任務(wù)隊列中的工作單元,本文將介紹工作池的工作原理,并通過代碼示例演示其在實際應(yīng)用中的用途,有需要的可以參考下
    2023-10-10
  • Go微服務(wù)網(wǎng)關(guān)的實現(xiàn)

    Go微服務(wù)網(wǎng)關(guān)的實現(xiàn)

    本文主要介紹了Go微服務(wù)網(wǎng)關(guān)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • Golang分布式鎖詳細介紹

    Golang分布式鎖詳細介紹

    分布式鎖是控制分布式系統(tǒng)之間同步訪問共享資源的一種方式。如果不同的系統(tǒng)或是同一個系統(tǒng)的不同主機之間共享了一個或一組資源,那么訪問這些資源時,需要通過一些互斥手段來防止彼此之間的干擾以保證一致性,在這種情況下,就需要使用分布式鎖了
    2022-10-10
  • golang控制結(jié)構(gòu)select機制及使用示例詳解

    golang控制結(jié)構(gòu)select機制及使用示例詳解

    這篇文章主要介紹了golang控制結(jié)構(gòu)select機制及使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • golang讀取文件的常用方法總結(jié)

    golang讀取文件的常用方法總結(jié)

    今天小編就為大家分享一篇關(guān)于golang讀取文件的常用方法總結(jié),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04

最新評論

漳平市| 登封市| 固镇县| 博客| 通山县| 万盛区| 鹿泉市| 肥东县| 乃东县| 正安县| 京山县| 邵阳市| 江源县| 若羌县| 遂平县| 清流县| 鸡西市| 天门市| 白山市| 盐边县| 诏安县| 东宁县| 云安县| 辛集市| 萨嘎县| 涟水县| 浪卡子县| 易门县| 偃师市| 尼勒克县| 崇阳县| 保靖县| 望城县| 德庆县| 廉江市| 龙海市| 阿拉善右旗| 万州区| 那坡县| 汝城县| 黄山市|