Dengan pembangunan berterusan aplikasi dan sistem Internet, pengurusan konfigurasi semakin menjadi tugas yang penting. Pada masa lalu, kami sering menggunakan konfigurasi manual atau penyelesaian fail konfigurasi mudah, tetapi kaedah ini tidak lagi dapat memenuhi keperluan perniagaan yang berubah dengan pantas. Oleh itu, dalam seni bina perkhidmatan mikro moden, pusat konfigurasi dinamik telah menjadi satu keperluan.
Dalam artikel ini, kami akan memperkenalkan amalan pusat konfigurasi dinamik berdasarkan rangka kerja go-zero.
go-zero ialah rangka kerja yang ringkas, cekap dan mudah digunakan untuk membina perkhidmatan mikro yang boleh skala dan berprestasi tinggi. Ia mempunyai rangkaian alat yang kaya dan pemalam untuk menyokong pelbagai aplikasi Internet moden.
go-zero bukan sahaja menyokong pembangunan model perniagaan, tetapi juga menyokong satu siri penyelesaian model bukan perniagaan, seperti sistem caching, baris gilir mesej, penemuan perkhidmatan, log, migrasi pangkalan data, dsb. Ini boleh memberikan lebih banyak sokongan kepada pembangun dan membantu mereka dalam membina aplikasi berkualiti tinggi.
Dalam artikel ini, kami akan menumpukan pada amalan pusat konfigurasi dinamik rangka kerja go-zero. Pusat Konfigurasi Dinamik ialah perkhidmatan yang menguruskan maklumat konfigurasi aplikasi. Melalui pusat konfigurasi dinamik, kami boleh mengurus versi aplikasi yang berbeza dengan mudah sambil menyokong perubahan pantas dan rollback konfigurasi.
Pertama, mari kita pertimbangkan struktur data yang digunakan untuk menyelesaikan masalah konfigurasi. Kita boleh mentakrifkan struktur Config untuk menyimpan item konfigurasi.
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"` }
Dalam aplikasi, kami boleh menambah lebih banyak item konfigurasi mengikut keperluan kami.
Dalam rangka kerja go-zero, kita boleh menggunakan etcd atau zookeeper sebagai bahagian belakang storan untuk pengurusan konfigurasi. Kami menganggap bahawa etcd digunakan sebagai backend storan dan alatan pengurusan konfigurasi yang disediakan oleh rangka kerja go-zero digunakan untuk mengendalikan etcd.
Pertama, kita perlu mentakrifkan struktur ConfigManager untuk menyimpan klien etcd.
type ConfigManager struct { cli *clientv3.Client }
Dalam fungsi permulaan, kita boleh mencipta klien etcd dan menyimpannya ke 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 }
Seterusnya, kita boleh mentakrifkan fungsi SaveConfig untuk menyimpan item konfigurasi ke etcd.
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 }
Akhir sekali, kita boleh mentakrifkan fungsi GetConfig untuk mendapatkan item konfigurasi dengan nama yang ditentukan daripada etcd dan menghuraikannya ke dalam struktur 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 }
Dengan alatan ini, kami boleh mengurus item konfigurasi dengan mudah. Sekarang, mari kita pertimbangkan cara menggunakan item konfigurasi ini dalam aplikasi kami.
Dalam rangka kerja go-zero, kami boleh menggunakan fail konfigurasi untuk mengurus maklumat konfigurasi aplikasi. Fail konfigurasi membolehkan kami memuatkan item konfigurasi apabila aplikasi dimulakan. Walau bagaimanapun, terdapat situasi di mana kita memerlukan penyelesaian yang lebih fleksibel dan masa nyata.
Rangka kerja go-zero menyediakan pemalam ConfigCenter untuk memuatkan item konfigurasi aplikasi dari pusat konfigurasi jauh. Kami hanya perlu mengkonfigurasi pemalam ConfigCenter untuk mencapai konfigurasi dinamik.
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) } }
Dalam kod di atas, kami menggunakan fungsi config.LoadFromEtcd untuk memuatkan item konfigurasi dengan nama yang ditentukan daripada etcd. Jika anda perlu mengemas kini item konfigurasi, anda boleh mengubah suainya secara manual dalam etcd. Apabila kami memulakan semula aplikasi, ia akan memuatkan item konfigurasi terkini.
Apabila melaksanakan pusat konfigurasi dinamik, keselamatan adalah perkara yang sangat penting. Kerana item konfigurasi selalunya mengandungi maklumat sensitif, seperti bukti kelayakan pangkalan data, kunci API, dsb. Jadi dalam amalan kita, kita harus memberi perhatian kepada perkara-perkara berikut:
Pusat konfigurasi dinamik merupakan bahagian penting dalam aplikasi moden. Ia memberikan kami cara yang fleksibel, pantas dan selamat untuk mengurus maklumat konfigurasi aplikasi. Dalam artikel ini, kami memperkenalkan amalan pusat konfigurasi dinamik berdasarkan rangka kerja go-zero. Melalui amalan ini, kami boleh mengurus item konfigurasi dengan mudah dan melaksanakan konfigurasi dinamik serta menggunakannya dalam aplikasi.
Atas ialah kandungan terperinci Amalan pusat konfigurasi dinamik berdasarkan go-zero. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!