一、什么是RPC

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

二、CzarRpc简介

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

1、服务接口

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

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

2.服务端

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

HelloRpcServer.cs

然后启动服务端监听。

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

到此服务器端搭载完成。

3、客户端

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

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

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

客户端输出:

服务器端输出:

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

三、Ocelot增加RPC支持

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

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

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

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

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

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

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

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

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

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

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

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

1、rpc路由表设计

2、提取远程调用方法

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

3、重写返回结果

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

4、rpc中间件逻辑处理

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

5、启动Rpc客户端配置

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

6、配置客户端

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

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

四、网关Rpc功能测试

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

1、测试路由参数

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

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

2、使用Query方式传递参数

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

3、使用Post方式传递Json

请求路径/rpc/body,调用的服务器方法是HelloSendModel

4、混合参数使用

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

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

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

五、总结

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

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

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

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

  1. 【.NET Core项目实战-统一认证平台】第六章 网关篇-自定义客户端授权

    上篇文章[.NET Core项目实战-统一认证平台]第五章 网关篇-自定义缓存Redis 我们介绍了网关使用Redis进行缓存,并介绍了如何进行缓存实现,缓存信息清理接口的使用.本篇我们将介绍如何实现 ...

  2. 【.NET Core项目实战-统一认证平台】第七章 网关篇-自定义客户端限流

    上篇文章我介绍了如何在网关上增加自定义客户端授权功能,从设计到编码实现,一步一步详细讲解,相信大家也掌握了自定义中间件的开发技巧了,本篇我们将介绍如何实现自定义客户端的限流功能,来进一步完善网关的基础 ...

  3. 【.NET Core项目实战-统一认证平台】第四章 网关篇-数据库存储配置(2)

    [.NET Core项目实战-统一认证平台]第四章 网关篇-数据库存储配置(2) 原文:[.NET Core项目实战-统一认证平台]第四章 网关篇-数据库存储配置(2) [.NET Core项目实战- ...

  4. 【.NET Core项目实战-统一认证平台】第三章 网关篇-数据库存储配置(1)

    [.NET Core项目实战-统一认证平台]第三章 网关篇-数据库存储配置(1) 原文:[.NET Core项目实战-统一认证平台]第三章 网关篇-数据库存储配置(1) [.NET Core项目实战- ...

  5. 【.NET Core项目实战-统一认证平台】第五章 网关篇-自定义缓存Redis

    上篇文章[.NET Core项目实战-统一认证平台]第四章 网关篇-数据库存储配置(2)我们介绍了2种网关配置信息更新的方法和扩展Mysql存储,本篇我们将介绍如何使用Redis来实现网关的所有缓存功 ...

  6. 【.NET Core项目实战-统一认证平台】第十一章 授权篇-密码授权模式

    上篇文章介绍了基于Ids4客户端授权的原理及如何实现自定义的客户端授权,并配合网关实现了统一的授权异常返回值和权限配置等相关功能,本篇将介绍密码授权模式,从使用场景.源码剖析到具体实现详细讲解密码授权 ...

  7. 【.NET Core项目实战-统一认证平台】第十三章 授权篇-如何强制有效令牌过期

    上一篇我介绍了JWT的生成验证及流程内容,相信大家也对JWT非常熟悉了,今天将从一个小众的需求出发,介绍如何强制令牌过期的思路和实现过程. .netcore项目实战交流群(637326624),有兴趣 ...

  8. 【.NET Core项目实战-统一认证平台】第十四章 授权篇-自定义授权方式

    上篇文章我介绍了如何强制令牌过期的实现,相信大家对IdentityServer4的验证流程有了更深的了解,本篇我将介绍如何使用自定义的授权方式集成老的业务系统验证,然后根据不同的客户端使用不同的认证方 ...

  9. 【.NET Core项目实战-统一认证平台】第十二章 授权篇-深入理解JWT生成及验证流程...

    上篇文章介绍了基于Ids4密码授权模式,从使用场景.原理分析.自定义帐户体系集成完整的介绍了密码授权模式的内容,并最后给出了三个思考问题,本篇就针对第一个思考问题详细的讲解下Ids4是如何生成acce ...

最新文章

  1. Android——学习:线性布局权重分配
  2. 【Python基础】Python基础语法14个知识点大串讲
  3. 嵌入式Linux LED,键盘,AD驱动程序开发
  4. 普通程序猿三步升级成高级程序员
  5. 【报告分享】2020巨量引擎营销通案.pdf(附下载链接)
  6. python代码运行顺序_python 代码运行顺序问题?
  7. WCF 第一章 基础 更多关于配置文件的内容
  8. 数字信号C语言——平均分布随机数
  9. php mysql敏感词_PHP敏感词处理
  10. 一定要收藏,一位百万年薪Python程序员手写资料(附实例分享)
  11. 图片格式 tif转jpg 用Matlab实现
  12. docker之安装jdk8
  13. 用excel替换word里的文字,deepcopy
  14. 自然语言处理(NLP)常用开源工具总结----不定期更新
  15. openGauss数据库源码解析系列文章——存储引擎源码解析(四)
  16. 基于51单片机的便携式输液点滴控制报警器
  17. MATLAB-一维插值运算
  18. 冷存储王者,磁带当仁不让,减碳共识下的企业优选
  19. 微信小程序(3)—— 添加联系人至通讯录
  20. uniapp开发App引导页

热门文章

  1. 接口文档神器Swagger(下篇)
  2. 阿里巴巴发布智能运维故障管理AI+生态计划
  3. Python之路【第一篇】:环境搭建
  4. Devuan Jessie beta 释出
  5. 【原】python中文文本挖掘资料集合
  6. GNU ARM 汇编指令[转载]
  7. .NET 运行时设置
  8. 批量生成 Gitee 仓库克隆命令的方法
  9. Dapr + .NET 实战(九)本地调试
  10. NET问答: LINQ 中为啥不能将 StartsWith() 转成 Like('abc%') ?