clients/etcd_client/etcd_client.go (111 lines of code) (raw):

/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package etcd_client import ( "context" "encoding/json" "github.com/apache/shenyu-client-golang/common/constants" "github.com/apache/shenyu-client-golang/model" "github.com/sirupsen/logrus" clientv3 "go.etcd.io/etcd/client/v3" "time" ) var ( logger = logrus.New() ) /** * ShenYuEtcdClient **/ type ShenYuEtcdClient struct { Ecp *EtcdClientParam //EtcdClientParam EtcdClient *clientv3.Client //EtcdClient // GlobalLease clientv3.LeaseID //global lease } /** * EtcdClientParam **/ type EtcdClientParam struct { EtcdServers []string //the customer etcd server address UserName string //the customer etcd server userName Password string //the customer etcd server pwd TTL int64 //the customer etcd key rent } /** * init NewClient **/ func (sec *ShenYuEtcdClient) NewClient(clientParam interface{}) (client interface{}, createResult bool, err error) { ecp, ok := clientParam.(*EtcdClientParam) if !ok { logger.Fatalf("The clientParam must not nil!") } if len(ecp.EtcdServers) > 0 { //use customer param to create client client, err := clientv3.New(clientv3.Config{ Endpoints: ecp.EtcdServers, DialTimeout: constants.DEFAULT_ETCD_TIMEOUT * time.Second, Username: ecp.UserName, Password: ecp.Password, }) if err == nil { logger.Infof("Create customer etcd client success!") return &ShenYuEtcdClient{ Ecp: &EtcdClientParam{ EtcdServers: ecp.EtcdServers, UserName: ecp.UserName, Password: ecp.Password, TTL: ecp.TTL, }, EtcdClient: client, }, true, nil } logger.Fatalf("init etcd client error %v:", err) } return } /** DeregisterServiceInstance */ func (sec *ShenYuEtcdClient) DeregisterServiceInstance(metaData interface{}) (deRegisterResult bool, err error) { mdr, ok := metaData.(*model.MetaDataRegister) if !ok { logger.Fatalf("get etcd client metaData error %v:", err) } key := mdr.AppName ctx, cancel := context.WithTimeout(context.Background(), constants.DEFAULT_ETCD_TIMEOUT*time.Second) defer cancel() _, err = sec.EtcdClient.Delete(ctx, key) if err != nil { return false, err } return true, nil } /** * RegisterServiceInstance */ func (sec *ShenYuEtcdClient) GetServiceInstanceInfo(metaData interface{}) (instances interface{}, err error) { mdr := sec.checkCommonParam(metaData, err) key := mdr.AppName var nodes []*model.MetaDataRegister ctx, cancel := context.WithTimeout(context.Background(), constants.DEFAULT_ETCD_TIMEOUT*time.Second) defer cancel() resp, err := sec.EtcdClient.Get(ctx, key) if err != nil { logger.Error("etcd Get data failure, err:", err) return nil, err } node := new(model.MetaDataRegister) err = json.Unmarshal(resp.Kvs[0].Value, node) if err != nil { return nil, err } nodes = append(nodes, node) return nodes, nil } /** * RegisterServiceInstance **/ func (sec *ShenYuEtcdClient) RegisterServiceInstance(metaData interface{}) (registerResult bool, err error) { mdr := sec.checkCommonParam(metaData, err) data, _ := json.Marshal(metaData) if err != nil { return false, err } key := mdr.AppName ctx, cancel := context.WithTimeout(context.Background(), constants.DEFAULT_ETCD_TIMEOUT*time.Second) defer cancel() _, err = sec.EtcdClient.Put(ctx, key, string(data)) if err != nil { logger.Errorf("RegisterServiceInstance failure! ,error is :%v", err) return false, err } logger.Infof("RegisterServiceInstance,result:%v", true) return true, nil } /** * check common MetaDataRegister **/ func (sec *ShenYuEtcdClient) checkCommonParam(metaData interface{}, err error) *model.MetaDataRegister { mdr, ok := metaData.(*model.MetaDataRegister) if !ok { logger.Fatalf("get etcd client metaData error %v:", err) } return mdr } /** * close etcdClient **/ func (sec *ShenYuEtcdClient) Close() { sec.EtcdClient.Close() }