什么是GRPC

gRPC是一种与语言无关的高性能远程过程调用 (RPC) 框架。gRPC 的主要好处是:

  • 现代、高性能、轻量级的 RPC 框架。
  • 契约优先的 API 开发,默认使用协议缓冲区,与语言无关的实现。
  • 可用于多种语言的工具来生成强类型服务器和客户端。
  • 支持客户端、服务器和双向流调用。
  • 通过 Protobuf 二进制序列化减少网络使用。

这些优势使 gRPC 非常适合:

  • 效率至关重要的轻量级微服务。
  • 需要多种语言进行开发的多语言系统。
  • 需要处理流请求或响应的点对点实时服务。

什么是grpc-json转码器

grpc-json转码器是一个过滤器,它允许 RESTful JSON API 客户端通过 HTTP 向 Envoy 发送请求并代理到 gRPC 服务。下面我们来通过Envoy的grpc-json转码器实现grpc服务的代理

创建grpc服务

.NET中的grpc可以参考官方文档来实现。我们通过vs创建两个默认的grpc server:GrpcService1与GrpcService2

修改GrpcService1的默认端口为6001

        public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseUrls("http://*:6001").UseStartup<Startup>();
});

修改GrpcService2的默认端口为6002

        public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseUrls("http://*:6002").UseStartup<Startup>();
});

修改GrpcService1的GreeterService.SayHello方法

        public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
{
return Task.FromResult(new HelloReply
{
Message = "Hello 1 " + request.Name
});
}

修改GrpcService2的GreeterService.SayHello方法

        public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
{
return Task.FromResult(new HelloReply
{
Message = "Hello 2 " + request.Name
});
}

下面我们启动两个GrpcService

Grpc服务描述符

Envoy必须知道GRPC服务的proto描述符才能转码,通过以下链接下载proto工具
https://github.com/protocolbuffers/protobuf/releases

通过以下命令生成描述符

protoc.exe --descriptor_set_out=C:\greet.pb --include_imports C:\greet.proto  --proto_path=C://

配置Envoy

Grpc相关的配置可以参考官方文档,其中需要注意的是我们需要将dns_type改为static,因为我们grpc用的是ip而不是域名;并且需要指定auto_mapping: true,这样就可以在我们没有设置http method的情况下路由到我们的grpc服务中的方法。具体配置如下

admin:
address:
socket_address: {address: 0.0.0.0, port_value: 9901} static_resources:
listeners:
- name: listener1
address:
socket_address: {address: 0.0.0.0, port_value: 10000}
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
stat_prefix: grpc_json
codec_type: AUTO
route_config:
name: local_route
virtual_hosts:
- name: local_service
domains: ["*"]
routes:
- match: {prefix: "/greet.Greeter"}
route: {cluster: grpc, timeout: 60s}
http_filters:
- name: envoy.filters.http.grpc_json_transcoder
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.grpc_json_transcoder.v3.GrpcJsonTranscoder
proto_descriptor: "/etc/envoy/greet.pb"
services: ["greet.Greeter"]
print_options:
add_whitespace: true
always_print_primitive_fields: true
always_print_enums_as_ints: false
preserve_proto_field_names: false
auto_mapping: true

- name: envoy.filters.http.router clusters:
- name: grpc
type: static
lb_policy: ROUND_ROBIN
dns_lookup_family: V4_ONLY
typed_extension_protocol_options:
envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
"@type": type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
explicit_http_config:
http2_protocol_options: {}
load_assignment:
cluster_name: grpc
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: 192.168.43.94
port_value: 6001
- endpoint:
address:
socket_address:
address: 192.168.43.94
port_value: 6002

启动Envoy

需要主要的是,我们需要将envoy.yaml和描述文件都映射到我们的容器内

docker run --rm -it -p 9902:9902 -p 10000:10000 -v D:/gateway/envoy/config/grpc/:/etc/envoy/ -v D:/gateway/envoy/logs:/logs envoyproxy/envoy-dev  -c /etc/envoy/envoy.yaml

测试

转码器过滤器处理的请求路径规则是/<package>.<service>/<method>,另外我们需要使用POST方法。

通过postman调用接口来看,我们成功利用GRPC-Json转码器实现了grpc的代理。

最新文章

  1. 【Java每日一题】20161104
  2. threading模块
  3. sql修改表结构、临时表应用
  4. hdu 2460
  5. hdu2795Billboard(线段树)
  6. entity framework 中一些常用的函数 转自http://www.cnblogs.com/williamzhu/
  7. PHP上传文件超过了最大文件大小限制导致无法上传成功
  8. BigPipe设计原理
  9. 虚拟机网络配置详解(NAT、桥接、Hostonly)
  10. nginx取结构体地址
  11. 《深入理解Java虚拟机》——垃圾收集器与内存分配策略
  12. [CSDN_Markdown] 使用LaTeX写矩阵
  13. finereport报表--动态格间运算 一
  14. node,npm,vue的全局升级
  15. C/C++ 控制台窗口暂停
  16. ElasticSearch(七) Elasticsearch在Centos下搭建可视化服务
  17. 微软官方的Excel android 移动版的折腾
  18. [J2EE]struts+ejb笔记
  19. Git 本地操作
  20. 开发vue全局插件的4种方式

热门文章

  1. scrum项目冲刺_day07总结
  2. PHP的bz2压缩扩展工具
  3. 如何解决SVN Upgrade working copy问题
  4. whistle浏览器抓包(以火狐浏览器为例)
  5. NetCore5实现https请求
  6. P3313-[SDOI2014]旅行【树链剖分,线段树】
  7. 用Fiddler抓不到https的包?因为你姿势不对!往这看!
  8. java统一返回标准类型
  9. Kubernetes全栈架构师(资源调度下)--学习笔记
  10. 深入剖析 Spring WebFlux