在网上看到了一种对gRPC的用法,这里分享一下

在网上看到了一种对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/
链接内容更丰富

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值