【.NET Core项目实战-统一认证平台】第十六章 网关篇-Ocelot集成RPC服务

一、什么是RPC

RPC是“远程调用(Remote Procedure Call)”的一个名称的缩写,并不是任何规范化的协议,也不是大众都认知的协议标准,我们更多时候使用时都是创建的自定义化(例如Socket,Netty)的消息方式进行调用,相比http协议,我们省掉了不少http中无用的消息内容。因此很多系统内部调用仍然采用自定义化的RPC调用模式进行通信,毕竟速度和性能是内网的关键指标之一,而标准化和语义无关性在外网中举足轻重。所以,为何API网关无法工作在RPC上,因为它没有一个像HTTP/HTTPS那样的通用标准。

二、CzarRpc简介

CzarRpc是作者基于Dotnetty实现的RPC通讯框架,参考了SurgingTars.Net优秀设计,目前正在内部使用中,下面就CzarRpc调用方式做一个简单介绍,测试结构如下:
640?wx_fmt=png

1、服务接口

新建一个Czar.Rpc.Common类库,首先需要引用Czar.RpcNuget包。

640?wx_fmt=png

然后定义测试接口IHelloRpc.cs,也是目前支持的调用方式。

640?wx_fmt=png

640?wx_fmt=png

2.服务端

新建一个控制台程序Czar.Rpc.Server,然后实现服务接口,因为都是测试数据,所以就随意实现了方法。

HelloRpcServer.cs

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

然后启动服务端监听。

640?wx_fmt=png

启用外部使用CzarConfig.json的配置文件,注意需要设置成始终复制。

640?wx_fmt=png

到此服务器端搭载完成。

3、客户端

新建客户端控制台程序Czar.Rpc.Client,然后配置Rpc调用信息。

640?wx_fmt=png

现在开始启用客户端信息。

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

现在整个RPC调用搭建完毕,然后分别启动服务器端和客户端,就可以看到屏幕输出内容如下。

客户端输出:
640?wx_fmt=png

服务器端输出:
640?wx_fmt=png

至此整个CzarRpc的基本使用已经介绍完毕,感兴趣的朋友可以自行测试。

三、Ocelot增加RPC支持

有了CzarRpc的通讯框架后,现在在Ocelot上实现Rpc功能简直易如反掌,现在开始添加我们的Rpc中间件,也让我们扩展的网关灵活起来。

还记得我介绍网关篇时添加中间件的步骤吗?如果不记得的可以先回去回顾下。

首先如何让网关知道这个后端调用是http还是Rpc呢?这时应该会想到Ocelot路由配置里的DownstreamScheme,可以在这里判断我们定义的是http还是rpc即可。同时我们希望之前定义的所有中间件都生效,最后一步请求时如果配置下端路由rpc,使用rpc调用,否则使用http调用,这样可以重复利用之前所有的中间件功能,减少重复开发。

在之前的开发的自定义限流和自定义授权中间件开发中,我们知道开发完的中间件放到哪里使用,这里就不介绍原理了,直接添加到BuildCzarOcelotPipeline里如下代码。

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

这里是在最后请求前判断使用的下游请求方式,如果DownstreamScheme使用的rpc,就使用rpc中间件处理。

Rpc处理的完整逻辑是,如何从http请求中获取想要解析的参数,这里需要设置匹配的优先级,目前设计的优先级为。

1、首先提取路由参数,如果匹配上就是用路由参数名称为key,值为value,按顺序组成第一批参数。

2、提取query参数,如有有值按顺序组成第二批参数。

3、如果非Get请求,提取body内容,如果非空,组成第三批参数

4、从配置库里提取rpc路由调用的服务名称和函数名称,以及是否单向调用。

5、按照获取的数据进行rpc调用并等待返回。

看了上面的设计是不是思路很清晰了呢?

1、rpc路由表设计

640?wx_fmt=png


2、提取远程调用方法

根据上游路由获取远程调用的配置项目

640?wx_fmt=png


3、重写返回结果

由于rpc调用后是返回的Json封装的信息,需要解析成对应的HttpContent。

640?wx_fmt=png

4、rpc中间件逻辑处理

有了前面的准备信息,现在基本可以完成逻辑代码的开发了,详细的中间件代码如下。

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png


5、启动Rpc客户端配置

目前Rpc的客户端配置我们还没启动,只需要在AddCzarOcelot中添加相关注入即可。

640?wx_fmt=png

6、配置客户端

最后别忘了配置Rpc客户端信息是否启用证书信息,为了配置信息的内容。

640?wx_fmt=png

现在让网关集成Rpc功能全部配置完毕。

四、网关Rpc功能测试

本次测试我在原有的网关基础上,增加不同类型的Rpc调用,就按照不同维度测试Rpc调用功能,本次测试案例是建立在Czar.Rpc 服务端基础上,正好可以测试。
640?wx_fmt=png

640?wx_fmt=png

1、测试路由参数

请求路径/hello/{no}/{name},调用的服务端方法Hello,传入的两个参数分别是no ,name

可以在服务器端添加断点调试,发现确实接收到请求信息,并正常返回,下面是PostMan测试结果。
640?wx_fmt=png

2、使用Query方式传递参数

请求路径/rpc/query,调用的服务端方法还是Hello,参数分别是no ,name
640?wx_fmt=png

3、使用Post方式传递Json

请求路径/rpc/body,调用的服务器方法是HelloSendModel
640?wx_fmt=png

4、混合参数使用

请求的路径/rpc/bodyparm/{name},调用的服务器端方法是HelloSendModelParm
640?wx_fmt=png

所有的返回结果可自行调试测试,发现都能达到预期结果。

同时此网关还是支持默认的http请求的,这里就不一一测试了。

五、总结

本篇我介绍了什么是Rpc,以及Czar.Rpc的基本使用,然后使用Czar.Rpc框架集成到我们基于Ocelot扩展网关中,并实现了不能方式的Rpc调用,可以在几乎不改变现有流程的情况下很快速的集成进去,这也是Ocelot开发框架的魅力所在。

如果在使用过程中有什么问题或建议,可以在.NET Core项目实战交流群(637326624)中联系作者。

最后本文涉及的所有的源代码可在https://github.com/jinyancao/czar.gateway中下载预览。


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

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

相关文章

.net Core2.2 WebApi通过OAuth2.0实现微信登录

前言微信相关配置请参考 微信公众平台 的这篇文章。注意授权回调域名一定要修改正确。微信网页授权是通过OAuth2.0机制实现的,所以我们可以使用 https://github.com/china-live/QQConnect 这个开源项目提供的中间件来实现微信第三方登录的流程。开发流程1、新建一个…

Nginx优化(重点)与防盗链(新版)

Nginx优化(重点)与防盗链 Nginx优化(重点)与防盗链一、隐藏Nginx版本号1、修改配置文件2、修改源代码 二、修改Nginx用户与组1、编译安装时指定用户与组2、修改配置文件指定用户与组 三、配置Nginx网页的缓存时间四、实现Nginx的日志切割1、data的用法2、编写脚本进行日志切割的…

CodeForces730E Award Ceremony(拓扑排序+结论)

CF730E. Award Ceremonyproblemsolutioncodeproblem 题目链接 题目大意: 给出 nnn 个队封榜时的榜单 aia_iai​ 和揭榜时的变化情况 did_idi​。 揭榜时,这个队的名次会变化 tit_iti​。 注意在别的队揭榜时,自己队的排名也是动态变化的…

.Netcore 2.0 Ocelot Api网关教程(番外篇)- Ocelot v13.x升级

由于Ocelot系列博客好久没更新(差不多有10个月的时间了),在此先说声抱歉,Ocelot系列会继续更新下去。在写上一篇配置管理的时候发现官方文档已经和以前的不一样,而Ocelot也从5.0版本更新到了13.x版本,进行了…

CF765F Souvenirs(暴力、线段树)

解析 比较神奇的一道题。 考虑一个常规套路:把询问离线,移动右端点,维护左端点答案。 考虑暴力维护,对于当前的 aixa_ixai​x,左侧如图所示的这两条线上的点都可以产生新的可能答案。 容易构造使得单次产生的新点是…

Hard Disk Drive HDU - 4788

Hard Disk Drive HDU - 4788 题意: 通常制造商认为1“kilo”等于1000,但操作系统会认为是1024。 因此,当你购买了一个100MB的硬盘,电脑却只显示大约有95MB,这缺失了大约5MB。 对于硬盘的大小,有多种单位描…

ASP.NET Core 沉思录 - 环境的思考

我的博客换新家啦,新的地址为:https://clrdaily.com :-D今天我们来一起思考一下如何在不同的环境应用不同的配置。这里的配置不仅仅指 IConfiguration 还包含 IWebHostBuilder 的创建过程和 Startup 的初始化过程。0 太长不读环境造成的差异在架构中基本…

深度:从 Office 365 新图标来看微软背后的设计新理念

开始表演请关注我的公众号“寒树Office”来获取一些新鲜而有趣的新闻与知识,最近又有两家俱乐部上线了(东莞与长沙),俱乐部的活动告一段落,接下来的日子里我将持续与大家分享 Office 365 的精彩内容,这次很…

NET Core微服务之路:实战SkyWalking+Exceptionless体验生产下追踪系统

前言当一个APM或一个日志中心实际部署在生产环境中时,是有点力不从心的。比如如下场景分析的问题:从APM上说,知道某个节点出现异常,或延迟过过高,却不能及时知道日志反馈情况,总不可能去相应的节点上一个一…

.NET 中创建支持集合初始化器的类型

对象初始化器和集合初始化器只是语法糖,但是能让你的代码看起来更加清晰。至少能让对象初始化的代码和其他业务执行的代码分开,可读性会好一些。本文将编写一个类型,可以使用集合初始化器构造这个类型。不只是添加元素的集合初始化器&#xf…

【无码专区8】三角形二维数点——计数有多少个给定点落在三角形区域内

因为只有std,没有自我实现,所以是无码专区 主要是为了训练思维能力 solution才是dls正解,但是因为只有潦草几句,所以大部分会有我自己基于正解上面的算法实现过程,可能选择的算法跟std中dls的实现不太一样。 std可能…

为什么我的会话状态在ASP.NET Core中不工作了?

原文:Why isnt my session state working in ASP.NET Core? Session state, GDPR, and non-essential cookies作者:Andrew Lock译文:https://www.cnblogs.com/lwqlun/p/10526380.html译者:Lamond Lu在本篇博客中,我将…

现身说法:实际业务出发分析百亿数据量下的多表查询优化

今天给大家带来的讨论主题是通过实战经验来对百亿数据量下的多表数据查询进行优化,俗话说的好,一切脱离业务的架构都是耍流氓,接下来我就整理一下今天早上微信群里石头哥给大家分享的百亿数据量多表查询架构以及优化思路。由于本文内容整理自…

Help Jimmy POJ - 1661

Help Jimmy POJ - 1661 题意: 场景中包括多个长度和高度各不相同的平台。地面是最低的平台,高度为零,长度无限。 Jimmy老鼠在时刻0从高于所有平台的某处开始下落,它的下落速度始终为1米/秒。当Jimmy落到某个平台上时&#xff0c…

ASP.NET Core 沉思录 - ServiceProvider 的二度出生

ASP.NET Core 终于将几乎所有的对象创建工作都和依赖注入框架集成了起来。并对大部分的日常工作进行了抽象。使得整个框架扩展更加方便。各个部分的集成也更加容易。今天我们要思考的部分仍然是从一段每一个工程中都大同小异的代码开始的。IWebHostBuilder CreateWebHostBuilde…

Acwing 216. Rainbow的信号

Acwing 216. Rainbow的信号 题意: 给你n个数,在这n个数中,等概率地选取两个数l,r,如果l>r,则交换l,r 把信号中的第 l 个数到第 r 个数取出来,构成一个数列 P。 A 部分对话的密码是数列 P 的 xor 和的…

合肥.NET技术社区首次线下聚会全程回顾【多图】

2019年3月16日对于合肥.NET来说是一个特别的日子,因为这是合肥.NET技术社区首次非正式线下聚会!这次聚会受场地限制(毕竟是聚餐的形式),即使换成了小椅子后,最多也只能容纳24个人,所以还有一些小…

SignalR第一节-在5分钟内完成通信连接和消息发送

前言首先声明,这又是一个小白从入门到进阶系列。 SignalR 这个项目我关注了很长时间,中间好像还看到过微软即将放弃该项目的消息,然后我也就没有持续关注了,目前的我项目中使用的是自己搭建的 WebSocket ,连接管理和消…

【学习笔记】信息学竞赛中的概率与期望小结

信息竞赛——概率与期望事件事件的蕴含、包含事件的互斥事件的对立事件的和(并)事件的积(交)事件的差概率事件的独立性全概率公式贝叶斯公式概率DP(竞赛中的考察)期望(竞赛中的考察)…

尝试:Script Lab,快速 O365 开发工具//SL01)

《前言》Script Lab 我希望有一个系列(连载),可是我挺担心没偿没有能力去驾驭它。虽然早年前己经接触过,但一直未有下决心开始 Office 365 的开发之旅,虽然一直被光标老师所鼓舞,但是我心有旁骛还没有真正做…