前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >聊聊nacos-sdk-go的NamingProxy

聊聊nacos-sdk-go的NamingProxy

原创
作者头像
code4it
修改2020-06-28 10:47:15
2770
修改2020-06-28 10:47:15
举报
文章被收录于专栏:码匠的流水账码匠的流水账

本文主要研究一下nacos-sdk-go的NamingProxy

NamingProxy

nacos-sdk-go-v0.3.2/clients/naming_client/naming_proxy.go

代码语言:javascript
复制
type NamingProxy struct {
    clientConfig constant.ClientConfig
    nacosServer  nacos_server.NacosServer
}
  • NamingProxy定义了clientConfig、nacosServer属性

NewNamingProxy

nacos-sdk-go-v0.3.2/clients/naming_client/naming_proxy.go

代码语言:javascript
复制
func NewNamingProxy(clientCfg constant.ClientConfig, serverCfgs []constant.ServerConfig, httpAgent http_agent.IHttpAgent) (NamingProxy, error) {
    srvProxy := NamingProxy{}
    srvProxy.clientConfig = clientCfg
​
    var err error
    srvProxy.nacosServer, err = nacos_server.NewNacosServer(serverCfgs, clientCfg, httpAgent, clientCfg.TimeoutMs, clientCfg.Endpoint)
    if err != nil {
        return srvProxy, err
    }
​
    return srvProxy, nil
}
  • NewNamingProxy通过nacos_server.NewNacosServer创建srvProxy.nacosServer

RegisterInstance

nacos-sdk-go-v0.3.2/clients/naming_client/naming_proxy.go

代码语言:javascript
复制
func (proxy *NamingProxy) RegisterInstance(serviceName string, groupName string, instance model.Instance) (string, error) {
    log.Printf("[INFO] register instance namespaceId:<%s>,serviceName:<%s> with instance:<%s> \n", proxy.clientConfig.NamespaceId, serviceName, utils.ToJsonString(instance))
    params := map[string]string{}
    params["namespaceId"] = proxy.clientConfig.NamespaceId
    params["serviceName"] = serviceName
    params["groupName"] = groupName
    params["clusterName"] = instance.ClusterName
    params["ip"] = instance.Ip
    params["port"] = strconv.Itoa(int(instance.Port))
    params["weight"] = strconv.FormatFloat(instance.Weight, 'f', -1, 64)
    params["enable"] = strconv.FormatBool(instance.Enable)
    params["healthy"] = strconv.FormatBool(instance.Healthy)
    params["metadata"] = utils.ToJsonString(instance.Metadata)
    params["ephemeral"] = strconv.FormatBool(instance.Ephemeral)
    return proxy.nacosServer.ReqApi(constant.SERVICE_PATH, params, http.MethodPost)
}
  • RegisterInstance构造params,然后通过proxy.nacosServer.ReqApi(constant.SERVICE_PATH, params, http.MethodPost)发送POST请求

DeregisterInstance

nacos-sdk-go-v0.3.2/clients/naming_client/naming_proxy.go

代码语言:javascript
复制
func (proxy *NamingProxy) DeregisterInstance(serviceName string, ip string, port uint64, clusterName string, ephemeral bool) (string, error) {
    log.Printf("[INFO] deregister instance namespaceId:<%s>,serviceName:<%s> with instance:<%s:%d@%s> \n", proxy.clientConfig.NamespaceId, serviceName, ip, port, clusterName)
    params := map[string]string{}
    params["namespaceId"] = proxy.clientConfig.NamespaceId
    params["serviceName"] = serviceName
    params["clusterName"] = clusterName
    params["ip"] = ip
    params["port"] = strconv.Itoa(int(port))
    params["ephemeral"] = strconv.FormatBool(ephemeral)
    return proxy.nacosServer.ReqApi(constant.SERVICE_PATH, params, http.MethodDelete)
}
  • DeregisterInstance方法构造params,然后通过proxy.nacosServer.ReqApi(constant.SERVICE_PATH, params, http.MethodDelete)发送DELETE请求

SendBeat

nacos-sdk-go-v0.3.2/clients/naming_client/naming_proxy.go

代码语言:javascript
复制
func (proxy *NamingProxy) SendBeat(info model.BeatInfo) (int64, error) {
    log.Printf("[INFO] namespaceId:<%s> sending beat to server:<%s> \n", proxy.clientConfig.NamespaceId, utils.ToJsonString(info))
    params := map[string]string{}
    params["namespaceId"] = proxy.clientConfig.NamespaceId
    params["serviceName"] = info.ServiceName
    params["beat"] = utils.ToJsonString(info)
    api := constant.SERVICE_BASE_PATH + "/instance/beat"
    result, err := proxy.nacosServer.ReqApi(api, params, http.MethodPut)
    if err != nil {
        return 0, err
    }
    if result != "" {
        interVal, err := jsonparser.GetInt([]byte(result), "clientBeatInterval")
        if err != nil {
            return 0, errors.New(fmt.Sprintf("[ERROR] namespaceId:<%s> sending beat to server:<%s> get 'clientBeatInterval' from <%s> error:<%s>", proxy.clientConfig.NamespaceId, utils.ToJsonString(info), result, err.Error()))
        } else {
            return interVal, nil
        }
    }
    return 0, nil
​
}
  • SendBeat方法通过proxy.nacosServer.ReqApi(api, params, http.MethodPut)发送PUT请求

GetServiceList

nacos-sdk-go-v0.3.2/clients/naming_client/naming_proxy.go

代码语言:javascript
复制
func (proxy *NamingProxy) GetServiceList(pageNo int, pageSize int, groupName string, selector *model.ExpressionSelector) (*model.ServiceList, error) {
    params := map[string]string{}
    params["namespaceId"] = proxy.clientConfig.NamespaceId
    params["groupName"] = groupName
    params["pageNo"] = strconv.Itoa(pageNo)
    params["pageSize"] = strconv.Itoa(pageSize)
​
    if selector != nil {
        switch selector.Type {
        case "label":
            params["selector"] = utils.ToJsonString(selector)
            break
        default:
            break
​
        }
    }
​
    api := constant.SERVICE_BASE_PATH + "/service/list"
    result, err := proxy.nacosServer.ReqApi(api, params, http.MethodGet)
    if err != nil {
        return nil, err
    }
    if result == "" {
        return nil, errors.New("request server return empty")
    }
​
    serviceList := model.ServiceList{}
    count, err := jsonparser.GetInt([]byte(result), "count")
    if err != nil {
        return nil, errors.New(fmt.Sprintf("[ERROR] namespaceId:<%s> get service list pageNo:<%d> pageSize:<%d> selector:<%s> from <%s> get 'count' from <%s> error:<%s>", proxy.clientConfig.NamespaceId, pageNo, pageSize, utils.ToJsonString(selector), groupName, result, err.Error()))
    }
    var doms []string
    _, err = jsonparser.ArrayEach([]byte(result), func(value []byte, dataType jsonparser.ValueType, offset int, err error) {
        doms = append(doms, string(value))
    }, "doms")
    if err != nil {
        return nil, errors.New(fmt.Sprintf("[ERROR] namespaceId:<%s> get service list pageNo:<%d> pageSize:<%d> selector:<%s> from <%s> get 'doms' from <%s> error:<%s> ", proxy.clientConfig.NamespaceId, pageNo, pageSize, utils.ToJsonString(selector), groupName, result, err.Error()))
    }
    serviceList.Count = count
    serviceList.Doms = doms
    return &serviceList, nil
}
  • GetServiceList方法通过proxy.nacosServer.ReqApi(api, params, http.MethodGet)发送GET请求,然后解析为serviceList

ServerHealthy

nacos-sdk-go-v0.3.2/clients/naming_client/naming_proxy.go

代码语言:javascript
复制
func (proxy *NamingProxy) ServerHealthy() bool {
    api := constant.SERVICE_BASE_PATH + "/operator/metrics"
    result, err := proxy.nacosServer.ReqApi(api, map[string]string{}, http.MethodGet)
    if err != nil {
        log.Printf("[ERROR]:namespaceId:[%s] sending server healthy failed!,result:%s error:%s", proxy.clientConfig.NamespaceId, result, err.Error())
        return false
    }
    if result != "" {
        status, err := jsonparser.GetString([]byte(result), "status")
        if err != nil {
            log.Printf("[ERROR]:namespaceId:[%s] sending server healthy failed!,result:%s error:%s", proxy.clientConfig.NamespaceId, result, err.Error())
        } else {
            return status == "UP"
        }
    }
    return false
}
  • ServerHealthy方法请求/operator/metrics判断是否healthy

QueryList

nacos-sdk-go-v0.3.2/clients/naming_client/naming_proxy.go

代码语言:javascript
复制
func (proxy *NamingProxy) QueryList(serviceName string, clusters string, udpPort int, healthyOnly bool) (string, error) {
    param := make(map[string]string)
    param["namespaceId"] = proxy.clientConfig.NamespaceId
    param["serviceName"] = serviceName
    param["clusters"] = clusters
    param["udpPort"] = strconv.Itoa(udpPort)
    param["healthyOnly"] = strconv.FormatBool(healthyOnly)
    param["clientIp"] = utils.LocalIP()
    api := constant.SERVICE_PATH + "/list"
    return proxy.nacosServer.ReqApi(api, param, http.MethodGet)
}
  • QueryList方法请求`/list获取服务列表

GetAllServiceInfoList

nacos-sdk-go-v0.3.2/clients/naming_client/naming_proxy.go

代码语言:javascript
复制
func (proxy *NamingProxy) GetAllServiceInfoList(namespace string, groupName string, clusters string) (string, error) {
    param := make(map[string]string)
    param["namespaceId"] = proxy.clientConfig.NamespaceId
    param["clusters"] = clusters
    param["groupName"] = groupName
    api := constant.SERVICE_INFO_PATH + "/getAll"
    return proxy.nacosServer.ReqApi(api, param, http.MethodGet)
}
  • GetAllServiceInfoList方法请求/getAll获取所有服务列表

小结

NamingProxy定义了clientConfig、nacosServer属性;它提供了NewNamingProxy、RegisterInstance、DeregisterInstance、SendBeat、GetServiceList、ServerHealthy、QueryList、GetAllServiceInfoList方法

doc

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • NamingProxy
  • NewNamingProxy
  • RegisterInstance
  • DeregisterInstance
  • SendBeat
  • GetServiceList
  • ServerHealthy
  • QueryList
  • GetAllServiceInfoList
  • 小结
  • doc
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档