ホームページ >バックエンド開発 >Golang >go-zero を使用して分散構成センターを実装する

go-zero を使用して分散構成センターを実装する

王林
王林オリジナル
2023-06-22 08:57:061705ブラウズ

インターネットの発展に伴い、エンタープライズ アプリケーションの規模は徐々に拡大し、さまざまなビジネス シナリオに必要な構成はますます複雑になってきています。構成の管理と保守は、多くの場合、退屈でエラーが発生しやすいプロセスになっています。これらの問題を解決するために、分散コンフィギュレーション センターが登場しました。

分散構成センターは、すべてのアプリケーションの構成情報を一元管理し、管理者が構成情報を変更および公開するのを容易にする使いやすい操作インターフェイスを提供するモジュール設計です。構成情報を一元管理することで、構成の問題によるシステム障害を効果的に軽減できます。

この記事では、go-zero を使用してシンプルな分散構成センターを実装する方法を紹介します。

ゴーゼロとは何ですか?

Go-Zero は Go 言語のマイクロサービス フレームワークです。高性能、拡張性が高く、使いやすいという特徴があります。Go 言語開発者が高性能、スケーラブルで信頼性の高いマイクロサービスを迅速に構築するための方法です。アプリケーション: 推奨されるフレームワークの 1 つ。

Go-Zero は、サービス登録、ヘルス チェック、電流制限サーキット ブレーカー、長時間接続管理、サービス ガバナンスなどのマイクロサービス関連の機能を提供することに加えて、Rpc 生成ツールなど、開発を支援する多くのツールも提供します。 、http API 生成ツール、構成センター、ログ ライブラリ、キャッシュ ライブラリなど。

分散構成センターの実装原則

分散構成センターの実装では、次の側面を考慮する必要があります。

  1. データベース ストレージ: リレーショナル データベースが必要です。 (MySQL、PostgreSQL など) を使用して構成情報を保存し、構成情報の永続的なストレージを確保します。
  2. バックエンド管理: 管理者が構成情報を追加、削除、変更、確認、公開できるバックエンド管理システムを提供する必要があります。
  3. 構成ファイルのロード: アプリケーションが最新の構成情報を確実に取得できるように、アプリケーション呼び出しに対して構成ファイルをロードするためのインターフェイスを提供する必要があります。
  4. スケジュールされた更新: データをタイムリーに更新するために、構成情報を定期的に更新する機能を実装する必要があります。
  5. 分散一貫性: 複数のノードを展開する場合、ノードの非同期によって引き起こされるエラーを回避するために、構成情報の一貫性を考慮する必要があります。

go-zero を使用して分散構成センターを実装する

この記事では、go-zero フレームワークを使用して分散構成センターを実装するプロセスを簡単に紹介します。次のように:

1. go-zero をインストールします

#go-zero を使用するには、最初に関連する依存関係をインストールする必要があります:

go get -u github.com/tal-tech/go-zero

2. データベースを作成します

最初にデータベースを作成し、次のようにテーブルとテーブル構造を作成します:

CREATE TABLE `config` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
    `app_name` varchar(255) DEFAULT '',
    `key_name` varchar(255) DEFAULT '',
    `value` varchar(1024) DEFAULT '',
    `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

3. バックエンド管理システムを作成します

バックエンド管理システムは主に追加、削除、構成情報の変更、確認、公開操作。 go-zero フレームワークでは、goctl ツールを使用して管理システム関連のコードを迅速に生成できます。

goctl api new -api config -dir config/api

生成されたコードは config/api ディレクトリにあり、実際のニーズに応じて調整する必要があります。

4. 設定ファイルのロードを実装する

goctl ツールを使用して config という名前の rpc サービスを生成し、そのインターフェイスを呼び出して設定ファイルをロードします。

サービス インターフェイスは次のように定義されています:

type Config interface {
    GetConfig(ctx context.Context, req *model.GetConfigReq) (*model.GetConfigResp, error)
    WatchConfig(ctx context.Context, req *model.GetConfigReq) (*model.GetConfigResp, error)
}

5. スケジュールされた更新の実装

スケジュールされた更新機能を実装するには、外出先で etcd 関連ツールを使用できます。 -ゼロフレームワーク。

最初に etcd をインストールする必要があります:

go get -u go.etcd.io/etcd/client/v3

次に、設定ファイルに etcd のアドレスとポートを設定します:

[etcd]
  null=127.0.0.1:2379

最後に、スケジュールされた更新ロジックをコードに実装します。 :

func RefreshConfig() {
    etcdCli, err := clientv3.New(clientv3.Config{
        Endpoints:   *conf.Etcd,
        DialTimeout: time.Second * 3,
    })
    if err != nil {
        logx.Errorf("err: %v", err)
        return
    }
    defer etcdCli.Close()

    for {
        ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
        resp, err := etcdCli.Get(ctx, *conf.EtcdKey)
        if err != nil {
            logx.Errorf("err: %v", err)
            cancel()
            continue
        }
        if len(resp.Kvs) == 1 {
            var configMap map[string]string
            err = json.Unmarshal(resp.Kvs[0].Value, &configMap)
            if err != nil {
                logx.Errorf("err: %v", err)
            } else {
                cacheConfigMap.Lock()
                cacheConfigMap.data = configMap
                cacheConfigMap.Unlock()
                logx.Info("Refresh config success")
            }
        }
        cancel()
        time.Sleep(time.Second * 10)
    }
}

6. 分散一貫性の実現

分散一貫性を実現するには、go-zero フレームワークで etcd 関連ツールを使用する必要があります。

まず、etcd をインストールする必要があります:

go get -u go.etcd.io/etcd/client/v3

次に、etcd 関連の分散ロック ロジックをコードに実装します:

func Lock() error {
    etcdCli, err := clientv3.New(clientv3.Config{
        Endpoints:   *conf.Etcd,
        DialTimeout: time.Second * 3,
    })
    if err != nil {
        logx.Errorf("err: %v", err)
        return err
    }
    defer etcdCli.Close()

    var s *concurrency.Session
    var m *concurrency.Mutex
    for {
        opTimeoutCtx, cancel := context.WithTimeout(context.Background(), time.Second)
        s, err = concurrency.NewSession(etcdCli,
            concurrency.WithContext(opTimeoutCtx),
            concurrency.WithTTL(int32(*conf.LockTtl)))
        if err != nil {
            logx.Errorf("create etcd session error: %v", err)
            cancel()
            time.Sleep(time.Second)
            continue
        }

        opTimeoutCtx, cancel = context.WithTimeout(context.Background(), time.Second)
        m = concurrency.NewMutex(s, *conf.EtcdKey)
        err = m.Lock(opTimeoutCtx)
        if err != nil {
            logx.Errorf("etcd lock failed: %v", err)
            cancel()
            time.Sleep(time.Second)
            continue
        }
        break
    }

    cacheConfigMap.Lock()
    defer cacheConfigMap.Unlock()

    defer func() {
        if m != nil {
            err = m.Unlock(context.Background())
            if err != nil {
                logx.Errorf("etcd unlock failed: %v", err)
            }
        }
    }()
    defer func() {
        if s != nil {
            s.Close()
        }
    }()
    return nil
}

結論

この記事では、その方法を紹介します。 go-zero フレームワークは、シンプルな分散構成センターを実装します。 go-zero の高いパフォーマンス、容易な拡張性、使いやすさを利用することで、可用性の高い分散構成センターを短期間で迅速に構築でき、構成の問題によるシステム障害の削減に効果的に役立ちます。

以上がgo-zero を使用して分散構成センターを実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。