Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > golang grpc http开发框架

golang通用的grpc http基础开发框架使用快速入门

作者:莫大

这篇文章主要为大家介绍了golang通用的grpc http基础开发框架使用快速入门详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

go-moda

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

仓库地址: [https://github.com/webws/go-moda]

仓库一直在更新,欢迎大家吐槽和指点

特性

logger: 日志系统模块,基于 Zap,并支持全局日志和模块日志。

快速使用

conf.toml

http_addr = ":8081"
grpc_addr = ":8082"

启用http(gin) 和 grpc服务

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
}

运行

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/ 查看

可视化分析 gouroutine

go tool pprof 

http://localhost:8081/debug/pprof/goroutine

(pprof) web

可能提示 需要先安装 graphviz, mac 下可以使用 brew 安装

brew install graphviz

## tracing 链路追踪

* 使用 opentelemetry 实现微服务链路追踪,目前 exporter 支持 jaeger 

* 示例集成了docker 环境,支持 make deploy 同时启动 jaeger,api1,api2,api3,grpc 服务

* 详细示例请看:[tracing_example]

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)

以上就是golang通用的grpc http基础开发框架使用快速入门的详细内容,更多关于golang grpc http开发框架的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文