grpc提供http访问方式
0x00最近系统在从c++迁移到go,之前使用brpc,也需要转移到grpc,但是grpc提供的接口服务原生无法被http访问到,这对我们调试来说也很麻烦,所以需要让grpc跟brpc一样,http也能访问rpc接口0x01grpc-gateway项目:该项目是在grpc外面加一层反向代理,由代理服务器转发json格式,转变成protobuf格式来访问grpc服务,官方解释图如下:...
·
0x00
最近系统在从c++
迁移到go
,之前使用brpc
,也需要转移到grpc
,但是grpc
提供的接口服务原生无法被http
访问到,这对我们调试来说也很麻烦,所以需要让grpc
跟brpc
一样,http
也能访问rpc
接口
0x01
grpc-gateway
项目:
该项目是在grpc
外面加一层反向代理,由代理服务器转发json
格式,转变成protobuf
格式来访问grpc
服务,官方解释图如下:
你的grpc
服务按照正常的方式启动就行了,然后根据proto
文件生成gateway
专有的gw.pb.go
文件,然后我们重新启动一个gateway
服务,有自己独立的端口,然后有一个入口,入口就是你grpc
提供服务的ip
和端口。
实验
启动grpc
服务
grpc
提供服务的端口为7777
启动代理服务
package main
import (
"flag"
"github.com/golang/glog"
"github.com/grpc-ecosystem/grpc-gateway/runtime"
"golang.org/x/net/context"
"google.golang.org/grpc"
"net/http"
gw "data/proto"
)
var (
echoEndPoint = flag.String("echo_endpoint", "localhost:7777", "endpoint of YourService")
)
func run() error {
ctx := context.Background()
ctx, cancel := context.WithCancel(ctx)
defer cancel()
mux := runtime.NewServeMux()
opts := []grpc.DialOption{grpc.WithInsecure()}
err := gw.RegisterGreeterHandlerFromEndpoint(ctx, mux, *echoEndPoint, opts)
if err != nil {
return err
}
return http.ListenAndServe(":8989", mux)
}
func main() {
flag.Parse()
defer glog.Flush()
if err := run(); err != nil {
glog.Fatal(err)
}
}
gateway
的端口为8989
,endpoint
指向了grpc
服务的端口7777
。
postman访问
访问成功
缺点
- 需要开2个端口
- 写多余的代码
理想情况下应该有个插件自己把http
请求转换成proto
的方式,犹如brpc
一样
解决方法
后来发现https的方式是可以解决上面的问题,grpc和https端口在一起,也不用起两个服务。
20190621更新
同事用https://github.com/soheilhy/cmux把多个协议的服务都绑定到一起了
更多推荐
已为社区贡献11条内容
所有评论(0)