Sentine-Go統合Nacosは外部動的データソースを実現する.

12880 ワード

2020年、SentinelはGo原生版Sentinel-Golangを発売し、雲原生分野で引き続き突破しています.本論文では、外部動的データソースとしてSentinel-GolangにどのようにNacosを統合するかを実際の観点から事例に結び付けて説明し、フロー制御規則をnacosに格納し、動的リアルタイム更新ルールを実現する.
2020年、SentinelはGo原生バージョンを発表しました.
Sentine-Golang、雲原生の領域で引き続き突破します.本論文では、実際的な観点から、Sentinel-Golangにどのように統合されているかを説明する.
Nacosは、外部動的データソースとして、nacosにフロー制御規則を格納し、動的リアルタイム更新ルールを実現する.
本稿は主に二つの部分に分けられる.
  • は、sentinelフロー制御規則をコード内部に定義し、フロー制限効果を実現する.
  • は、Sentinelフロー制御規則をnacos設定センターに定義し、限流効果とnacosにおける動的なルール更新を実現し、動的なフロー制御を実現する.
  • 背景に関する知識を詳しく紹介します.
  • Sentinel
  • サービスが流行するにつれて、サービスとサービスの安定性はますます重要になります.Sentinelは流量を切り込み点とし、流量制御、溶断降級、システム負荷保護などの複数の次元保護サービスの安定性からなる.
    Sentinelは以下の特徴を持っています.
  • の豊富な応用シーン:Sentinelはアリババのここ10年の双十一の大きい流量の核心のシーンを受けて、例えば秒殺(すなわち突発流量はシステム容量に耐えられる範囲を制御する)、メッセージカットピークの谷埋め、クラスタ流量制御、リアルタイムの溶断下流は応用できないなど.
  • は、リアルタイム監視機能を備えています.コントロールにアクセスアプリケーションの単一マシンの秒レベルのデータを見ることができます.さらに500台以下の規模のクラスターのまとめ動作も見られます.
  • 広範なオープンソース生態:Sentinelは、例えばSpring Cloud、Dubo、gRPCとの統合などの他のオープンソースフレーム/ライブラリとの統合モジュールを提供します.対応する依存性を導入して簡単な構成をするだけで、Sentinelに素早くアクセスできます.
  • 完璧なSPI拡張点:Sentinelは簡単で使いやすく、完璧なSPI拡張インターフェースを提供します.拡張インターフェースを実現することで、論理を高速にカスタマイズできます.例えば、カスタムルール管理、動的データソースなどが適応される.
  • 1.1 Sentinelの歴史
  • 2012年にSentinelが誕生し、主な機能は入口流量制御です.
  • 年2011-3-017年、Sentinelはアリババグループの内部で急速に発展し、基礎技術モジュールとなり、すべての核心シーンをカバーしました.Sentinelもそれによって大量の流量を蓄積してシーンと生産実践を整えます.
  • 2018年、Sentinelがオープンし、継続的に発展した.
  • 年2019年、Sentinelは多言語拡張の方向において一歩一歩探索し、C++原生バージョン、Evoyクラスタ流量制御サポートを続々と打ち出した.
  • 2020年、SentinelがGo原生版を発売し、雲原生分野でのさらなる突破を期待しています.https://github.com/alibaba/sentinel-golang
  • Nacos
  • Nacosは、クラウドアプリケーションをより容易に構築する動的サービス発見、配置管理、サービス管理のプラットフォームであり、Nacosはアリババ内部のCofigServerとDiamondから脱皮し、そのオープンソースの実現である.双十一流量ピークとアリババ経済体の超大規模容量の試練を経験したことがあります.アリババソフトロードチームはこの分野で10年間の経験を沈殿しました.安定性と機能性においても十分に保障されています.
    (Sentine-Go統合Nacos動的データソースアーキテクチャ)
    現在のSentinel内部の限流、溶断などの策略はすべて規則に基づいて実現したので、動的なデータ源の拡張の目的を提供して、規則データのロードと更新の操作をいくつかの配置センターの中間部品(例えばnacos、etcd、confulなど)を通じて動的に更新したいです.
  • Sentine-Go限流Demo
  • 統合されていないnacosの場合は、コードの内部に規則的に定義されています.外部のデータソースは使用されていません.
    3.1取り付け
    go get githb.com/alibababa/sentine-golang
    3.2デモの例
    Sentinelを使うには主に以下のステップに分けられます.
  • は、Sentinelに関する構成を行い、初期化を行う
  • .
  • 埋立点(定義リソース)
  • 構成規則
  • package main
    
    import (
        "fmt"
        "log"
        "math/rand"
        "time"
    
        sentinel "github.com/alibaba/sentinel-golang/api"
        "github.com/alibaba/sentinel-golang/core/base"
        "github.com/alibaba/sentinel-golang/core/flow"
        "github.com/alibaba/sentinel-golang/util"
    )
    
    func main() {
        _// We should initialize Sentinel first._
        err := sentinel.InitDefault()
        if err != nil {
            log.Fatalf("Unexpected error: %+v", err)
        }
    
        _, err = flow.LoadRules([]*flow.FlowRule{
            {
                Resource:        "some-test",
                MetricType:      flow.QPS,
                Count:           10,
                ControlBehavior: flow.Reject,
            },
        })
        if err != nil {
            log.Fatalf("Unexpected error: %+v", err)
            return
        }
    
        ch := make(chan struct{})
    
        for i := 0; i < 10; i++ {
            go func() {
                for {
                    e, b := sentinel.Entry("some-test", sentinel.WithTrafficType(base.Inbound))
                    if b != nil {
                        _// Blocked. We could get the block reason from the BlockError._
                        time.Sleep(time.Duration(rand.Uint64()%10) * time.Millisecond)
                    } else {
                        _// Passed, wrap the logic here._
                        fmt.Println(util.CurrentTimeMillis(), "passed")
                        time.Sleep(time.Duration(rand.Uint64()%10) * time.Millisecond)
    
                        _// Be sure the entry is exited finally._
                        e.Exit()
                    }
    
                }
            }()
        }
        
    公式expmale:https://github.com/alibaba/sentinel-golang/tree/master/example
  • Sentine-Go統合Nacos
  • Sentine-Go統合Nacosは外部動的データソース機能を実現する.
    4.1 Nacosの配備
    4.1.1バージョン選択
    Nacosのrelease notesおよびブログにおいて、各バージョンのサポート機能の紹介を見つけることができます.現在推奨されている安定バージョンは1.3.1です.
    4.1.2予備環境準備
    NacosはJava環境に依存して動作する.コードからNacosを構築して実行する場合は、この設定Maven環境が必要です.以下のバージョンの環境でインストールされていることを確認してください.
  • 64 bit OSは、Linux/Unix/Mac/Windowsをサポートしています.Linux/Unix/Macを推奨します.
  • 64 bit JDK 1.8+;ダウンロード&設定.
  • Maven 3.2.x+;ダウンロード&設定.
  • 4.1.3ソースまたはインストールパッケージをダウンロードする
    ソースとパッケージの両方でNacosを取得することができます.
    Githubからソース方式をダウンロードします.
    git clone https://github.com/alibaba/nacos.git
    cd nacos/
    mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U  
    ls -al distribution/target/
    // change the $version to your actual path
    cd distribution/target/nacos-server-$version/nacos/bin
    コンパイルをダウンロードして、パッケージを圧縮します.
    最新安定バージョンからnacos-server-$version.zipパケットをダウンロードできます.
    unzip nacos-server-$version.zip    tar -xvf nacos-server-$version.tar.gz
      cd nacos/bin
    4.1.4起動サーバ
    Linux/Unix/Mac起動コマンド(standalneはシングルマシンモードで動作し、非クラスタモードを表しています):sh startup.sh -m standaloneはubuntuシステムを使用する場合、またはスクリプトエラーメッセージを実行します.
    Windows起動命令:bash startup.sh -m standaloneまたはstartup.cmdをダブルクリックしてファイルを実行します.
    部署成功アクセスhttp://127.0.0.1:8848/nacosユーザ名/パスワード:nacos/nacos
    4.2 Sentinel限定ストリームはNacosに配置する
  • ナコスweb
  • にログインします.
  • は、構成管理において、新規構成
  • を作成する.
  • 入力dataId、group(dataId、group作成時にカスタマイズできます.ここで作成したdataId=flow、group=sentinel-go)
  • データソースのサンプルを構成内容に貼り付けます.
  • 4.2.1 Nacos外部データソースの例
    この例は流量制御のデモ構成です.流量マージ数が100以上の場合は直接拒否します.
    構成内容説明はhttps://github.com/alibaba/sentinel-golang/wiki/流量制御を参照することができる.
    [
        {
            "resource": "some-test",
            "metricType": 1,
            "count": 100.0,
            "controlBehavior":0
        }
    ]
    作成が完了したら、nacos設定リストに対応するストリーム制限設定が表示されます.
    4.3 Nacosデータソース統合
    4.3.1作成項目
  • バージョン
  • sentine-golangバージョンは0.0.6%を使用し、nacos-sdk-goは1.0.0を使用して
  • を使用します.
  • go.mod
  • module sentinel-go-nacos-example
    
    go 1.13
    
    require (
        github.com/alibaba/sentinel-golang v0.6.0
        github.com/nacos-group/nacos-sdk-go v1.0.0
    ) 
  • main.go
  • package main
    
    import (
        "fmt"
        "math/rand"
        "sync/atomic"
        "time"
    
        sentinel "github.com/alibaba/sentinel-golang/api"
        "github.com/alibaba/sentinel-golang/core/base"
        "github.com/alibaba/sentinel-golang/ext/datasource/nacos"
        "github.com/alibaba/sentinel-golang/util"
        "github.com/nacos-group/nacos-sdk-go/clients"
    
        "github.com/alibaba/sentinel-golang/ext/datasource"
        "github.com/nacos-group/nacos-sdk-go/common/constant"
    )
    
    type Counter struct {
        pass  *int64
        block *int64
        total *int64
    }
    
    func main() {
        _//     ,           ,   nacos     。_
        counter := Counter{pass: new(int64), block: new(int64), total: new(int64)}
    
        _//nacos server  _
        sc := []constant.ServerConfig{
            {
                ContextPath: "/nacos",
                Port:        8848,
                IpAddr:      "127.0.0.1",
            },
        }
        _//nacos client       ,       https://github.com/nacos-group/nacos-sdk-go_
        cc := constant.ClientConfig{
            TimeoutMs: 5000,
        }
        _//  nacos config client(       )_
        client, err := clients.CreateConfigClient(map[string]interface{}{
            "serverConfigs": sc,
            "clientConfig":  cc,
        })
        if err != nil {
            fmt.Printf("Fail to create client, err: %+v", err)
            return
        }
        _//      Handler_
        h := datasource.NewFlowRulesHandler(datasource.FlowRuleJsonArrayParser)
        _//  NacosDataSource   _
        _//sentinel-go    nacos        group_
        _//flow    nacos        dataId_
        nds, err := nacos.NewNacosDataSource(client, "sentinel-go", "flow", h)
        if err != nil {
            fmt.Printf("Fail to create nacos data source client, err: %+v", err)
            return
        }
        _//nacos      _
        err = nds.Initialize()
        if err != nil {
            fmt.Printf("Fail to initialize nacos data source client, err: %+v", err)
            return
        }
        _//    _
        go timerTask(&counter)
    
        _//    _
        ch := make(chan struct{})
        for i := 0; i < 10; i++ {
            go func() {
                for {
                    atomic.AddInt64(counter.total, 1)
                    _//some-test    nacos         resource_
                    e, b := sentinel.Entry("some-test", sentinel.WithTrafficType(base.Inbound))
                    if b != nil {
                        atomic.AddInt64(counter.block, 1)
                        _// Blocked. We could get the block reason from the BlockError._
                        time.Sleep(time.Duration(rand.Uint64()%10) * time.Millisecond)
                    } else {
                        atomic.AddInt64(counter.pass, 1)
                        time.Sleep(time.Duration(rand.Uint64()%10) * time.Millisecond)
    
                        _// Be sure the entry is exited finally._
                        e.Exit()
                    }
    
                }
            }()
        }
        
    4.3.2運転結果
    4.3.3ダイナミック更新限流配置
    プロジェクトの起動中に、nacosでフロー制御設定パラメータを変更します.countを100->400から
    再loadRuleのログが印刷されているのが見えます.フロー制御のダイナミックは100->400です.
    締め括りをつける
    sentinel-goでは外部動的データソースとしてnacosを使用していますが、RuleとRuleをロードした部分をnacosデータソースから読み込む必要があります.
    本論文では流量制御の集積、溶断、warmupだけを紹介します.ホットスポットパラメータの集積も同じです.必要に応じて配置内容を修正すればいいです.
    設定内容参照アドレス:https://github.com/alibaba/sentinel-golang/wiki
    キーコード:
     h := datasource.NewFlowRulesHandler(datasource.FlowRulesJsonConverter)
        nds, err := nacos.NewNacosDataSource(client, "sentinel-go", "flow", h)
        if err != nil {
            fmt.Printf("Fail to create nacos data source client, err: %+v", err)
            return
        }
        err = nds.Initialize()
        if err != nil {
            fmt.Printf("Fail to initialize nacos data source client, err: %+v", err)
            return
        }
    関連リンク
  • Demoアドレス:https://github.com/alibaba/sentinel-golang/tree/master/example/nacos
  • Sentine-golang:https://github.com/alibaba/sentinel-golang
  • Sentinel釘付けコミュニティ交流群:3015716、2339422(Sentinel golang生態交流群)
  • Nacos:https://nacos.io/zh-cn/index.html
  • Nacos釘付けコミュニティ交流群:30438813、23191211(Nacos golang生態交流群)
  • Nacos-SDK-Goプロジェクトアドレス:https://github.com/nacos-group/nacos-sdk-go
  • 著者プロフィール
    現在は主にNacos、Sentinel-Golang Conttributor、OpenJawマイクロサービスチームに勤めています.現在は主にNacos、Sentinel-Golangコミュニティ関連プロジェクトの開発作業、およびNacosのGolangマイクロサービス生態におけるプロモーション統合業務を担当しています.
    原文のリンク本文は阿里雲のオリジナルコンテンツです.許可なしに転載できません.