인터넷이 발전함에 따라 엔터프라이즈 애플리케이션의 규모가 점차 증가하고 있으며 다양한 비즈니스 시나리오에 필요한 구성이 점점 더 복잡해지고 있습니다. 구성 관리 및 유지 관리는 지루하고 오류가 발생하기 쉬운 프로세스입니다. 이러한 문제를 해결하기 위해 분산형 구성 센터가 탄생했습니다.
분산 구성 센터는 모든 애플리케이션의 구성 정보를 중앙 집중화하고 관리자가 구성 정보를 쉽게 수정하고 게시할 수 있도록 친숙한 운영 인터페이스를 제공하는 모듈식 설계입니다. 구성 정보를 중앙에서 관리함으로써 구성 문제로 인한 시스템 오류를 효과적으로 줄일 수 있습니다.
이 글에서는 go-zero를 사용하여 간단한 분산 구성 센터를 구현하는 방법을 소개합니다.
Go-Zero는 고성능, 손쉬운 확장성 및 사용 용이성을 갖춘 Go 언어 마이크로서비스 프레임워크입니다. 이는 Go 언어 개발자가 고성능, 확장 가능하고 안정적인 마이크로서비스 애플리케이션을 신속하게 구축하기 위해 선호하는 프레임워크 중 하나입니다. .
Go-Zero는 서비스 등록, 상태 확인, 전류 제한 회로 차단기, 장거리 연결 관리 및 서비스 거버넌스 등 마이크로서비스 관련 기능을 제공하는 것 외에도 Rpc 생성 도구, http API 생성 등 개발을 지원하는 다양한 도구도 제공합니다. 도구, 구성 센터, 로그 라이브러리, 캐시 라이브러리 등
분산 구성 센터 구현에서는 다음 측면을 고려해야 합니다.
이 글에서는 go-zero 프레임워크를 사용하여 분산 구성 센터를 구현하는 과정을 간략하게 소개합니다.
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;
백엔드 관리 시스템은 주로 구성 정보를 추가, 삭제, 수정 및 확인하고 작업을 게시하는 데 사용됩니다. Go-Zero 프레임워크에서는 goctl 도구를 사용하여 관리 시스템 관련 코드를 빠르게 생성할 수 있습니다.
goctl api new -api config -dir config/api
생성된 코드는 config/api 디렉터리에 있으며 실제 필요에 따라 조정해야 합니다.
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) }
예약 새로 고침 기능을 구현하려면 go-zero 프레임워크에서 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) } }
In 분산된 일관성을 달성하려면 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!