个人开发的 golang 通用 grpc http 基础开发框架

websong · · 1591 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

# go-moda * golang 通用的 grpc http 基础开发框架,集成 http(echo、gin)和 grpc。openTelemetry 实现微务链路追踪, pprof: * [仓库地址](https://github.com/webws/go-moda): [https://github.com/webws/go-moda](https://github.com/webws/go-moda * 仓库一直在更新,欢迎大家吐槽和指点 ## 特性 - transport: 集成 http(echo、gin)和 grpc。 - tracing: openTelemetry 实现微务链路追踪 - pprof: 分析性能 - config: 通用的配置文件读取模块,支持 toml、yaml 和 json 格式。 - logger: 日志系统模块,基于 Zap,并支持全局日志和模块日志。 ## 快速使用 #### conf.toml ```toml http_addr = ":8081" grpc_addr = ":8082" ``` #### 启用http(gin) 和 grpc服务 ``` golang package main import ( "context" "net/http" "github.com/gin-gonic/gin" app "github.com/webws/go-moda" "github.com/webws/go-moda/config" pbexample "github.com/webws/go-moda/example/pb/example" "github.com/webws/go-moda/logger" modagrpc "github.com/webws/go-moda/transport/grpc" modahttp "github.com/webws/go-moda/transport/http" ) var ServerName string type Config struct { HttpAddr string `json:"http_addr" toml:"http_addr"` GrpcAddr string `json:"grpc_addr" toml:"grpc_addr"` } func main() { conf := &Config{} if err := config.NewConfigWithFile("./conf.toml").Load(conf); err != nil { logger.Fatalw("NewConfigWithFile fail", "err", err) } // http server gin, httpSrv := modahttp.NewGinHttpServer( modahttp.WithAddress(conf.HttpAddr), ) registerHttp(gin) // grpc server grpcSrv := modagrpc.NewServer( modagrpc.WithServerAddress(conf.GrpcAddr), ) grecExample := &ExampleServer{} pbexample.RegisterExampleServiceServer(grpcSrv, grecExample) // app run a := app.New( app.Server(httpSrv, grpcSrv), app.Name(ServerName), ) if err := a.Run(); err != nil { logger.Fatalw("app run error", "err", err) } } func registerHttp(g *gin.Engine) { g.GET("/helloworld", func(c *gin.Context) { logger.Debugw("Hello World") c.JSON(http.StatusOK, http.StatusText(http.StatusOK)) }) } type ExampleServer struct { pbexample.UnimplementedExampleServiceServer } func (s *ExampleServer) SayHello(ctx context.Context, req *pbexample.HelloRequest) (*pbexample.HelloResponse, error) { return &pbexample.HelloResponse{Message: "Hello " + req.Name}, nil } ``` #### 运行 ```shell go run ./ -c ./conf.toml `````` * 请求 http url http://localhost:8081/helloworld * grpc 服务 使用 gRPC 客户端调用 SayHello 方法 其他服务启用示例 1. echo http :[example_echo](https://github.com/webws/go-moda/tree/main/example/echohttp) 2. net http :[example_echo](https://github.com/webws/go-moda/blob/main/example/nethttp) 3. grpc [example_grpc](https://github.com/webws/go-moda/tree/main/example/grpc) ## pprof 性能分析 启动服务默认开启 pprof 性能分析,浏览器打开 http://localhost:8081/debug/ 查看 ![](https://qiniu.taoluyuan.com/2023/blog20230903093830.png?imageMogr2/auto-orient/thumbnail/!70p/blur/9x0/quality/75) 可视化分析 gouroutine ```shell go tool pprof http://localhost:8081/debug/pprof/goroutine (pprof) web ``` 可能提示 需要先安装 graphviz, mac 下可以使用 brew 安装 ```shell brew install graphviz ``` ![](https://qiniu.taoluyuan.com/2023/blog20230903094758.png?imageMogr2/auto-orient/thumbnail/!70p/blur/9x0/quality/75) ## tracing 链路追踪 * 使用 opentelemetry 实现微服务链路追踪,目前 exporter 支持 jaeger * 示例集成了docker 环境,支持 make deploy 同时启动 jaeger,api1,api2,api3,grpc 服务 * 详细示例请看:[tracing_example](https://github.com/webws/go-moda/tree/main/example/tracing/moda_tracing) 1. 初始化 jaeger tracing ``` import "github.com/webws/go-moda/tracing" func main(){ //... shutdown, err := tracing.InitJaegerProvider(conf.JaegerUrl, "grpc-server") if err != nil { panic(err) } defer shutdown(context.Background()) //... } ``` 2. 在代码主动tracing start ``` ctx, span := tracing.Start(c.Request().Context(), "api1") defer span.End() ``` 3. 服务之间调用 产生的链路 * server端: 增加 WithTracing 即可 ``` //... gin, httpSrv := modahttp.NewGinHttpServer( modahttp.WithAddress(conf.HttpAddr), modahttp.WithTracing(true), ) ``` * client端: 封装了 CallAPI 方法, 已将span ctx 信息注入到请求头 ``` // ... _, err := modahttp.CallAPI(ctx, url, "POST", nil) ``` ![](https://qiniu.taoluyuan.com/2023/blog20230903094038.png?imageMogr2/auto-orient/thumbnail/!70p/blur/9x0/quality/75)

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1591 次点击  ∙  1 赞  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传