InfiniGate自研网关实现思路二

news2024/11/15 23:42:54

5.HTTP请求参数解析

解析 HTTP 网络请求的参数信息,包括;GET/POST,以及应对不同 Content-Type 类型的处理。

HTTP 接口请求的参数需要解析成可以匹配到 RPC 接口的入参信息,所以通常为了方便控制一般只支持 RPC 接口单个对象入参,并且不允许同名不同参数的重载方法出现,这些会在 RPC 方法注册阶段进行报错提醒。

HTTP 接口请求的参数需要解析成可以匹配到 RPC 接口的入参信息,所以通常为了方便控制一般只支持 RPC 接口单个对象入参,并且不允许同名不同参数的重载方法出现,这些会在 RPC 方法注册阶段进行报错提醒。

流程图:

从网络通信(解析HTTP协议)到会话处理,需要对 GET/POST 的请求,以及请求的参数类型 Content-Type 做细化的参数解析操作。

具体实现步骤:

1.定义一个专门解析HTTP请求的请求解析器RequestParser,定义成员变量FullHttpRequest,使用流来解析获取Content-type,然后获取请求类型,然后根据不同的请求类型将请求参数存储到一个Map中。

2.在自定义的会话服务处理器GatewayServerHandler中使用上面的请求解析器RequestParser对http请求进行解析。

3.在默认会话实现类DefaultGatewaySession中进行消息封装,然后从连接池中获取到连接对象,执行execute方法,将消息传递进去。

6.引入执行器封装服务调用

通过引入执行器解耦会话中流程对数据源(RPC)的处理,让整个流程更加干净、整洁易于扩展和维护。

之前对于 HTTP 请求到网络协议转换后,就是会话流程的处理。但在会话流程中还有些内容过于冗余,这些内容就是对数据源(RPC)的调用时入参和出参的封装,它们应该被提取到一个专门的类来处理,这样才能更加方便的管理。会话的职责是负责串联上下文,执行器的职责是负责对数据源的调用信息处理

具体实现步骤:

1.创建executor包,作为封装对数据源(RPC)的调用,以及处理相关的入参、出参信息。同时这里还会把网关的调用结果进行封装到一个标准的类中,类里包括了code码、info描述,以及 data 结果信息。

2.在executor包下再创建一个result包,里面创建GatewayResult类,用于封装调用结果的消息。

3.创建一个Executor接口,用于定义执行数据源调用的逻辑。创建一个执行器抽象基类BaseExecutor实现Executor接口,定义doExec抽象方法,实现接口方法exec里面调用doExec用于执行数据源调用,里面封装了用于获取调用参数的Configuration会话配置类以及用于建立连接的Connection接口。创建简单执行器SimpleExecutor基础BaseExecutor,重写doExec方法用于执行数据源调用。

7.权限认证组件(Shiro+Jwt)

引入Shiro、Jwt 整合两部分功能,提供出认证服务。为后面在网络通信中验证 Token 信息做准备。

在我们的实现的InfiniGate自研网关中,当接收 HTTP 请求以后,开始调用对应的 RPC 接口前,其实还应该做一步权限验证。也就是说你当前调用的 HTTP 接口是否含带了我授予的 Token 信息,这个 Token 是否在有效期范围等控制,这样才能保证一个 HTTP 的调用和返回结果是安全可靠的。

  1. 关于网关中权限的校验会使用到 Shiro + Jwt,同时还要提供单独的 Handler 来处理 Netty 中的通信对信息的校验处理。但鉴于这部分属于两块功能,所以这里只先完成关于 Shiro + Jwt 部分。
  2. 为什么不用Spring Security而用的是Apache Shiro呢?因为它相当简单。对比于 Spring Security,可能没有做的功能强大,但是在实际工作时并不需要那么复杂的东西,所以使用小而简单的 Shiro 就足够了。还有一个原因就是这个核心通信组件没有引入Spring的环境,如果要使用Spring Security就要引入Spring的环境,影响这个核心通信组件的可扩展性。

具体实现:

1.创建JWTUtil类,用于生成JWT Token 字符串和解析JWT Token字符串。

2.创建IAuth接口,作为认证服务接口。创建AuthService类实现IAuth,重写validate方法。AuthService里面封装了Subject类,Subject就是主体,代表了当前 “用户”。通过subject进行身份验证。

3.因为我们这里不只是用户名密码验证,也会在后续扩展一些其他的网络请求信息或者授权操作,所以我们需要单独提供一个 AuthenticationToken 和 AuthorizingRealm 验证领域的实现类。

8.网关会话鉴权处理

通过拆分 Handler 通信管道处理器,引入 Shiro + JWT 到 AuthorizationHandler 中处理鉴权操作。

上面提到引入了 Shiro + JWT 作为鉴权的工具,这个工具就是要用到此处用于处理网络会话请求中对接口访问信息的一个鉴权处理。

这里你可以思考🤔,一次网络请求经过 Netty 处理可以分为三段;消息接收、请求鉴权、消息处理。这样就由原来我们只是在接收消息后直接把消息协议转换后请求到 RPC 服务,转换为多添加二层来处理简单的消息接收和请求鉴权。这里的请求鉴权就是基于引入的 Shrio + JWT 完成

具体实现:

1.在HttpStatement 中新添加字段 auth 用于判断是否需要鉴权。

2.在GatewayServerHandler中的调用会话服务改为从http请求中获取到HttpStatement,将HttpStatement保存到管道的属性信息中,channel.attr(AgreementConstants.HTTP_STATEMENT).set(httpStatement),所有的这条通信链上都可以获取到,这样到鉴权处理中直接获取到信息就可以操作了。此处不去获取会话的信息了(gatewaySessionFactory.openSession(uri))避免如果鉴权都鉴权失败了,创建会话服务也是浪费资源。所以只需要在构造函数中传输 Configuration 即可,用于根据 URI 获取 HttpStatement 网关接口映射信息,方便拿到是否需要鉴权。

3.创建AuthorizationHandler用于鉴权,鉴权的操作首先要获取当前请求的 URI 是否配置了鉴权,如果不鉴权则直接放行。进入到鉴权,通过FullHttpRequest获取到鉴权信息,先做非空判断,然后调用上面定义的鉴权接口auth.validate(),此处做了一点封装,将鉴权接口放到了configuration中封装成authValidate()方法。

4.创建ProtocolDataHandler,这里就相当于把原来的GatewayServerHandler中的解析请求参数,获取会话并调用会话服务,然后封装返回结果放到了ProtocolDataHandler中。

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

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

相关文章

「sentinel」流量控制组件的应用

「sentinel」流量控制组件的应用 Sentinel版本QPS 一、初识Sentinel1、Sentinel2、Sentinel 和 Hystrix对比3、雪崩问题 二、环境搭建1、下载安装Sentinel2、微服务整合Sentinel 三、流量控制1、簇点链路2、流控设置3、流控模式直接关联链路 4、流控效果流控效果解释 四、热点限…

C#通用类库封装实战

数据库查询 特性方式获取数据库列的别名 数据库更新 使用简单工厂配置的方式

C++ stl容器stack,queue,priority_queue的底层模拟实现

目录 前言: 文档借鉴:Reference - C Reference 1.deque a.deque的结构特点: b.deque的迭代器结构: c.面试题: 2.stack 3.queue 4.仿函数 5.priority_queue 总结: 前言: 本篇一共简单…

【QT学习】8.qt事件处理机制,事件过滤器,自定义事件

1.qt事件处理机制 事件处理: 当用户移动鼠标的时候 ,创建一个 鼠标移动事件对象 然后把这个对象放到 事件队列里面去,事件管理器 从队列中 取出事件,然后 调用其对应的事件处理函数。 多态机制: &#x…

靠谱的婚恋平台有哪些?青藤之恋、二狗、百合网、珍爱网等深度测评

哇塞,恋爱和结婚对于年轻人来讲可是超级重要的大事呢!不过呀,找到一个稳稳当当的婚恋平台可不简单哟!那么,到底哪个婚恋平台最靠得住呢? 丛丛: 这可是我用了好久好久的脱单交友小程序嘞&#xf…

MySQL中explain的用法

执行结果各字段的含义 EXPLAIN SQL语句 如: EXPLAIN SELECT * FROM test 执行结果: 列名描述id在一个大的查询语句中每个SELECT关键字都对应一个 唯一的idselect_typeSELECT关键字对应的那个查询的类型table表名partitions匹配的分区信息type针对单表…

机器学习预测汽车油耗效率 MPG

流程 数据获取导入需要的包引入文件,查看内容划分训练集和测试集调用模型查看准确率 数据获取 链接:https://pan.baidu.com/s/1KeIJykbcVpsfEk0xjhiICA?pwd30oe 提取码:30oe --来自百度网盘超级会员V1的分享导入需要的包 import pandas as pd imp…

【Spring Boot】掌握Spring Boot:深入解析配置文件的使用与管理

💓 博客主页:从零开始的-CodeNinja之路 ⏩ 收录文章:【Spring Boot】掌握Spring Boot:深入解析配置文件的使用与管理 🎉欢迎大家点赞👍评论📝收藏⭐文章 目录 Spring Boot 配置文件一. 配置文…

重新总结一下以前写过的“波特率”!单片机常见的通信速率分析!

文章目录 如题以前文章新的总结如题 波特率是单片机中描述通信速率的一个单位,比如串口通信、SPI通信、IIC通信、LIN通信、CAN通信等等,现在重新总结一下涉及到波特率的一些知识点。 以前文章 上面是存储的单位换算方式 这是通信速率的换算方式 新的总结 波特率的英文是…

画家-qt-surce

void GraphicView::paintEvent(QPaintEvent *pe) { QPainter painter(viewport()); painter.setRenderHint(QPainter::SmoothPixmapTransform);//升级画家 painter.drawImage(rect(),musicImage); } 分析: 这段代码是用于绘制图形视图的部分。 1. void GraphicV…

JavaCard学习笔记: CAP Component 之 Class Component

文章目录 整体结构tag和size字段signature_pool_length和signature_pooltype_descriptor结构导入类型编码导入项签名示例导入类导入数组导入远程方法 interfaces[]interface_info结构flagsinteface_countsuperinterfacesinterface_name class_info_compact classes[]结构flagsi…

mapreduce中的ReduceTask工作机制(Hadoop)

ReduceTask 是 Hadoop 中的一个重要组件,负责对 MapTask 的输出进行合并、排序和归并,最终生成最终的输出结果。 ReduceTask 的工作机制 1. 分组(Shuffle)阶段: 在分组阶段,ReduceTask 会从多个 Mapper …

【问题处理】银河麒麟操作系统实例分享,服务器操作系统VNC远程问题分析

1.服务器环境以及配置 【内核版本】 4.19.90-23.8.v2101.ky10.aarch64 【OS镜像版本】 0518-server 2.问题现象描述 服务器通过vncserver:1.service服务启动的vnc服务后,普通用户用vnc连接时,锁屏后,然后输入登陆密码会报密码错误&…

回溯算法练习day.4

93.复原ip地址 链接:. - 力扣(LeetCode) 题目描述: 有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 . 分隔。 例如:"…

基于单片机的智能病床呼叫系统设计与仿真

摘 要 本文设计的病床呼叫系统采用单片机作为控制器。该系统具有远程控制、病人的身体情况检测、报警呼叫、显示和执行器运动的功能。远程控制由红外线传感器和矩阵键盘组成,检测电路由温湿度传感器DH22、心率传感器Pulse Sensor、压力传感器MPX4115组成&#x…

苹果电脑虚拟机黑屏了怎么办解决 MAC系统升级后虚拟机黑屏问题 苹果电脑虚拟机卡住了怎么办

虚拟机是一种可以在一台电脑上运行多个操作系统的软件,它可以让用户在苹果电脑上安装和使用Windows、Linux等其他系统。但是,有时候在升级Mac系统或者虚拟机软件后,虚拟机会出现黑屏的现象,无法正常启动或者使用。这种情况该如何解…

java swing电商出入库管理系统eclipse开发Mysql数据库CS结构java编程

一、源码特点 java swing 电商出入库管理系统 是一套完善的窗体设计系统,对理解SWING java 编程开发语言有帮助,系统具有完整的源代码和数据库,,系统主要采用C/S模式开发。 应用技术:javamysql 开发工具&#xff1…

一堆喷儿香喷儿香的工具网站-已经收藏-搜嗖工具箱!

文心一言 https://yiyan.baidu.com/ ​ ChatGpt横空出世的横空出世好像一把钥匙,开启了大模型时代,国内也有不错的产品,比如百度的文心一言,从3.5到4.0看得见的成长,现在的文心一言是我们工作中不可缺少的好帮手&am…

vulfocus靶场之redis命令执行cve-2022-0543漏洞复现

漏洞: Redis是著名的开源Key-Value数据库,其具备在沙箱中执行Lua脚本的能力。 Debian以及Ubuntu发行版的源在打包Redis时,不慎在Lua沙箱中遗留了一个对象package,攻击者可以利用这个对象提供的方法加载动态链接库liblua里的函数&…

【Visual Studio 2012中文版】下载安装以及使用方法

文章目录 前言一、下载安装包二、安装步骤1.双击VS2012_ULT_chs.iso文件打开2.双击vs_ultimate.exe打开安装程序3.选择要安装的功能4.软件正在安装,请耐心等待10分钟5.安装成功,点击“启动”6.激活码(产品密钥) 三、VS2012使用&am…