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

配置说明

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

Config

go-zero-demo\greet\etc\greet-api.yaml

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

rest.RestConf

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

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

service.ServiceConf

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

logx.LogConf

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

prometheus.Config

  1. type Config struct {
  2. Host string `json:",optional"` // prometheus 监听host
  3. Port int `json:",default=9101"` // prometheus 监听端口
  4. Path string `json:",default=/metrics"` // 上报地址
  5. }

SignatureConf

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

PrivateKeyConf

  1. PrivateKeyConf struct {
  2. Fingerprint string // 指纹配置
  3. KeyFile string // 密钥配置
  4. }

cache.CacheConf

  1. ClusterConf []NodeConf
  2. NodeConf struct {
  3. redis.RedisConf
  4. Weight int `json:",default=100"` // 权重
  5. }

redis.RedisConf

  1. RedisConf struct {
  2. Host string // redis地址
  3. Type string `json:",default=node,options=node|cluster"` // redis类型
  4. Pass string `json:",optional"` // redis密码
  5. }ya

Api示例

配置信息

D:\Projects\Github\NoobWu\go-zero-demo\book\service\user\cmd\api\etc\user-api.yaml

  1. Name: user-api
  2. #http监听ip,默认0.0.0.0
  3. Host: 0.0.0.0
  4. #http监听端口,必填
  5. Port: 8888
  6. #是否打印详细http请求日志
  7. Verbose: true
  8. #http同时可接受最大请求数(限流数),默认10000
  9. MaxConns: 10
  10. #http可接受请求的最大ContentLength,默认1048576,被设置值不能必须在0到8388608之间
  11. MaxBytes: 1048576
  12. #超时时长控制,单位:毫秒,默认3000
  13. Timeout: 3000
  14. #cpu降载阈值,默认900,可允许设置范围0到1000
  15. CpuThreshold: 900
  16. #mysql链接地址,满足 $user:$password@tcp($ip:$port)/$db?$queries 格式即可
  17. Mysql:
  18. DataSource: root:123456@tcp(127.0.0.1:3306)/gozero?charset=utf8mb4&parseTime=true&loc=Asia%2FShanghai
  19. #缓存相关设置
  20. CacheRedis:
  21. - Host: 127.0.0.1:6379
  22. Pass:
  23. Type: node
  24. #认证相关设置
  25. Auth:
  26. AccessSecret: ad879037-c7a4-4063-9236-6bfc35d54b7d
  27. AccessExpire: 86400

D:\Projects\Github\NoobWu\go-zero-demo\book\service\user\cmd\api\user.go

  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "net/http"
  6. "go-zero-demo/book/common/errorx"
  7. "go-zero-demo/book/service/user/cmd/api/internal/config"
  8. "go-zero-demo/book/service/user/cmd/api/internal/handler"
  9. "go-zero-demo/book/service/user/cmd/api/internal/svc"
  10. "github.com/tal-tech/go-zero/core/conf"
  11. "github.com/tal-tech/go-zero/rest"
  12. "github.com/tal-tech/go-zero/rest/httpx"
  13. )
  14. var configFile = flag.String("f", "etc/user-api.yaml", "the config file")
  15. func main() {
  16. flag.Parse()
  17. var c config.Config
  18. conf.MustLoad(*configFile, &c) //读取配置信息
  19. ctx := svc.NewServiceContext(c)
  20. server := rest.MustNewServer(c.RestConf)
  21. defer server.Stop()
  22. handler.RegisterHandlers(server, ctx)
  23. // 自定义错误
  24. httpx.SetErrorHandler(func(err error) (int, interface{}) {
  25. switch e := err.(type) {
  26. case *errorx.CodeError:
  27. return http.StatusOK, e.Data()
  28. default:
  29. return http.StatusInternalServerError, nil
  30. }
  31. })
  32. fmt.Printf("Starting server at %s:%d...\n", c.Host, c.Port)
  33. server.Start()
  34. }
  1. PS D:\Projects\Github\NoobWu\go-zero-demo\book\service\user\cmd\api> go run .\user.go -f .\etc\user-api.yaml

image.png
image.png

原文链接

https://go-zero.dev/cn/api-config.html