老师请问如果我想把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部分。

  1. mux := runtime.NewServeMux(runtime.WithMarshalerOption(

  2. runtime.MIMEWildcard, &runtime.JSONPb{

  3. EnumsAsInts: true,

  4. OrigName:    true,

  5. },

  6. ))

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的请求进行路由。

0

0 学习 · 1399 问题

查看课程