gRPC扫盲篇
Posted 程序猿大鹏
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gRPC扫盲篇相关的知识,希望对你有一定的参考价值。
前言
终于要和2020年说byebye了,这一年自己经历了太多太多了。基本上是迷茫的度过了这一年,终于在年底进了一家纯互联网公司。
之前一直是在传统IT公司,使用的技术栈很有限,用的最新的技术也只是在Windows服务器上部署.NetCore3.1。什么分布式、微服务都只是出现在别人的博客里。这次进入到这家互联网公司也是因为目前公司整体技术栈在长沙来说算比较先进的,同时数据量、请求量都比以前的公司高了几个等级,能学习的东西太多了。比如今天要说的gRPC就是我最近项目中使用的一个技术栈,以前只是听说过,从没有在实际项目上使用过。这篇博客权当自己的笔记,后续也会不断完善~
gRPC简介
gRPC 是一个高性能、开源、通用的RPC框架,由Google推出,基于HTTP/2协议标准设计开发,默认采用Protocol Buffers数据序列化协议,支持多种开发语言。gRPC提供了一种简单的方法来精确的定义服务,并且为客户端和服务端自动生成可靠的功能库。
主要特点
标准化的契约
gRPC使用ProtoBuf来定义服务,ProtoBuf是由Google开发的一种数据序列化协议(类似于XML、JSON、hessian)。ProtoBuf能够将数据进行序列化,并广泛应用在数据存储、通信协议等方面。强大的生态
gRPC支持多种语言,天然为分布式架构提供远程调用基础。HTTP/2
gRPC使用HTTP/2作为底层网络通讯协议,提高了网络传输效率。
关键字列表
名称 | 说明 | 是否可为空 |
---|---|---|
syntax | 指定gRPC文件的协议版本,约定值一般为:proto3 、proto2 | 否 |
option csharp_namespace | 指定gRPC文件对应的C#文件命名空间,该关键字与package不能同时为空 | 是 |
package | 申明gRPC文件包名,避免多个gRPC文件命名冲突,如关键字option csharp_namespace为空则proto文件映射的C#类的命名空间取此关键字值 | 是 |
service | 申明服务,可以理解为C#中的class | 否 |
message | 消息对象,可以理解为C#或java里面的方法入参或出参,同时允许message嵌套,嵌套后的message作为父级message的字段。在外部引用则需要先申明父级message名称,如Parent.Type 。其中Parent表示父message | |
enum | 枚举, 消息内可以包含枚举,用法与C#、java类似,区别是每个enum定义的第一个元素值必须是0,且可以给不同的enum元素定义相同的值(互为别名) | 是 |
import | 导入关键字,可以导入其他.proto文件内的定义 | 是 |
.proto文件数据类型与其他开发语言的数据类型对比
.proto | C++ | Java | Python | Go | Ruby | C# |
---|---|---|---|---|---|---|
double | double | double | float | float64 | Float | double |
float | float | float | float | float32 | Float | float |
int32 | int32 | int | int | int32 | Fixnum or Bignum | int |
int64 | int64 | long | long | int64 | Bignum | long |
uint32 | uint32 | int | int | int32 | Fixnum | unit |
uint64 | uint64 | long | long | uint64 | Bignum | long |
sint32 | int32 | int | intj | int32 | Fixnum | int |
sint64 | int64 | long | long | int64 | Bignum | long |
fixed32 | uint32 | int | int | uint32 | Fixnum | uint |
fixed64 | uint64 | long | long | uint64 | Bignum | ulong |
sfixed32 | int32 | int | int | int32 | Fixnum | int |
sfixed64 | int64 | long | long | int64 | Bignum | long |
bool | bool | boolean | boolean | bool | TrueClass | bool |
string | string | String | str | string | String(UTF-8) | string |
bytes | string | ByteString | str | []byte | String(ASCII-8BIT) | ByteString |
基本规范
描述文件以.proto为文件后缀
Message命名采取驼峰命名方法,字段采取小写字母加下划线分隔
Enums类型名采用驼峰命名方式,字段命名采用大写字母加下划线分隔方式
Service名称与RPC方法名统一采用驼峰式命名
.NET Core使用gRPC常见错误
问题1:
Status(StatusCode="Unimplemented", Detail="Service is unimplemented.")
服务端未注册,需要在Startup类的Configure方法注册
问题2:
Status(StatusCode="Unavailable", Detail="Error starting gRPC call. HttpRequestException: An error occurred while sending the request. IOException: The response ended prematurely.",
1、 没有忽略安全证书同时未允许启用SSL
2、 在Properties\launchSettings.json内更改了原有的applicationUrl为http方式 (默认为https)
解决方法:
问题1、在Startup类的Configure方法注册gRPC服务,如下
app.UseEndpoints(endpoints =>
{
endpoints.MapGrpcService<GreeterService>();
// 注册新建的gRPC服务 UserService
endpoints.MapGrpcService<UserService>();
endpoints.MapGet("/", async context =>
{
await context.Response.WriteAsync("Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909");
});
});
dotnet dev-certs https --trus
参考
https://www.bookstack.cn/read/go-grpc/summary.md
以上是关于gRPC扫盲篇的主要内容,如果未能解决你的问题,请参考以下文章