在网上看到了一种对gRPC的用法,这里分享一下
这篇文章最初发表在CoreOS博客上,这里我来简单说明一下,最下方有链接
1、定义服务
首先,让我们在名为EchoMessage的protobuf消息中定义名为EchoService的参数,该消息包含一个名为value的字段。我们将在一个名为protobuf的“.proto”文件中定义此消息service.proto
。这是我们的EchoMessage:
message EchoMessage {
string value = 1;
}
在同一个.proto文件中,我们定义了一个gRPC服务,它接受这个数据结构并返回它:
service EchoService {
rpc Echo(EchoMessage) returns (EchoMessage) {
}
}
2、添加网关
如果现在进行GO语言服务类的编译可以生成GO语言的服务存根,以及其他语言的客户端,但是并不能想暴露了REST接口那样进行可以直接通过URL进行服务访问,这不是我们想要的,我们可以进行改动,使gRPC中的服务可以像REST服务那样进行直接访问,加一个gRPC网关。
如下
service EchoService {
rpc Echo(EchoMessage) returns (EchoMessage) {
option (google.api.http) = {
post: "/v1/echo"
body: "*"
};
}
}
这种情况下,如果生成proto文件,可以通过HTTP直接访问gRPC服务,例如:
curl -X POST -k https://localhost:10000/v1/echo -d '{"value": "CoreOS is hiring!"}'
为了将所有这些组合在一起,echo服务创建Go http.Handler
以检测协议是否为HTTP / 2且Content-Type是“application / grpc”,并将此类请求发送到gRPC服务器。其他所有内容都将路由到REST网关。代码看起来像这样:
if r.ProtoMajor == 2 && strings.Contains(r.Header.Get("Content-Type"), "application/grpc") {
grpcServer.ServeHTTP(w, r)
} else {
otherHandler.ServeHTTP(w, r)
}
要试用它,您只需要一个有效的Go 1.6开发环境和以下简单命令:
$ go get -u github.com/philips/grpc-gateway-example
$ grpc-gateway-example serve
在服务器运行的情况下,您可以尝试HTTP 1.1和gRPC接口上的请求:
grpc-gateway-example echo Take a REST from REST with gRPC
curl -X POST -k https://localhost:10000/v1/echo -d '{"value": "CoreOS is hiring!"}'
整体流程图如下:
[外链图片转存失败(img-ZpuO70Nd-1564107671529)(C:\Users\MIM\Desktop\go笔记\go语言基础数据结构与知识点\picture\Snipaste_2019-07-26_10-16-25.png)]
以上内容均转载于下面链接:
以上内容均转载于链接:https://grpc.io/blog/coreos/
链接内容更丰富