自己做网站 怎么赚钱,设计公司logo制作,一键生成网站的软件,wordpress去掉category前言上一篇对gRPC进行简单介绍#xff0c;并通过示例体验了一下开发过程。接下来说说实际开发常用功能#xff0c;如#xff1a;gRPC的四种模式、gRPC集成JWT做认证和授权等。正文1. gRPC四种模式服务以下案例演示#xff0c;服务端用微软提供的模板创建#xff0c;客户端… 前言上一篇对gRPC进行简单介绍并通过示例体验了一下开发过程。接下来说说实际开发常用功能如gRPC的四种模式、gRPC集成JWT做认证和授权等。正文1. gRPC四种模式服务以下案例演示服务端用微软提供的模板创建客户端使用Winform程序演示基于.NetCore3.1版本。具体创建步骤在上一篇说的很细了(gRPC趁现在还没大火抢先了解一下)接下来就直接搞重点这里就模仿一个学生服务包含增、删、改、查方法下面是用到的proto文件的全部内容后续的实例就单独标出重点即可。syntax proto3; //指定版本
// 定义命名空间
option csharp_namespace Grpc.Server.Demo;
// 指定包名避免冲突
package user;
// 定义Student 的 message类型
message Student {string UserName 1;int32 Age2;string addr 3;
}
// 公共返回类型
message CommonResponse{int32 code 1;string msg2;
}
// 添加学生时传递的类型
message AddStudentRequest{Student student1;}
// 查询学生时传递的类型
message QueryStudentRequest
{string UserName1;
}
// 查询全部学生没有条件但也需要一个空的message
message QueryAllStudentRequest
{
}
// 上传图片
message UploadImgRequest{bytes data 1;
}
message StudentResponse {Student student 1;
}
message TokenRequest{string UserName1;string UserPwd2;
}
message TokenResponse{string Token 1;
}
// 约定需要提供的服务方法
service StudentService{rpc GetToken(TokenRequest) returns (TokenResponse);// 简单模式查询rpc GetStudentByUserName(QueryStudentRequest) returns (StudentResponse);// 服务端流模式rpc GetAllStudent(QueryAllStudentRequest) returns (stream StudentResponse);// 客户端流模式rpc UploadImg(stream UploadImgRequest) returns (CommonResponse);// 双向流模式rpc AddManyStudents(stream AddStudentRequest) returns (stream StudentResponse);
}
整体的项目结构如下1.1 简单模式和现在http方式类似客户端发出单个请求服务端返回单个响应。关于简单模式请求参数和返回参数都是一般message类型在上一篇中演示的模式就是简单模式归纳如下步骤服务端增加一个student.proto文件在文件中定义服务编译自动生成对应代码定义服务格式rpc 方法名(请求类型) returns (返回类型);新建StudentDemoService类继承生成的代码类开始写业务在Startup文件中将服务方法暴露出去(这里写一次即可后续就不重复说了)到这服务端就写完啦其实和原来写WebApi接口一样便捷。客户端使用Winform的形式举例演示客户端在创建项目时直接选择Winform模板即可简单设计了一下界面如下引入对应的包将服务端的proto文件都拷过来(服务端和客户端proto文件一致)如果编译没自动生成代码需要检查是否引入对应的包是否设置了student.proto文件的属性如果这块还不了解点这里(gRPC趁现在还没大火抢先了解一下)先熟悉以下开发过程。在winform设计模式下双击按钮增加点击事件开始写业务逻辑运行看效果先运行服务端在运行客户端输入条件点击简单模式按钮效果如下这里查不到数据客户端程序报异常(别骂我代码写的不严谨小伙伴处理一下就好啦)1.2 服务端流模式客户端发起一个请求到服务端服务端返回连续的数据流一般用在服务端分批返回数据的情况客户端能持续接收服务端的数据。服务端在student.proto文件中增加服务编译自动生成代码定义服务格式rpc 方法名(请求类型) returns (stream 返回类型);在StudentDemoService类中重写方法写业务逻辑代码注意点就算请求不需要参数也需要一个空的message类型这里返回的数据可以分批发送复用连接提高效率客户端student.proto文件保证和服务端一样同步添加相应的内容这里就不截图了小伙伴可以通过拷贝或是引用的方式保证文件一样就行啦在winform设计模式下双击服务端流模式按钮增加点击事件开始写业务逻辑运行看效果先运行服务端在运行客户端点击服务端流模式按钮效果如下1.3 客户端流模式客户端将连续的数据流发送到服务端服务端返回一个响应用在客户端发送多次请求到服务端情况如分段上传图片场景等。服务端在student.proto文件中增加服务编译自动生成代码定义服务格式rpc 方法名(stream 请求类型) returns (返回类型);在StudentDemoService类中重写方法写业务逻辑代码客户端student.proto文件保证和服务端一样同步添加相应的内容这里就不截图了小伙伴可以通过拷贝或是引用的方式保证文件一样就行啦。在winform设计模式下双击客户端流模式按钮增加点击事件开始写业务逻辑。代码稍多不截图了不然图片大要失真直接上代码吧。private async void btn_client_Click(object sender, EventArgs e)
{// 用于存放选择的文件路径string filePath string.Empty;// 打开文件选择对话框if (this.openFileDialog1.ShowDialog() DialogResult.OK){filePath this.openFileDialog1.FileName;}if(string.IsNullOrEmpty(filePath)){this.txt_result.Text 请选择文件;return;}//1、创建grpc客户端using var channel GrpcChannel.ForAddress(https://localhost:5001);var grpcClient new StudentService.StudentServiceClient(channel);//2、读取选择的文件FileStream fileStream File.OpenRead(filePath);//3、通过客户端请求流将文件流发送的服务端using var call grpcClient.UploadImg();var clientStream call.RequestStream;//4、循环发送指定发送完文件while(true){// 一次最多发送1024字节byte[] buffer new byte[1024];int nRead await fileStream.ReadAsync(buffer, 0, buffer.Length);// 直到读不到数据为止即文件已经发送完成即退出发送if(nRead0){break;}// 5、将每次读取到的文件流通过客户端流发送到服务端await clientStream.WriteAsync(new UploadImgRequest { Data ByteString.CopyFrom(buffer) });}// 6、发送完成之后告诉服务端发送完成await clientStream.CompleteAsync();// 7、接收返回结果并显示在文本框中var res await call.ResponseAsync;this.txt_result.Text $上传返回Code:{res.Code},Msg:{res.Msg};
}
运行看效果先运行服务端在运行客户端点击客户端流模式按钮效果如下在弹框中选择一个jpg的图片(因为方便演示服务端固定写为jpg了)如下选择完图片就开始上传了如下是不是已经感觉到gRPC的优点了数据传输量及方式有没有先进一点。1.4 双向流模式双向流就是服务端流和客户端流的整合请求和返回都可以通过流的方式交互。服务端在student.proto文件中增加服务编译自动生成代码定义服务格式rpc 方法名(stream 请求类型) returns (stream 返回类型);在StudentDemoService类中重写方法写业务逻辑代码客户端student.proto文件保证和服务端一样同步添加相应的内容这里就不截图了小伙伴可以通过拷贝或是引用的方式保证文件一样就行啦在winform设计模式下双击双向流模式按钮增加点击事件开始写业务逻辑。运行看效果先运行服务端在运行客户端点击双向流模式按钮效果如下点击服务端流按钮查看全部数看看是否添加成功gRPC的四种模式就简单介绍这么多小伙伴可以根据提供的思路应用到项目中。在演示案例中是不是感受到gRPC相比WebApi有更多的选择和优势另外通过服务端的控制台可以看到交互使用的是HTTP/2协议小伙伴感兴趣可以去了解一下2. gRPC集成JWT认证和WebAPI一样如果提供的服务接口“裸奔”那么风险是很大的关于这点之前针对WebApi认证和授权分享了两篇文章传送门在这(跟我一起学.NetCore之WebApi接口裸奔有风险(Jwt)、跟我一起学.NetCore之熟悉的接口权限验证不能少(Jwt))。其实gRPC集成JWT做认证授权和原来WebApi集成方式差不多一样太细节的描述小伙伴可以查阅上面两篇文章接下来的需求目的就是把上面提供的服务保护起来只有认证通过才能调用。2.1 引入Jwt相关包注册服务中间件管道增加认证流程在gRPC服务端项目中引入Jwt相关包Microsoft.AspNetCore.Authentication.JwtBearer在Startup文件中注册相关服务在Startup文件中增加认证流程在服务上增加Authorize特性标识运行看效果通过调用结果得知现在提供的gRPC服务已经受到保护需要持有对应身份的请求才能访问所以接下来就需要服务端提供一个获取身份Token的方法。2.2 服务端增加获取Token的服务方法服务端增加获取Token的服务方法现在student.proto文件中增加获取Token的相关约定编译自动生成对应代码如下重写方法编写获取Token的逻辑如下生成token的核心逻辑为方法GenerateToken如下到这服务端生成Token的方法就搞定了接下开始让客户端获取并使用即可。2.3 客户端获取Token并使用确保student.proto文件内容和服务端的一致然后编译自动生成代码。这里就不截图了小伙伴可以通过拷贝或是引用的方式保证文件一样就行啦这里将服务端流模式的按钮复制一个出来在其点击事件中增加带Token的逻辑获取Token的逻辑就是简单的调用服务端的方法如下这样就完成Jwt的集成了服务端、客户端都运行起来看一下到这里gRPC集成Jwt做认证的全部演示就完成了除了调用方式和客户端传递Token的方式不一样其他的都和WebApi使用方式一样。重点这里gRPC可以通过Metadata进行传递数据和之前WebApi的请求头很像可以根据自己需求进行任意封装传递。3. gRPC权限验证思路提一下上面只是进行了认证还没有对服务方法权限进行管控只要认证通过就能调用全部服务方法在实际应用场景中更希望的是分配啥权限才能调用对应的服务所以权限管控少不了。gRPC的权限管控和WebApi的管控方式一样同样可以使用策略的方式进行权限验证。gRPC同样能获取到请求方法的Url(包名.服务名.方法名)这样就可以以这种规则进行权限配置然后验证即可。详细步骤可以参考跟我一起学.NetCore之熟悉的接口权限验证不能少(Jwt)接下来就来说说主要步骤3.1 使用动态权限策略形式增加一个PermissionRequirement.cs文件如下增加一个PermissionHandler.cs文件集成自AuthorizationHandler然后重写处理方法核心代码如下Startup.cs文件中注册相关服务如下在Authorize特性中传递对应的策略名称如下这里模拟配置权限在获取token方法中内置几条对应用户的权限数据运行看效果如下最后验证成功就正常返回结果如果验证不成功就返回失败客户端就报异常如下源代码地址https://gitee.com/CodeZoe/g-rpc/tree/master后续会把其他代码也整理到码云上。总结关于gRPC实际应用场景常用的功能就先说到这吧以上案例演示只是提供思路小伙伴使用时可以根据对应的需求进行扩展和处理。既然聊到了服务间通信分布式事务肯定是避不开的下一篇开始说说分布式事务相关的点。一个被程序搞丑的帅小伙关注Code综艺圈和我一起学~~~