インターネットの発展に伴い、エンタープライズ アプリケーションの規模は徐々に拡大し、さまざまなビジネス シナリオに必要な構成はますます複雑になってきています。構成の管理と保守は、多くの場合、退屈でエラーが発生しやすいプロセスになっています。これらの問題を解決するために、分散コンフィギュレーション センターが登場しました。
分散構成センターは、すべてのアプリケーションの構成情報を一元管理し、管理者が構成情報を変更および公開するのを容易にする使いやすい操作インターフェイスを提供するモジュール設計です。構成情報を一元管理することで、構成の問題によるシステム障害を効果的に軽減できます。
この記事では、go-zero を使用してシンプルな分散構成センターを実装する方法を紹介します。
Go-Zero は Go 言語のマイクロサービス フレームワークです。高性能、拡張性が高く、使いやすいという特徴があります。Go 言語開発者が高性能、スケーラブルで信頼性の高いマイクロサービスを迅速に構築するための方法です。アプリケーション: 推奨されるフレームワークの 1 つ。
Go-Zero は、サービス登録、ヘルス チェック、電流制限サーキット ブレーカー、長時間接続管理、サービス ガバナンスなどのマイクロサービス関連の機能を提供することに加えて、Rpc 生成ツールなど、開発を支援する多くのツールも提供します。 、http API 生成ツール、構成センター、ログ ライブラリ、キャッシュ ライブラリなど。
分散構成センターの実装では、次の側面を考慮する必要があります。
この記事では、go-zero フレームワークを使用して分散構成センターを実装するプロセスを簡単に紹介します。次のように:
go get -u github.com/tal-tech/go-zero2. データベースを作成します最初にデータベースを作成し、次のようにテーブルとテーブル構造を作成します:
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 サイトの他の関連記事を参照してください。