go-zero框架之zrpc.RpcServerConf配置源码分析
Posted 菜鸟一枚
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go-zero框架之zrpc.RpcServerConf配置源码分析相关的知识,希望对你有一定的参考价值。
在go-zero中使用zrpc包来配置rpc服务,zrpc/config.go文件中定义了两个结构体(RpcServerConf和RpcClientConf)。
一、RpcServerConf结构体:
type RpcServerConf struct {
service.ServiceConf
ListenOn string
Etcd discov.EtcdConf `json:",optional"`
Auth bool `json:",optional"`
Redis redis.RedisKeyConf `json:",optional"`
StrictControl bool `json:",optional"`
// setting 0 means no timeout
Timeout int64 `json:",default=2000"`
CpuThreshold int64 `json:",default=900,range=[0:1000]"`
}
- service.ServiceConf:调用的是core/serviceConf.go配置文件,文件中定义ServiceConf结构体,其中Prometheus字段被定义在core/prometheus/config.go文件
// 服务端的基本配置信息
type ServiceConf struct {
Name string
Log logx.LogConf
Mode string `json:",default=pro,options=dev|test|rt|pre|pro"`
MetricsUrl string `json:",optional"`
Prometheus prometheus.Config `json:",optional"`
}
// prometheus配置
type Config struct {
Host string `json:",optional"`
Port int `json:",default=9101"`
Path string `json:",default=/metrics"`
}
- ListenOn:监听路径
- Etcd:etcd配置,该项调用的是core/discov/config.go文件中的EtcdConf结构体,结构体有一个Validate()方法,该方法用于判断Hosts和Key是否为空,如果为空返回错误,反之返回nil。
// EtcdConf is the config item with the given key on etcd.
type EtcdConf struct {
Hosts []string
Key string
}
// Validate validates c.
func (c EtcdConf) Validate() error {
if len(c.Hosts) == 0 {
return errors.New("empty etcd hosts")
} else if len(c.Key) == 0 {
return errors.New("empty etcd key")
} else {
return nil
}
}
- Auth:bool值
Redis:redis配置,调用的是core/stores/redis/conf.go文件中的RedisKeyConf结构体。该文件定义两个结构体:RedisKeyConf和RedisConf,RedisKeyConf内嵌RedisConf。
RedisConf结构体
- Host: 主机
- Type: 默认为node,可选项:node/cluster
- Pass: 可选
Tls: bool类型,是否开启,默认不开启
// A RedisConf is a redis config. RedisConf struct { Host string Type string `json:",default=node,options=node|cluster"` Pass string `json:",optional"` Tls bool `json:",default=false,options=true|false"` }
- RedisKeyConf结构体只有两个字段:key和内嵌的RedisConf结构体,这种配置类似于kv设置。
- RedisConf结构体定义了两个方法,Validate和NewRedis。Validate判断的Type和Host是否为空,如果为空返回错误,反之返回为nil。NewRedis中定义Option组成的数组opts,如果Type为cluster,则向opts中添加一个cluster(),如果Pass大于0,则向opts中添加WithPasss(),如果Tls为true,则向opts添加WithTLS()。最后返回一个host和可选项组成的Redis配置指针。
// Validate validates the RedisConf. func (rc RedisConf) Validate() error { if len(rc.Host) == 0 { return ErrEmptyHost } if len(rc.Type) == 0 { return ErrEmptyType } return nil } // NewRedis returns a Redis. func (rc RedisConf) NewRedis() *Redis { var opts []Option if rc.Type == ClusterType { opts = append(opts, Cluster()) } if len(rc.Pass) > 0 { opts = append(opts, WithPass(rc.Pass)) } if rc.Tls { opts = append(opts, WithTLS()) } return New(rc.Host, opts...) }
- RedisKeyConf结构体包含一个Validate方法,该方法调用RedisConf的Validate方法,并且判断key是否为空,如果其中一个有错返回err,反之返回nil。
- StrictControl:是否开启严格模式,可选
- Timeout:超时时间默认为2000毫秒
- CpuThreshold:范围在0-1000,默认900
RpcServerConf方法包含两个方法:HasEtcd和Validate
- HasEtcd方法判断host和key是否存在,从判断是否使用etcd
- Validate方法调用redis中的Validate方法
二、RpcClientConf结构体
// A RpcClientConf is a rpc client config.
RpcClientConf struct {
Etcd discov.EtcdConf `json:",optional"`
Endpoints []string `json:",optional=!Etcd"`
App string `json:",optional"`
Token string `json:",optional"`
Timeout int64 `json:",default=2000"`
}
- Etcd字段:etcd配置,同RpcServerConf
- Entpoints:由string类型组成的数组
- App:string类型
- Token:string类型
- Timeout:超时默认2000
RpcClientConf包含一个HasCredential方法,该方法返回一个error,如果App和Token同时存在则返回true,反之返回false。
到这里,rpc的客户端和服务端配置字段和直接用到的方法基本就介绍完了,下一步进行一个简单的实践。
三、实践
- 在服务端创建yaml配置文件
Name: user.rpc
ListenOn: 127.0.0.1:8080
Etcd:
Hosts:
- 127.0.0.1:2379
Key: user.rpc
- 在服务端中config.go定义一个结构体,结构体内部定义字段,调用zrpc中的RpcServerConf结构体
package config
import "github.com/tal-tech/go-zero/zrpc"
type Config struct {
zrpc.RpcServerConf
}
- 实例化配置,NewServiceContext方法返回*ServiceContext
package svc
import "user/rpc/internal/config"
type ServiceContext struct {
Config config.Config
}
func NewServiceContext(c config.Config) *ServiceContext {
return &ServiceContext{
Config: c,
}
}
以上是关于go-zero框架之zrpc.RpcServerConf配置源码分析的主要内容,如果未能解决你的问题,请参考以下文章