gRPC趁现在还没大火,抢先了解一下

系统分布式已经成为程序员的家常,将大型单体划分为相对简单的小模块,分散系统能力,提升系统扩展性、功能模块复用性等;各功能模块之间肯定会有很多数据共享和交互的应用场景,那就避免不了各模块之间的通信;目前用的比较多的方式是HTTP(Restful API)接口、消息队列等,而HTTP(Restful API)接口应该是目前应用比较广泛的,相对之前的webservice和WCF都显得比较轻量级,而且实用;

随着微服务的盛行,对服务间的通信要求也越来越高,比如传输方式、传输速率、传输内容大小等,而HTTP(Restful API)方式有较重的头信息、无状态、不能复用连接等缺点,所以优化是早晚的事;那么gRPC的出现就显得情有可原啦(gRPC不局限于服务间通信,只要符合Server/Client场景就可以),所以接下来咱们一起来探究学习一下。

正文 1. 认识一下gRPC

gRPC 由 google 开发,最前面的g就代表google。进入gRPC官网,一句话描述了gRPC的主要特色,先上张图:

gRPC趁现在还没大火,抢先了解一下

A high performance, open source universal RPC framework

翻译:一个高性能开源通用RPC框架

高性能:gRPC遵循HTTP/2协议,解决并优化了HTTP1.1的一些缺陷;默认使用谷歌开源的 protocol buffers(类似于XML、JSON的数据序列化结构协议),传输速率、解析速度都很快、压缩率高,性能整体都比XML和JSON好(后续专门写个程序来比较比较);

开源:源码地址请进传送门;

通用:各种流行语言(C++、C#、Java、Go、Python等)都能用,轻松实现跨语言通信;本身不限于任何平台。

RPC:远程过程调用(Remote Procedure Call),通俗一点理解,就是分布式中各服务之间调用的一种技术。

总而言之,gRPC是一个现代的开源高性能远程过程调用(RPC)框架,可以在任何环境中运行。它可以有效地连接数据中心内和跨数据中心的服务,并支持可插拔的负载均衡、跟踪、健康检查和身份认证(后续会一一举例演示)。

算啦,估计到这有些小伙伴还是有点懵圈(语言组织能力还有待提高),那就先将其理解为一个类似于WebAPI的调用框架,只是性能更高,使用更简单,就像调用本地方法一样;它使客户端和服务器应用程序能够透明地通信,隐藏了远程调用的细节,大概过程如下:

gRPC趁现在还没大火,抢先了解一下

上图简析:各语言之间可以互相调用,只要客户端按照约定(Protocol Buffer)传递对应的请求参数,调用服务端对应的方法,最后就会返回约定好(Protocol Buffer)的响应数据。

不说那么多啦,直接开干吧,一边撸码一边说理论。

2. 初体验 gRPC 2.1 从0开始写服务端

创建一个空的Web项目(基于.NetCore3.1),引入包Grpc.AspNetCore

gRPC趁现在还没大火,抢先了解一下

编写proto文件(重点),因为gRPC是使用protocol Buffer作为接口定义语言,内容包含以下两部分:

传递的消息:请求和响应时的数据信息,类似于现在用的DTO类。

gRPC服务的定义:定义gRPC服务方法,可以理解为现在写的Restful 接口。

这里模拟用户维护的场景,包含增、删、改、查方法,这里新建protos目录专门用来存放proto文件,user.proto内容如下:

// 使用的是proto3版本 syntax = "proto3"; // 定义命名空间,后续生成代码时就会生成对应的命名空间 option csharp_namespace = "gRPC.Demo.Server.protos"; /* 每一句需要用分号结尾 message 用来定义请求和返回数据格式 tag message后面的值数字代表是字段的标识(tag),不是赋值, */ // 新增用户时需要传递数据消息, 可理解为一个类 message AddUserReuqest{ string name=1; int32 age=2; bool isBoy=3; } // 新增时返回的消息格式 message ResultResponse { int32 code=1; string msg =2; } //传递的查询条件信息格式,可理解为平时传入的查询条件对象 message QueryUserReuqest{ string name=1; } //查询返回的用户信息格式,可理解为返回的类 message UserInfoResponse { string name=1; int32 age=2; string gender=3; } // service 用标识定义服务的,里面写对应的方法 service UserService{ // 新增用户 rpc AddUser(AddUserReuqest) returns (ResultResponse); // 查询用户 rpc GetAllUser(QueryUserReuqest) returns (UserInfoResponse); }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwfsds.html