gRPC四种模式、认证和授权实战演示

前言

上一篇对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 Age=2;string addr = 3;
}
// 公共返回类型
message CommonResponse{int32 code =1;string msg=2;
}
// 添加学生时传递的类型
message AddStudentRequest{Student student=1;}
// 查询学生时传递的类型
message QueryStudentRequest
{string UserName=1;
}
// 查询全部学生,没有条件,但也需要一个空的message
message QueryAllStudentRequest
{
}
// 上传图片
message UploadImgRequest{bytes data = 1;
}
message StudentResponse {Student student =1;
}
message TokenRequest{string UserName=1;string UserPwd=2;
}
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类中,重写方法写业务逻辑代码

    注意点:

  1. 就算请求不需要参数,也需要一个空的message类型;

  2. 这里返回的数据可以分批发送,复用连接,提高效率;

客户端

  • 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(nRead==0){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综艺圈",和我一起学~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/300729.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ajax mode,DWR的三种Reverse Ajax Mode配置详解

Full Streaming ModeEarly Closing ModePolling Mode在DWR应用中.默认启用的是Full Streaming Mode .它是三种modes中最快的一种.它每60秒检查一次浏览器是否是活跃的.配置很简单:dwr-invokerorg.directwebremoting.servlet.DwrServletactiveReverseAjaxEnabledtrue然后在要使用…

摄像头预览左右翻转_轻薄翻转触控本里的高性能机型:惠普ENVY x360 13评测

自从今年3月末AMD锐龙4000系列处理器正式登陆移动平台以来,目前已有多款机型上市,并涌现出了不少高热度、高性价比的机型。我们也体验测试了其中数款机型,总体上给用户的印象是是价格香、性能强。而今天牛叔要聊的这款机型,也是搭…

聊一聊关于聊天记录的存储

背景 即时通讯(Instant Messaging),也就是我们常说的 IM,其实在很多业务场景上都会有或多或少的应用,有的会是核心,有的会是辅助。既然是聊天,那么必然就会产生聊天记录,而且聊天记录随着人数的增加和时间的…

考勤机信息同步不到服务器,考勤机实时同步功能上线啦

一、考勤机管理重磅上线,告别手动处理打卡数据考勤机打卡仍然是当前企业主流的考勤方式,而考勤机打卡数据的核算也是HR最头痛的一点。HR每个月都要去电脑打开复杂难用的考勤机配套软件,导出并整理打卡数据,逐个统计员工的迟到、早…

ios gb2312转utf-8

2019独角兽企业重金招聘Python工程师标准>>> 靠,想写个爬虫功能,结果一直是乱码,终于找到了转码的方法了 (NSString *) gb2312toutf8:(NSData *) data{ NSStringEncoding enc CFStringConvertEncodingToNSStringEncoding(kCFStr…

数学特级教师:数学除了做题目,我还必须让他们看这些!

▲ 点击查看很多时候,我们把数学简单的归为算数,归为计算能力,但数学更多的是一种培养逻辑思维能力的方式。包括一元二次方程、或者向量,或者几何证明。而在我们传统的数学课上,更多的是通过做题来理解数学知识&…

烟袋斜街-后海,印象已模糊

上个周末和猪头,廖廖一起去的。大家都神往已久,但是从未去过,这次一并去了,了却心愿。我不在北京,神往但是不能前去自然可以理解,但是他们两个已经在北京生活了六年,向往了六年,路程…

为啥 .NET 自带的 JsonSerializer 无法序列化 Field ?

咨询区 Theyouthis:最近我将项目升级到 .NET Core 3 之后,我发现自带的 System.Text.Json.JsonSerializer 序列化器有一个奇葩的问题,它不支持对 类字段 的序列化。。。参考如下代码:namespace ConsoleApp6 {class Program{static…

Windows下MinGW编译vim7.4

学习了一段时间Vim,感觉有些功能真的很方便。因学习原因,工作平台更换到一台老式Xp电脑上,重新安装了Vim7.4。官网默认版本不支持等宽字体和GDI渲染,需要手工编译一个修改过的版本。 1、下载MinGW 直接从MinGW官网下载的是在线安装…

除了中国,原来还有这么多国家采用十二生肖的啊~| 今日最佳

世界只有3.14 % 的人关注了青少年数学之旅一、肥宅快乐水(qiu?)A岛-匿名版二、永远不轻言放弃知识冷知识青年 图片五目马丁饭三、终于知道怎么倒立问了冷知识日报社四、千万不能浪费文医疗音乐手绘君五、世界上所有采用十二生肖的国家冷知识日…

命中率_数据说话!詹姆斯的“皇家射手团”命中率为近十年最低

北京时间10月13日,湖人球员丹尼格林更新个人社交媒体,发布自己与奥布莱恩杯的合影等,并配文“随你怎么说,我又多了一样你拿不走的东西”。格林晒出自己与杜德利、詹姆斯的合影。此前,格林因为在NBA总决赛G5中未能命中极…

.net core 微服务下的手工签名实现,以及消除中文乱码

最近在实现一款业主签字的需求,签字前端由vue下的某个共享组件实现,其采用Canvas绘图方式实现签名图片的生成,后台主要提供签名前文档的呈现,以及签名后文件合成过的签名文档保存。FastReport报表生成器FastReport .NET是适用于.N…

高性能通道

高性能通道 http://detail.1688.com/offer/896868540.html https://www.datastoragecables.com/qsfp/qsfp-qsfp/qsfp-qsfp-ib/C9494-M-IB.html【infiniband】 http://pkg-ofed.alioth.debian.org/howto/infiniband-howto.html#toc6【infiniband-ib】posted on 2013-10-28 21:26…

清华学霸直博简历火了!CPU、操作系统、编译器全自主写,刘知远点赞

全世界只有3.14 % 的人关注了青少年数学之旅清华大学直博面试的一则简历上了知乎热榜:“实现了在自己写的CPU上运行自己写的操作系统,以及自己实现的编译器生成的程序”。简历主人是清华计算机系本科生周聿浩同学,他顺利拿到直博名额&#xf…

使用Blazor开发内部后台(一):认识Blazor

转载技术社区中一位朋友最新的文章,介绍自己为公司的 WebForm 遗留系统使用 Blazor 重写前端 UI 的经历。前言啊,又好久没写文章了,这一年一直在接触新的领域,扩展了一下技术面,学了很多新东西。前阵子发现公司内部有个…

全球科技界最鼓舞人心领袖揭晓!马斯克第一,马云第五

全世界只有3.14 % 的人关注了青少年数学之旅谁是科技界最鼓舞人心的领袖?最近技术招聘网站Hired对3600多名技术人员进行了调查,最终马斯克击败贝佐斯、纳德拉、扎克伯格等人成功当选,马云排名第五。SpaceX被评为全球私人公司中第二大最受欢迎…

设置mysql表myisam_mysql myisam 优化设置设置

mysql myisam 优化设置设置更新时间:2010年03月16日 21:28:24 作者:mysql myisam 优化设置设置,需要的朋友可以参考下。myisam_max_[extra]_sort_file_size足够大delay_key_write减少io,提高写入性能bulk_insert_buffer_sizeconcurrent_ins…

NET问答: 为什么 String.IndexOf 在 .net5 和 netcore3 中返回值不一样?

咨询区 Farhad Zamani:当我在 .NET Core 3.1 中运行下面代码的时候,程序会返回 6。class Program{static void Main(string[] args){// .NET Core 3.1string s "Hello\r\nworld!";int idx s.IndexOf("\n");Console.WriteLine(idx)…

vSpere虚拟网卡介绍

在一个物理网络拓扑中,通常都是路由器-交换机-PC机的连接,不同的服务器和PC机,通过交换机的连接而相互连通。在VMwarevSphere架构下服务器会虚拟出交换机来供ESXHost虚拟机来使用,虚拟交换机有两种,vSwitch虚拟交换机和…

快速掌握MATLAB应用,只要从这一步开始!

有人说,“MATLAB除了不会生孩子,什么都会。”矩阵运算、数据可视化、GUI(用户界面)设计、甚至是连接其他编程语言,MATLAB都能轻松实现!那么,MATLAB到底有多厉害?MATLAB拥有丰富的算法…