> 文章列表 > go-zero入门

go-zero入门

go-zero入门

文章目录

  • 简介
  • 框架设计
  • 环境准备
    • go安装
    • Go Module设置
    • goctl安装
      • 安装(mac\\&linux)
      • 安装(windows)
    • protoc & protoc-gen-go安装
  • goctl 各层代码生成一览
  • goctl 生成REST和RPC微服务
    • 生成数据模型层Model
    • 生成API服务
      • 目录结构
      • 开发者需要做的
        • 修改配置文件
        • 修改上下文依赖
        • 修改业务逻辑
      • 生成swagger
    • 生成rpc服务
      • 方式一:快速生成greet服务
      • 方式二:通过指定proto生成rpc服务
      • 开发者需要做的
        • 修改配置文件
        • 修改上下文依赖
      • 启动RPC服务
      • 启动REST服务
  • 集成Nacos注册中心
    • 安装依赖
    • 修改配置
  • 集成服务监控Prometheus
    • 在rest和rpc的yaml配置文件中添加Prometheus配置
    • 修改 Prometheus 配置
  • 集成链路追踪
    • 在rest和rpc服务的yaml文件中添加Telemetry 配置
  • 附录
    • api配置
      • 配置说明
        • Config
        • rest.RestConf
        • service.ServiceConf
        • logx.LogConf
        • prometheus.Config
        • SignatureConf
        • PrivateKeyConf
        • cache.CacheConf
        • redis.RedisConf
    • rpc配置
      • 配置说明
        • zrpc.RpcServerConf
        • discov.EtcdConf
        • redis.RedisKeyConf

简介

go-zero 是一个集成了各种工程实践的 web 和 rpc 框架。通过弹性设计保障了大并发服务端的稳定性,经受了充分的实战检验。

go-zero 包含极简的 API 定义和生成工具 goctl,可以根据定义的 api 文件一键生成 Go, iOS, Android, Kotlin, Dart, TypeScript, JavaScript 代码,并可直接运行。

主要特点:

  • 强大的工具支持,尽可能少的代码编写
  • 极简的接口
  • 完全兼容 net/http
  • 支持中间件,方便扩展
  • 高性能
  • 面向故障编程,弹性设计
  • 内建服务发现、负载均衡
  • 内建限流、熔断、降载,且自动触发,自动恢复
  • API 参数自动校验
  • 超时级联控制
  • 自动缓存控制
  • 链路跟踪、统计报警等
  • 高并发支撑,稳定保障了疫情期间每天的流量洪峰

如下图,从多个层面保障了整体服务的高可用:

go-zero入门

功能架构

go-zero入门

框架设计

go-zero入门

环境准备

go安装

下载go 安装包

安装完成,查看是否成功

go version

Go Module设置

Go Module是Golang管理依赖性的方式,像Java中的Maven,Android中的Gradle类似。

查看GO111MODULE开启情况

$ go env GO111MODULE
on

开启GO111MODULE,如果已开启(即执行go env GO111MODULE结果为on)请跳过。

$ go env -w GO111MODULE="on"

设置GOPROXY

$ go env -w GOPROXY=https://goproxy.cn

设置GOMODCACHE

查看GOMODCACHE

$ go env GOMODCACHE

如果目录不为空或者/dev/null,请跳过。

go env -w GOMODCACHE=$GOPATH/pkg/mod

goctl安装

安装(mac&linux)

# Go 1.15 及之前版本
GO111MODULE=on GOPROXY=https://goproxy.cn/,direct go get -u github.com/zeromicro/go-zero/tools/goctl@latest# Go 1.16 及以后版本
GOPROXY=https://goproxy.cn/,direct go install github.com/zeromicro/go-zero/tools/goctl@latest

环境变量检测

go get 下载编译后的二进制文件位于 $GOPATH/bin 目录下,要确保$GOPATH/bin已经添加到环境变量。

执行vim /etc/paths,在最后一行添加如下内容

$GOPATH/bin

安装结果验证

goctl -v

安装(windows)

执行命令

go install github.com/zeromicro/go-zero/tools/goctl@latest

goctl使用详情参考goctl

protoc & protoc-gen-go安装

protoc是一款用C++编写的工具,其可以将proto文件翻译为指定语言的代码。在go-zero的微服务中,我们采用grpc进行服务间的通信,而grpc的编写就需要用到protoc和翻译成go语言rpc stub代码的插件protoc-gen-go。

goctl一键安装

$ goctl env check -i -f --verbose                                 
[goctl-env]: preparing to check env[goctl-env]: looking up "protoc"
[goctl-env]: "protoc" is not found in PATH
[goctl-env]: preparing to install "protoc"
"protoc" installed from cache
[goctl-env]: "protoc" is already installed in "/Users/keson/go/bin/protoc"[goctl-env]: looking up "protoc-gen-go"
[goctl-env]: "protoc-gen-go" is not found in PATH
[goctl-env]: preparing to install "protoc-gen-go"
"protoc-gen-go" installed from cache
[goctl-env]: "protoc-gen-go" is already installed in "/Users/keson/go/bin/protoc-gen-go"[goctl-env]: looking up "protoc-gen-go-grpc"
[goctl-env]: "protoc-gen-go-grpc" is not found in PATH
[goctl-env]: preparing to install "protoc-gen-go-grpc"
"protoc-gen-go-grpc" installed from cache
[goctl-env]: "protoc-gen-go-grpc" is already installed in "/Users/keson/go/bin/protoc-gen-go-grpc"[goctl-env]: congratulations! your goctl environment is ready!

goctl 各层代码生成一览

所有绿色背景的功能模块是自动生成的,按需激活,红色模块是需要自己写的,也就是增加下依赖,编写业务特有逻辑,各层示意图分别如下:

API Gateway

go-zero入门

RPC

go-zero入门

model
go-zero入门

goctl 生成REST和RPC微服务

生成数据模型层Model

编写enterprise.sql文件

CREATE TABLE `enterprise_baseinfo` (`id` varchar(255) COLLATE utf8_croatian_ci NOT NULL COMMENT 'id',`region_code` varchar(32) COLLATE utf8_croatian_ci DEFAULT NULL COMMENT '区域编码',`region_name` varchar(32) COLLATE utf8_croatian_ci DEFAULT NULL COMMENT '区域名称',`province_code` varchar(32) COLLATE utf8_croatian_ci DEFAULT NULL COMMENT '所属省份code',`province_name` varchar(255) COLLATE utf8_croatian_ci DEFAULT NULL COMMENT '所属省份名称',`city_code` varchar(32) COLLATE utf8_croatian_ci DEFAULT NULL COMMENT '所属城市code',`city_name` varchar(255) COLLATE utf8_croatian_ci DEFAULT NULL COMMENT '所属城市名称',`county_code` varchar(32) COLLATE utf8_croatian_ci DEFAULT NULL COMMENT '所属区县code',`county_name` varchar(255) COLLATE utf8_croatian_ci DEFAULT NULL COMMENT '所属区县名称',`town_name` varchar(255) COLLATE utf8_croatian_ci DEFAULT NULL COMMENT '所属乡镇名称',`street_name` varchar(255) COLLATE utf8_croatian_ci DEFAULT NULL COMMENT '街(村)、门牌号',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT=企业信息';

运行模板生成命令

goctl model mysql ddl -src ./model/enterprise.sql -dir ./model -c

生成API服务

首先创建 api 文件

$ vim api/enterprisesAPI.api

enterprisesAPI.api文件说明

syntax = "v1"
//swagger信息
info(title: "企业信息"desc: "企业信息"author: "xxx"email: "xx@qq.com"version: "v1.0"
)
//查询操作入参
type GetRequest {Id string `path:"id"`
}
//查询操作出参
type GetResponse {Message string `json:"message"`
}
//新增操作入参
type PostRequest {RegionCode   string `json:"region_code"`RegionName   string `json:"region_name"`ProvinceCode string `json:"province_code"`ProvinceName string `json:"province_name"`CityCode     string `json:"city_code"`CityName     string `json:"city_name"`CountyCode   string `json:"county_code"`CountyName   string `json:"county_name"`TownName     string `json:"town_name"`StreetName   string `json:"street_name"`
}
//新增操作出参
type PostResponse {Message string `json:"message"`
}
//更新操作入参
type PutRequest {Id           string `json:"id"`RegionCode   string `json:"region_code"`RegionName   string `json:"region_name"`ProvinceCode string `json:"province_code"`ProvinceName string `json:"province_name"`CityCode     string `json:"city_code"`CityName     string `json:"city_name"`CountyCode   string `json:"county_code"`CountyName   string `json:"county_name"`TownName     string `json:"town_name"`StreetName   string `json:"street_name"`
}
//更新操作出参
type PutResponse {Message string `json:"message"`
}
//删除操作入参
type DelRequest {Id string `path:"id"`
}
//删除操作出参
type DelResponse {Message string `json:"message"`
}
//配置enterprises接口
service enterprises-api {//swagger配置接口信息@doc(summary: "查询企业详情"description: "查询企业详情")@handler GetHandler //接口绑定的handlerget /enterprises/:id (GetRequest) returns (GetResponse)@doc(summary: "新增企业信息")@handler PostHandlerpost /enterprises(PostRequest) returns (PostResponse)@doc(summary: "更新企业信息"description: "更新企业信息")@handler PutHandlerput /enterprises(PutRequest) returns (PutResponse)@doc(summary: "删除企业信息"description: "删除企业信息")@handler DeleteHandlerdelete /enterprises/:id(DelRequest) returns (DelResponse)
}

运行模板生成命令

$ goctl api go -api enterprisesAPI.api -dir . -style gozero

目录结构

├── enterprisesAPI.api # api 文件
├── enterprises.go # 程序入口文件
├── etc
│   └── enterprises-api.yaml # api 网关层配置文件
├── go.mod
├── go.sum
└── internal├── config│   └── config.go # 配置文件├── handler # 视图函数层, handler 文件与下面的 logic 文件一一对应│   ├── xxxhandler.go│   ├── routes.go├── logic # 需要手动填充代码的地方│   ├── xxxlogic.go├── svc # 封装 rpc 对象的地方│   └── servicecontext.go└── types # 把 enterprisesAPI.api 中定义的结构体映射为真正的 golang 结构体└── types.go

开发者需要做的

  • 服务中的配置文件编写(etc/xx.yaml、internal/config/config.go)
  • 服务中业务逻辑编写(internal/logic/xxlogic.go)
  • 服务中资源上下文的编写(internal/svc/servicecontext.go)

修改配置文件

vim api/etc/enterprises-api.yaml

Name: enterprises-api
Port: 8888ListenOn: 172.16.15.118:8888EnterprisesRpc:Etcd:Hosts:- etcd:2379Key: enterprises-apiCacheRedis:- Host: ip:6379Type: node # node可以不写,可以设为clusterPass: xxxx # 如果有密码

vim api/internal/config/config.go

package configimport ("github.com/zeromicro/go-zero/rest""github.com/zeromicro/go-zero/zrpc"
)type Config struct {rest.RestConfzrpc.RpcServerConfEnterprisesRpc zrpc.RpcClientConf
}

修改上下文依赖

vim api/internal/svc/servicecontext.go

package svcimport ("enterprises/enterprises/enterprisesAPI/internal/config""enterprises/enterprises/enterprisesRPC/enterprises""github.com/zeromicro/go-zero/zrpc"
)type ServiceContext struct {Config         config.ConfigEnterprisesRpc enterprises.Enterprises
}func NewServiceContext(c config.Config) *ServiceContext {return &ServiceContext{Config:         c,EnterprisesRpc: enterprises.NewEnterprises(zrpc.MustNewClient(c.EnterprisesRpc)),}
}

修改业务逻辑

修改获取详情逻辑vim api/internal/logic/getlogic.go

package logicimport ("context""enterprises/enterprises/enterprisesAPI/internal/svc""enterprises/enterprises/enterprisesAPI/internal/types""enterprises/enterprises/enterprisesRPC/enterprises""github.com/zeromicro/go-zero/core/logx"
)type GetLogic struct {logx.Loggerctx    context.ContextsvcCtx *svc.ServiceContext
}func NewGetLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetLogic {return &GetLogic{Logger: logx.WithContext(ctx),ctx:    ctx,svcCtx: svcCtx,}
}func (l *GetLogic) Get(req *types.GetRequest) (resp *types.GetResponse, err error) {// todo: add your logic here and delete this lineenterprises, err := l.svcCtx.EnterprisesRpc.Detail(l.ctx, &enterprises.GetRequest{Id: 1,})if err != nil {return nil, err}return &types.GetResponse{Message: `"id":"` + enterprises.Id + `","EnterCode":"` + enterprises.EnterCode + `","EnterName":"` + enterprises.EnterName + `","Tyshxydm":"` + enterprises.Tyshxydm +`","EnterAddress":"` + enterprises.EnterAddress + `","RegionCode":"` + enterprises.RegionCode + `","RegionName":"` + enterprises.RegionName + `","ProvinceCode":"` + enterprises.ProvinceCode +`","ProvinceName":"` + enterprises.ProvinceName + `","CityCode":"` + enterprises.CityCode + `","CityName":"` + enterprises.CityName + `","CountyCode":"` + enterprises.CountyCode +`","CountyName":"` + enterprises.CountyName + `","TownName":"` + enterprises.TownName + `","StreetName":"` + enterprises.StreetName,}, nil
}

生成swagger

在.api文件中添加swagger注解,通过goctl swagger插件可以生成swagger接口文件

//swagger信息
info(title: "企业信息"desc: "企业信息"author: "xxx"email: "xx@qq.com"version: "v1.0"
)...//swagger配置接口信息
@doc(summary: "查询企业详情"
)
@handler GetHandler //接口绑定的handler
get /enterprises/:id (GetRequest) returns (GetResponse)

安装goctl-swagger插件

go install github.com/zeromicro/goctl-swagger@latest

执行swagger生成命令

goctl api plugin -plugin goctl-swagger="swagger -filename enterprisesAPI.json" -api enterprisesAPI.api -dir .

生成rpc服务

方式一:快速生成greet服务

$ goctl rpc new greet

方式二:通过指定proto生成rpc服务

$ goctl rpc template -o=enterprise.proto

生成rpc服务代码

$ goctl rpc protoc enterprise.proto --go_out=. --go-grpc_out=. --zrpc_out=.

开发者需要做的

  • 服务中的配置文件编写(etc/xx.yaml、internal/config/config.go)
  • 服务中资源上下文的编写(internal/svc/servicecontext.go)
  • 服务中业务逻辑编写(internal/logic/xxlogic.go)

修改配置文件

vim rpc/etc/enterprise.yaml

修改服务监听地址,端口号为 0.0.0.0:8083,Etcd 服务配置,Mysql 服务配置,CacheRedis 服务配置

Name: enterprises-rpc
ListenOn: 0.0.0.0:8083Etcd:Hosts:- 127.0.0.1:2379Key: enterprises-rpcMysql:DataSource: ads:xxx@tcp(172.16.17.2:3306)/ads_environment?charset=utf8mb4&parseTime=trueCacheRedis:- Host: ip:6379Type: node # node可以不写,可以设为clusterPass: xxxx # 如果有密码

添加 Mysql 服务配置,CacheRedis 服务配置的实例化

vim rpc/internal/config/config.go

package configimport ("github.com/zeromicro/go-zero/core/stores/cache""github.com/zeromicro/go-zero/zrpc"
)type Config struct {zrpc.RpcServerConf//mysql配置Mysql struct {DataSource string}//redis配置CacheRedis cache.CacheConf
}

修改上下文依赖

注册服务上下文 model 的依赖vim rpc/internal/svc/servicecontext.go

package svcimport ("enterprises/enterprises/enterprisesRPC/internal/config""enterprises/enterprises/model""github.com/zeromicro/go-zero/core/stores/sqlx"
)type ServiceContext struct {Config                     config.ConfigAdsEnterpriseBaseinfoModel model.AdsEnterpriseBaseinfoModel
}func NewServiceContext(c config.Config) *ServiceContext {conn := sqlx.NewMysql(c.Mysql.DataSource)return &ServiceContext{Config:                     c,AdsEnterpriseBaseinfoModel: model.NewAdsEnterpriseBaseinfoModel(conn, c.CacheRedis),}
}

启动RPC服务

go run enterprise.go -f etc/enterprises.yaml

启动REST服务

go run enterprises.go -f etc/enterprisesAPI-api.yaml

集成Nacos注册中心

安装依赖

go get -u github.com/zeromicro/zero-contrib/zrpc/registry/nacos

修改配置

在etc/xx.yaml配置文件中添加服务IP及端口

ListenOn: 127.0.0.1:8081 //填写真实ip及端口

3.在xxx.go启动文件上添加nacos配置

package mainimport ("flag""github.com/nacos-group/nacos-sdk-go/common/constant""github.com/zeromicro/go-zero/core/conf""github.com/zeromicro/go-zero/zrpc""github.com/zeromicro/zero-contrib/zrpc/registry/nacos"//-------------------------------------------------// 引入包_ "github.com/zeromicro/zero-contrib/zrpc/registry/nacos"//-------------------------------------------------"go-zero-demo/mall/user/rpc/internal/config""go-zero-demo/mall/user/rpc/internal/server""go-zero-demo/mall/user/rpc/internal/svc""go-zero-demo/mall/user/rpc/types/user""google.golang.org/grpc""google.golang.org/grpc/reflection"
)var configFile = flag.String("f", "etc/xxxx.yaml", "the config file")func main() {flag.Parse()var c config.Configconf.MustLoad(*configFile, &c)ctx := svc.NewServiceContext(c)srv := server.NewUserServer(ctx)serverRpc := zrpc.MustNewServer(c.RpcServerConf, func(grpcServer *grpc.Server) {user.RegisterUserServer(grpcServer, srv)if c.Mode == service.DevMode || c.Mode == service.TestMode {reflection.Register(grpcServer)}})//------------------------------------------------------------------------// 注册服务到nacossc := []constant.ServerConfig{*constant.NewServerConfig("127.0.0.1", 8848),}cc := &constant.ClientConfig{NamespaceId:         "",TimeoutMs:           50000,NotLoadCacheAtStart: true,LogDir:              "/tmp/nacos/log",CacheDir:            "/tmp/nacos/cache",LogLevel:            "debug",}opts := nacos.NewNacosConfig("enterprises-api", c.ListenOn, sc, cc)_ = nacos.RegisterService(opts)//----------------------------------------------------------------------serverRpc.Start()
}

集成服务监控Prometheus

在rest和rpc的yaml配置文件中添加Prometheus配置

api/etc/enterprise.yaml

Prometheus:Host: 0.0.0.0Port: 9080   # 指标采集端口Path: /metrics

rpc/etc/enterprise.yaml

Prometheus:Host: 0.0.0.0Port: 9081   # 指标采集端口Path: /metrics

修改 Prometheus 配置

# my global config
global:scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.     # scrape_timeout is set to the global default (10s).# Alertmanager configuration
alerting:alertmanagers:- static_configs:- targets:# - alertmanager:9093# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.  
rule_files:# - "first_rules.yml"# - "second_rules.yml"# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.- job_name: "prometheus"# metrics_path defaults to '/metrics'# scheme defaults to 'http'.static_configs:- targets: ["localhost:9090"]# 自己的项目配置- job_name: 'enterprise'static_configs:# 目标的采集地址- targets: ['golang:9080']labels:# 自定义标签app: 'enterprise-api'env: 'test'- targets: ['golang:9081']labels:app: 'enterprise-rpc'env: 'test'

集成链路追踪

Jaeger 是 Uber 开发并开源的一款分布式追踪系统,兼容 OpenTracing API,适用于以下场景:

  • 分布式跟踪信息传递
  • 分布式事务监控
  • 问题分析
  • 服务依赖性分析
  • 性能优化

Jaeger 的全链路追踪功能主要由三个角色完成:

  • client:负责全链路上各个调用点的计时、采样,并将 tracing 数据发往本地 agent。
  • agent:负责收集 client 发来的 tracing 数据,并以 thrift 协议转发给 collector。
  • collector:负责搜集所有 agent 上报的 tracing 数据,统一存储。

在rest和rpc服务的yaml文件中添加Telemetry 配置

rest

Telemetry:Name: enterprise-apiEndpoint: http://jaeger:14268/api/tracesSampler: 1.0Batcher: jaeger

rpc

Telemetry:Name: enterprise-rpcEndpoint: http://jaeger:14268/api/tracesSampler: 1.0Batcher: jaeger

附录

api配置

api配置控制着api服务中的各种功能,包含但不限于服务监听地址,端口,环境配置,日志配置等,下面我们从一个简单的配置来看一下api中常用配置分别有什么作用。

配置说明

通过yaml配置我们会发现,有很多参数我们并没有与config对齐,这是因为config定义中,有很多都是带optional或者default 标签的,对于optional可选项,你可以根据自己需求判断是否需要设置,对于default标签,如果你觉得默认值就已经够了,可以不用设置, 一般default中的值基本不用修改,可以认为是最佳实践值。

Config

type Config struct{rest.RestConf // rest api配置Auth struct { // jwt鉴权配置AccessSecret string // jwt密钥AccessExpire int64 // 有效期,单位:秒}Mysql struct { // 数据库配置,除mysql外,可能还有mongo等其他数据库DataSource string // mysql链接地址,满足 $user:$password@tcp($ip:$port)/$db?$queries 格式即可}CacheRedis cache.CacheConf // redis缓存UserRpc    zrpc.RpcClientConf // rpc client配置
}    

rest.RestConf

api服务基础配置,包含监听地址,监听端口,证书配置,限流,熔断参数,超时参数等控制,对其展开我们可以看到:

type RestConf struct{service.ServiceConf // service配置Host         string `json:",default=0.0.0.0"` // http监听ip,默认0.0.0.0Port         int // http监听端口,必填CertFile     string `json:",optional"` // https证书文件,可选KeyFile      string `json:",optional"` // https私钥文件,可选 Verbose      bool   `json:",optional"` // 是否打印详细http请求日志MaxConns     int    `json:",default=10000"` // http同时可接受最大请求数(限流数),默认10000MaxBytes     int64  `json:",default=1048576,range=[0:8388608]"` // http可接受请求的最大ContentLength,默认1048576,被设置值不能必须在0到8388608之间// millisecondsTimeout      int64         `json:",default=3000"` // 超时时长控制,单位:毫秒,默认3000CpuThreshold int64         `json:",default=900,range=[0:1000]"` // cpu降载阈值,默认900,可允许设置范围0到1000Signature    SignatureConf `json:",optional"` // 签名配置
}

service.ServiceConf

type ServiceConf struct {Name       string // 服务名称Log        logx.LogConf // 日志配置Mode       string            `json:",default=pro,options=dev|test|pre|pro"` // 服务环境,dev-开发环境,test-测试环境,pre-预发环境,pro-正式环境MetricsUrl string            `json:",optional"` // 指标上报接口地址,该地址需要支持post json即可Prometheus prometheus.Config `json:",optional"` // prometheus配置
}

logx.LogConf

type LogConf struct {ServiceName         string `json:",optional"` // 服务名称Mode                string `json:",default=console,options=console|file|volume"` // 日志模式,console-输出到console,file-输出到当前服务器(容器)文件,,volume-输出docker挂在文件内Path                string `json:",default=logs"` // 日志存储路径Level               string `json:",default=info,options=info|error|severe"` // 日志级别Compress            bool   `json:",optional"` // 是否开启gzip压缩KeepDays            int    `json:",optional"` // 日志保留天数StackCooldownMillis int    `json:",default=100"` // 日志write间隔
}

prometheus.Config

type Config struct {Host string `json:",optional"` // prometheus 监听hostPort int    `json:",default=9101"` // prometheus 监听端口Path string `json:",default=/metrics"` // 上报地址
}

SignatureConf

type SignatureConf struct {Strict      bool          `json:",default=false"` // 是否Strict模式,如果是则PrivateKeys必填Expiry      time.Duration `json:",default=1h"` // 有效期,默认1小时PrivateKeys []PrivateKeyConf // 签名密钥相关配置
}

PrivateKeyConf

type PrivateKeyConf struct {Fingerprint string // 指纹配置KeyFile     string // 密钥配置
}

cache.CacheConf

type CacheConf struct{ClusterConf []NodeConfNodeConf struct {redis.RedisConfWeight int `json:",default=100"` // 权重}
}

redis.RedisConf

type RedisConf struct {Host string // redis地址Type string `json:",default=node,options=node|cluster"` // redis类型Pass string `json:",optional"` // redis密码
}

rpc配置

rpc配置控制着一个rpc服务的各种功能,包含但不限于监听地址,etcd配置,超时,熔断配置等,下面我们以一个常见的rpc服务配置来进行说明。

配置说明

type Config struct {zrpc.RpcServerConfCacheRedis         cache.CacheConf // redis缓存配置,详情见api配置说明,这里不赘述Mysql struct { // mysql数据库访问配置,详情见api配置说明,这里不赘述DataSource string}
}

zrpc.RpcServerConf

type RpcServerConf struct {service.ServiceConf // 服务配置,详情见api配置说明,这里不赘述ListenOn      string // rpc监听地址和端口,如:127.0.0.1:8888Etcd          discov.EtcdConf    `json:",optional"` // etcd相关配置Auth          bool               `json:",optional"` // 是否开启Auth,如果是则Redis为必填Redis         redis.RedisKeyConf `json:",optional"` // Auth验证StrictControl bool               `json:",optional"` // 是否Strict模式,如果是则遇到错误是Auth失败,否则可以认为成功// pending forever is not allowed// never set it to 0, if zero, the underlying will set to 2s automaticallyTimeout      int64 `json:",default=2000"` // 超时控制,单位:毫秒CpuThreshold int64 `json:",default=900,range=[0:1000]"` cpu降载阈值,默认900,可允许设置范围0到1000
}

discov.EtcdConf

type EtcdConf struct {Hosts []string // etcd host数组Key   string // rpc注册key
}

redis.RedisKeyConf

type RedisConf struct {Host string // redis 主机Type string `json:",default=node,options=node|cluster"` // redis类型Pass string `json:",optional"` // redis密码
}type RedisKeyConf struct {RedisConfKey string `json:",optional"` // 验证key
}

人力资源网