老师请问如果我想把grpc 集成到gin框架中最佳实践应该是什么样呢?
来源:2-2 有关GRPC及GRPC Gateway版本的更新
ktsleep
2021-01-02 02:44:01
如果用了gin的话还需要gateway? 如果不需要的话gin能达到gateway一样的效果吗?或者是有其他方案?
1回答
ccmouse
2021-01-03
有很多种方法。
方法一:在gin服务器中处理grpc。用grpc gateway处理grpc的转发,用gin处理非grpc部分。
mux := runtime.NewServeMux(runtime.WithMarshalerOption(
runtime.MIMEWildcard, &runtime.JSONPb{
EnumsAsInts: true,
OrigName: true,
},
))
https://git.imooc.com/class-108/coolcar/src/master/server/gateway/main.go#L24
此处的mux类型其实实现了http.Handler接口,它可以作为一个http handler像其他handler那样,用gin.WrapH函数包装,挂在gin engine下面:
r := gin.New()
r.GET("/hello", func(c *gin.Context) {
c.String(http.StatusOK, "hello")
})
r.POST("/*method", gin.WrapH(mux))
r.Run(*addr)
这里r.POST代表我们处理所有POST的请求,请求的路径放在“method”参数里。(虽然我们不需要用这个method参数),由grpc gateway的这个mux来处理。
当然如果有其他POST请求,我们注意他们的请求路径不要重复了。
方法二:采用微服务思想,我们普通的http服务用gin来做,grpc gateway只做grpc gateway,这样我们的系统就有了两个http服务器。我们再在他们的前端部署一个负载均衡,或是叫做ingress的模块,由它负责根据请求路径进行转发。我的课程中将会采用这种方法,来对websocket和grpc gateway的请求进行路由。
相似问题