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