Dengan pembangunan Internet, skala aplikasi perusahaan semakin meningkat secara beransur-ansur, dan konfigurasi yang diperlukan untuk senario perniagaan yang berbeza menjadi semakin kompleks Pengurusan dan penyelenggaraan konfigurasi selalunya merupakan proses yang membosankan dan terdedah kepada ralat. Untuk menyelesaikan masalah ini, pusat konfigurasi yang diedarkan telah wujud.
Pusat konfigurasi yang diedarkan ialah reka bentuk modular yang memusatkan maklumat konfigurasi semua aplikasi dan menyediakan antara muka operasi yang mesra untuk memudahkan pengurus mengubah suai dan menerbitkan maklumat konfigurasi. Dengan menguruskan maklumat konfigurasi secara berpusat, kegagalan sistem yang disebabkan oleh isu konfigurasi dapat dikurangkan dengan berkesan.
Artikel ini akan memperkenalkan cara menggunakan go-zero untuk melaksanakan pusat konfigurasi teragih mudah.
Go-Zero ialah rangka kerja mikro bahasa Go Ia mempunyai ciri-ciri prestasi tinggi, kebolehskalaan mudah dan kemudahan penggunaan Ia adalah cara untuk pembangun bahasa Go untuk membina perkhidmatan mikro berprestasi tinggi, berskala dan boleh dipercayai aplikasi. Salah satu rangka kerja pilihan.
Selain menyediakan fungsi berkaitan perkhidmatan mikro seperti pendaftaran perkhidmatan, pemeriksaan kesihatan, pengehadan semasa dan pemutus litar, pengurusan sambungan panjang dan tadbir urus perkhidmatan, Go-Zero juga menyediakan banyak alat untuk membantu pembangunan, seperti penjanaan Rpc alatan, alatan penjanaan API http, pusat konfigurasi, perpustakaan log, perpustakaan cache, dsb.
Pelaksanaan pusat konfigurasi teragih perlu mengambil kira aspek berikut:
Artikel ini akan memperkenalkan secara ringkas proses menggunakan rangka kerja go-zero untuk melaksanakan pusat konfigurasi teragih seperti berikut:
Untuk menggunakan go-zero, anda perlu memasang kebergantungan yang berkaitan terlebih dahulu:
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 }
Atas ialah kandungan terperinci Menggunakan go-zero untuk melaksanakan pusat konfigurasi teragih. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!