InfiniGate自研网关实现五

2024-05-15 21:52

本文主要是介绍InfiniGate自研网关实现五,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

17.核心通信组件管理和处理服务映射

引入模块api-gateway-core 到 api-gateway-assist 中进行创建和使用,并拉取自注册中心的映射信息注册到本地的网关通信组件中。

第17节是在第15节的基础上继续完善服务发现的相关功能,把从注册中心拉取的网关映射信息【系统、接口、方法】映射到本地通信组件中。这样就算完成了注册中心到本地服务的一个打通处理,映射完成后就可以通过HTTP请求到网关通信层,完成对RPC的泛化调用。

要在poom文件中引入之前写的核心通信组件(打包成jar包,放到本地的maven仓库中),通过 GatewayAutoConfig 配置类对网关通信组件进行 Bean 对象的创建和启动。

具体实现步骤:

1.引入api-gateway-core的依赖

2.在application包下的GatewayApplication类中注入api-gateway-core中的配置类Configuration,读取配置文件GatewayServiceProperties,调用gatewayCenterService的doRegister方法将网关配置传到注册中心上进行注册网关服务,调用gatewayCenterService的pullApplicationSystemRichInfo拉取网关配置并把对应的配置信息装配到Configuration中。

3.在GatewayAutoConfig类初始化网关服务。创建核心通信组件的Configuration对象并交给Spring容器管理。初始化网关服务,创建服务端 Channel 对象,方便获取和控制网关操作。先基于配置构建会话工厂,然后创建启动网关网络服务。

18容器关闭监听和异常管理

把网关在注册和拉取时的异常抛出来,交给容器管理做关闭动作,以及处理网关的服务关闭。

按照网关设计的架构图,api-gateway-assist 助手工程会被引入到 api-gateway-engine 网关引擎中启动。那么在 api-gateway-assist 启动的过程中,我们希望它所发生的一些动作,包括启动中的异常、拉取接口信息的失败以及容器关闭后优雅的处理网关通信的关闭。那么这些内容,就是本节需要完成的事情。        

基于上一节对api-gateway-assist模块的完善,这里需要把网关的注册和拉取配置操作,放到 ApplicationContextAware 接口对应的 setApplicationContext 方法中。这样可以在注册服务以及拉取配置的过程中出现失败情况时,则直接抛异常关闭容器。另外这里还需要做一个容器关闭的监听动作 ApplicationListener<ContextClosedEvent> 容器关闭时则把网关中的通信模块下的 Netty 服务也一起关闭掉。

下面先来讲一下ApplicationContextAwareApplicationListener<ContextClosedEvent>这两个接口

ApplicationContextAware

ApplicationContextAware接口是一个标记接口,主要用于标识一个类可以被Spring容器识别并注入应用上下文(ApplicationContext)。这个接口定义了一个方法:

void setApplicationContext(ApplicationContext applicationContext) throws BeansException;

当Spring容器创建实现了ApplicationContextAware接口的Bean时,它会自动调用这个方法,并传递应用上下文对象。

ApplicationListener<ContextClosedEvent>

ApplicationListener接口是一个事件监听器接口,用于监听Spring框架中的各种事件。这个接口定义了一个方法:

void onApplicationEvent(ApplicationEvent event);

当Spring容器发布某个事件时,所有实现了ApplicationListener接口的Bean的onApplicationEvent方法会被调用。这样,开发者可以自定义事件处理逻辑。

ContextClosedEvent是Spring框架中的一个事件,当Spring容器关闭时发布。因此,实现ApplicationListener<ContextClosedEvent>接口的类可以监听到Spring容器的关闭事件,并执行相应的清理工作,比如关闭数据库连接、释放资源等。

具体实现:

  1. 在service包下对服务注册和配置拉取这两个http请求用try catch进行异常管理
  2. 感知容器,GatewayApplication实现ApplicationContextAware接口,重写setApplicationContext方法,将注册网关服务和拉取网关配置放到这个方法里面并使用try catch捕获异常,当出现异常时就直接捕获抛出,关闭容器。
  3. 监听动作,GatewayApplication实现GatewayApplication实现接口,重写onApplicationEvent方法,监听到Spring 的容器关闭通知时,则把 Netty 服务关闭掉。

19网关引擎打包镜像部署

把网关在注册和拉取时的异常抛出来,交给容器管理做关闭动作,以及处理网关的服务关闭。为了方便网关算力节点的分布式部署,我会把网关引擎工程 api-gateway-engine 打包成 Jar 放到 Docker 中启动。

api-gateway-engine 是一个用于启动网关算力服务的引擎工程,它的代码内容几乎没有多少,主要负责的是工程的启动操作。因为镜像的打包也是从这个工程中处理。

具体实现:

1.在poom.xml文件中引入api-gateway-assist的依赖。

2.编写Dockerfile文件构建网关引擎的镜像。

3.编写一个shell脚本build.sh用于执行Dockerfile文件

20.服务注册组件搭建采集接口信息

提供应用服务注册的组件,采集RPC服务启动时已经配置了标记注解的对象,摘取出类、接口、方法,用于后续注册到网关中心。

首先我们知道网关的注册中心维护着网关和RPC接口的信息,用于把RPC接口分配到网关算力上使用。那么前面已经实现了网关算力的自动注册,同样RPC接口也需要自动注册,否则都是人工手动维护这个成本还是非常大的。

所以要开发一个api-gateway-sdk 组件,获取 Spring Bean 对象的注册结果,。并对已经使用注解标记了的接口进行拦截提取接口和方法信息。

具体实现:

1.在annotation包下自定义两个注解ApiProducerClazz(作用到类上)、ApiProducerMethod(作用到方法上),用于对注册到网关的接口进行标记,因为标记后就可以在读取到 Bean 对象以后通过反射判断是否需要提取信息并注册。

2.在application包下创建GatewaySDKApplication实现BeanPostProcessor接口(后置处理器的接口),重写postProcessAfterInitialization方法,该方法是Bean初始化之后调用,形参里面传入了bean实例,对bean实例进行反射拿到接口信息。

3.为了这个模块可以方便地服用,我们可以把这个模块封住成一个SpringStarter组件,在config包下,定义GatewaySDKServiceProperties属性类,用于封装从配置文件中定义的信息,包括注册中心和RPC服务的信息。定义GatewaySDKAutoConfig自动装配类,加上@EnableConfigurationProperties里面传入属性类的字节码,创建GatewaySDKServiceProperties类型的Bean对象。

这篇关于InfiniGate自研网关实现五的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/993017

相关文章

python实现svg图片转换为png和gif

《python实现svg图片转换为png和gif》这篇文章主要为大家详细介绍了python如何实现将svg图片格式转换为png和gif,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录python实现svg图片转换为png和gifpython实现图片格式之间的相互转换延展:基于Py

Python利用ElementTree实现快速解析XML文件

《Python利用ElementTree实现快速解析XML文件》ElementTree是Python标准库的一部分,而且是Python标准库中用于解析和操作XML数据的模块,下面小编就来和大家详细讲讲... 目录一、XML文件解析到底有多重要二、ElementTree快速入门1. 加载XML的两种方式2.

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)

Android实现在线预览office文档的示例详解

《Android实现在线预览office文档的示例详解》在移动端展示在线Office文档(如Word、Excel、PPT)是一项常见需求,这篇文章为大家重点介绍了两种方案的实现方法,希望对大家有一定的... 目录一、项目概述二、相关技术知识三、实现思路3.1 方案一:WebView + Office Onl

C# foreach 循环中获取索引的实现方式

《C#foreach循环中获取索引的实现方式》:本文主要介绍C#foreach循环中获取索引的实现方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、手动维护索引变量二、LINQ Select + 元组解构三、扩展方法封装索引四、使用 for 循环替代

Spring Security+JWT如何实现前后端分离权限控制

《SpringSecurity+JWT如何实现前后端分离权限控制》本篇将手把手教你用SpringSecurity+JWT搭建一套完整的登录认证与权限控制体系,具有很好的参考价值,希望对大家... 目录Spring Security+JWT实现前后端分离权限控制实战一、为什么要用 JWT?二、JWT 基本结构

Java实现优雅日期处理的方案详解

《Java实现优雅日期处理的方案详解》在我们的日常工作中,需要经常处理各种格式,各种类似的的日期或者时间,下面我们就来看看如何使用java处理这样的日期问题吧,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言一、日期的坑1.1 日期格式化陷阱1.2 时区转换二、优雅方案的进阶之路2.1 线程安全重构2

Android实现两台手机屏幕共享和远程控制功能

《Android实现两台手机屏幕共享和远程控制功能》在远程协助、在线教学、技术支持等多种场景下,实时获得另一部移动设备的屏幕画面,并对其进行操作,具有极高的应用价值,本项目旨在实现两台Android手... 目录一、项目概述二、相关知识2.1 MediaProjection API2.2 Socket 网络