1. gRPC四种模式服务

以下案例演示,服务端用微软提供的模板创建,客户端使用Winform程序演示,基于.NetCore3.1版本。接下来就直接搞重点;这里就模仿一个学生服务,包含增、删、改、查方法,下面是用到的proto文件的全部内容,后续的实例就单独标出重点即可。

syntax="proto3";//指定版本 //定义命名空间 optioncsharp_namespace="Grpc.Server.Demo"; //指定包名,避免冲突 packageuser; //定义Student的message类型 messageStudent{ stringUserName=1; int32Age=2; stringaddr=3; } //公共返回类型 messageCommonResponse{ int32code=1; stringmsg=2; } //添加学生时传递的类型 messageAddStudentRequest{ Studentstudent=1; } //查询学生时传递的类型 messageQueryStudentRequest { stringUserName=1; } //查询全部学生,没有条件,但也需要一个空的message messageQueryAllStudentRequest { } //上传图片 messageUploadImgRequest{ bytesdata=1; } messageStudentResponse{ Studentstudent=1; } messageTokenRequest{ stringUserName=1; stringUserPwd=2; } messageTokenResponse{ stringToken=1; } //约定需要提供的服务方法 serviceStudentService{ rpcGetToken(TokenRequest)returns(TokenResponse); //简单模式,查询 rpcGetStudentByUserName(QueryStudentRequest)returns(StudentResponse); //服务端流模式 rpcGetAllStudent(QueryAllStudentRequest)returns(streamStudentResponse); //客户端流模式 rpcUploadImg(streamUploadImgRequest)returns(CommonResponse); //双向流模式 rpcAddManyStudents(streamAddStudentRequest)returns(streamStudentResponse); }

整体的项目结构如下:

grpc是基于什么协议(认证和授权实战演示)(1)

1.1 简单模式

和现在http方式类似:客户端发出单个请求,服务端返回单个响应。

关于简单模式,请求参数和返回参数都是一般message类型,在上一篇中演示的模式就是简单模式,归纳如下步骤;

服务端

客户端

使用Winform的形式举例演示客户端,在创建项目时,直接选择Winform模板即可,简单设计了一下界面,如下:

grpc是基于什么协议(认证和授权实战演示)(2)

1.2 服务端流模式

客户端发起一个请求到服务端,服务端返回连续的数据流;一般用在服务端分批返回数据的情况,客户端能持续接收服务端的数据。

服务端

  1. 就算请求不需要参数,也需要一个空的message类型;
  2. 这里返回的数据可以分批发送,复用连接,提高效率;

客户端

1.3 客户端流模式

客户端将连续的数据流发送到服务端,服务端返回一个响应;用在客户端发送多次请求到服务端情况,如分段上传图片场景等。

服务端

客户端

1.4 双向流模式

双向流就是服务端流和客户端流的整合,请求和返回都可以通过流的方式交互。

服务端

客户端

gRPC的四种模式就简单介绍这么多,小伙伴可以根据提供的思路应用到项目中。在演示案例中是不是感受到gRPC相比WebApi有更多的选择和优势,另外通过服务端的控制台可以看到,交互使用的是HTTP/2协议,小伙伴感兴趣可以去了解一下:

grpc是基于什么协议(认证和授权实战演示)(3)

2. gRPC集成JWT认证

和WebAPI一样,如果提供的服务接口“裸奔”,那么风险是很大的;关于这点,之前针对WebApi认证和授权分享了两篇文章,传送门在这(跟我一起学.NetCore之WebApi接口裸奔有风险(Jwt)、跟我一起学.NetCore之熟悉的接口权限验证不能少(Jwt))。

其实gRPC集成JWT做认证授权,和原来WebApi集成方式差不多一样,太细节的描述小伙伴可以查阅上面两篇文章;接下来的需求目的就是把上面提供的服务保护起来,只有认证通过才能调用。

2.1 引入Jwt相关包,注册服务,中间件管道增加认证流程2.2 服务端增加获取Token的服务方法2.3 客户端获取Token并使用

到这里,gRPC集成Jwt做认证的全部演示就完成了,除了调用方式和客户端传递Token的方式不一样,其他的都和WebApi使用方式一样。

重点:这里gRPC可以通过Metadata进行传递数据,和之前WebApi的请求头很像,可以根据自己需求进行任意封装传递。

3. gRPC权限验证思路提一下

上面只是进行了认证,还没有对服务方法权限进行管控,只要认证通过就能调用全部服务方法;在实际应用场景中更希望的是分配啥权限才能调用对应的服务,所以权限管控少不了。

gRPC的权限管控和WebApi的管控方式一样,同样可以使用策略的方式进行权限验证。gRPC同样能获取到请求方法的Url(包名.服务名.方法名),这样就可以以这种规则进行权限配置,然后验证即可。详细步骤可以参考跟我一起学.NetCore之熟悉的接口权限验证不能少(Jwt),接下来就来说说主要步骤:

3.1 使用动态权限策略形式

源代码地址:https://gitee.com/CodeZoe/g-rpc/tree/master

,