- 简介
Go-zero是一种基于Golang的微服务框架,提供很多便捷的工具和模块。其中,go-zero的服务自动收集问题分析是一种非常实用的功能,可以监控和收集服务的异常情况,支持对异常情况进行可视化展示和报警通知,对于服务的稳定运行和故障排除都有很大的帮助。
- 实现步骤
2.1 安装go-zero工具包和依赖包
首先需要安装go-zero工具包,并安装go-zero依赖库。go-zero工具包可以通过如下命令进行安装:
go get -u github.com/tal-tech/go-zero/tools/goctl
go-zero的依赖库可以通过go.mod的方式管理,只需要在代码根目录运行:
go mod vendor
即可自动生成vendor目录,将项目依赖放置其中。
2.2 引入go-zero的中间件
在main.go或者server.go中的NewServer方法中,可以通过如下方式引入go-zero的中间件:
import (
"github.com/tal-tech/go-zero/core/logx"
"github.com/tal-tech/go-zero/core/middleware"
"github.com/tal-tech/go-zero/core/stores/cache"
"github.com/tal-tech/go-zero/core/stores/redis"
"github.com/tal-tech/go-zero/rest"
"project/api/internal/config"
)
func NewServer(c config.Config) *rest.Server {
s := rest.MustNewServer(c.RestConf)
s.Use(func(ctx context.Context, in interface{}) (out interface{}, err error) {
// 执行性能监控、慢请求监控等特定的中间件逻辑
// 比如可以使用middleware.Instrument、middleware.Dump等方法
return nil, nil
})
s.Use(
// 引入log中间件
middleware.NewLogMiddleware(logx.WithContext(logx.DefaultLogger()), []string{"/health"}),
// 引入追踪中间件
middleware.NewTracingMiddleware(),
// 引入缓存中间件
middleware.NewCacheMiddleware(cache.NewCache(redis.NewRedis(c.Cache.Redis), c.Cache.LocalCache)),
// 引入我们的业务中间件
// middleware.NewMyMiddleware()
)
InitRouter(s)
return s
}
在其中,使用s.Use()方法引入了几个go-zero提供的非常实用的自带中间件:log、追踪、缓存等。同时可以通过自定义中间件的方式引入我们实现的业务逻辑。
2.3 启动问题收集服务
在引入go-zero的中间件之后,需要配置问题收集服务,在main.go中添加如下代码即可:
import (
"github.com/tal-tech/go-zero/core/stat"
)
func main() {
defer stat.Report()
// 在s.Start前面调用
stat.SetReporter(func(p stat.Project) stat.Reporter {
return statsd.NewReporter(p,
statsd.Address("127.0.0.1:8125"),
statsd.Engine(prometheus.NewEngine),
statsd.SampleRate(.1),
)
})
s := api.NewServer(config.Conf)
s.Start()
}
在这里必须引入go-zero提供的core/stat模块,通过SetReporter方法配置报告服务,并在defer语句中调用stat.Report()方法,申明不论成功还是失败都上报数据。
- 实例说明
在引入go-zero的中间件和配置问题收集服务之后,我们可以通过如下方式快速的检测我们的服务里出现的问题:
3.1 检测错误日志
在我们的业务逻辑代码中,如果写入了错误日志:
func AddEmployee(req types.AddEmployeeReq) (types.AddEmployeeRsp, error) {
// do something
logx.Error(err)
// do something
return rsp, err
}
则go-zero会在错误日志发生时自动收集并存储错误信息(包含异常信息等),并通过报告服务提供基础性的检测和分析。
3.2 检测请求延迟
在引入了go-zero的instrument中间件之后,我们可以使用middleware.Instrument()函数来对请求延迟时间进行检测和分析。
修改NewServer()方法,在其中添加如下中间件:
import (
"github.com/tal-tech/go-zero/core/middleware"
)
func NewServer(c config.Config) *rest.Server {
s := rest.MustNewServer(c.RestConf)
s.Use(middleware.Instrument())
InitRouter(s)
return s
}
此时,在我们的每个接口请求调用的前、后代码记录耗时:
func ListEmployee(req types.ListEmployeeReq) (types.ListEmployeeRsp, error) {
f := func(ctx context.Context) {
// 此处的代码将在方法调用前和调用后执行
logx.Info("函数调用成功")
}
defer f(ctx)
// do something
time.Sleep(time.Second)
// do something
return rsp, err
}
然后请求对应接口,即可在日志中查看并监测到每个接口请求的耗时。
通过如上方式,我们可以使用go-zero的服务自动收集问题分析功能快速的发现服务的问题,保障服务的安全运行。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:关于go-zero服务自动收集问题分析 - Python技术站