インターネット アプリケーションとシステムの継続的な開発に伴い、構成管理はますます重要なタスクになっています。以前は、手動構成または単純な構成ファイル ソリューションをよく使用していましたが、これらの方法では、急速に変化するビジネス ニーズに対応できなくなりました。したがって、最新のマイクロサービス アーキテクチャでは、動的構成センターが必要不可欠になっています。
この記事では、go-zeroフレームワークに基づくダイナミックコンフィグレーションセンターの実践を紹介します。
go-zero は、スケーラブルで高性能なマイクロサービスを構築するための、シンプルで効率的で使いやすいフレームワークです。さまざまな最新のインターネット アプリケーションをサポートする豊富なツール チェーンとプラグインが備わっています。
go-zero は、ビジネス モデルの開発をサポートするだけでなく、キャッシュ システム、メッセージ キュー、サービス ディスカバリ、ログ、データベース移行などの一連の非ビジネス モデル ソリューションもサポートします。これらは開発者により多くのサポートを提供し、高品質のアプリケーションの構築を支援します。
この記事では、go-zero フレームワークの動的構成センターの実践に焦点を当てます。 Dynamic Configuration Center は、アプリケーションの構成情報を管理するサービスです。動的構成センターを通じて、構成の迅速な変更とロールバックをサポートしながら、アプリケーションのさまざまなバージョンを簡単に管理できます。
まず、構成の問題を解決するために使用されるデータ構造について考えてみましょう。構成アイテムを保存するために Config 構造を定義できます。
type Config struct { Name string `json:"name"` Version string `json:"version"` Endpoint string `json:"endpoint"` AccessKey string `json:"access_key"` SecretKey string `json:"secret_key"` }
アプリケーションでは、必要に応じてさらに構成項目を追加できます。
go-zero フレームワークでは、構成管理のストレージ バックエンドとして etcd または Zookeeper を使用できます。 etcd がストレージ バックエンドとして使用され、go-zero フレームワークによって提供される構成管理ツールが etcd の操作に使用されることを想定しています。
まず、etcd クライアントを保存するために ConfigManager 構造を定義する必要があります。
type ConfigManager struct { cli *clientv3.Client }
初期化関数では、etcd クライアントを作成し、ConfigManager に保存できます。
func NewConfigManager(endpoints []string) (*ConfigManager, error) { cli, err := clientv3.New(clientv3.Config{ Endpoints: endpoints, }) if err != nil { return nil, err } return &ConfigManager{ cli: cli, }, nil }
次に、構成項目を etcd に保存するための SaveConfig 関数を定義できます。
func (m *ConfigManager) SaveConfig(cfg Config) error { ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) defer cancel() data, err := json.Marshal(cfg) if err != nil { return err } _, err = m.cli.Put(ctx, "/config/"+cfg.Name, string(data)) if err != nil { return err } return nil }
最後に、GetConfig 関数を定義して、指定された名前の構成アイテムを etcd から取得し、それを Config 構造に解析します。
func (m *ConfigManager) GetConfig(name string) (*Config, error) { ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) defer cancel() resp, err := m.cli.Get(ctx, "/config/"+name) if err != nil { return nil, err } if len(resp.Kvs) == 0 { return nil, fmt.Errorf("config not found") } var cfg Config err = json.Unmarshal(resp.Kvs[0].Value, &cfg) if err != nil { return nil, err } return &cfg, nil }
これらのツールを使用すると、構成アイテムを簡単に管理できます。ここで、アプリケーションでこれらの構成アイテムを使用する方法を考えてみましょう。
go-zero フレームワークでは、構成ファイルを使用してアプリケーションの構成情報を管理できます。設定ファイルを使用すると、アプリケーションの起動時に設定項目を読み込むことができます。ただし、より柔軟でリアルタイムのソリューションが必要な状況もあります。
go-zero フレームワークは、リモート構成センターからアプリケーション構成項目をロードするための ConfigCenter プラグインを提供します。動的構成を実現するには、ConfigCenter プラグインを構成するだけです。
func main() { c := &cli.App{ Commands: []*cli.Command{ { Name: "serve", Usage: "start server", Flags: []cli.Flag{ &cli.StringFlag{ Name: "config", Usage: "config file path", }, }, Action: func(ctx *cli.Context) error { var cfg Config err := config.LoadFromEtcd(cfg.Name, cfg) if err != nil { log.Fatal(err) } log.Println(cfg) // start server return nil }, }, }, } err := c.Run(os.Args) if err != nil { log.Fatal(err) } }
上記のコードでは、config.LoadFromEtcd 関数を使用して、指定された名前の構成アイテムを etcd からロードします。構成項目を更新する必要がある場合は、etcd で手動で変更できます。アプリケーションを再起動すると、最新の構成アイテムがロードされます。
動的構成センターを実装する場合、セキュリティは非常に重要なポイントです。構成アイテムにはデータベース認証情報や API キーなどの機密情報が含まれることが多いためです。したがって、実践では次の点に注意する必要があります。
以上がgo-zeroをベースとしたダイナミックコンフィグレーションセンターの実践の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。