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

相关文章

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

MySQL双主搭建+keepalived高可用的实现

《MySQL双主搭建+keepalived高可用的实现》本文主要介绍了MySQL双主搭建+keepalived高可用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、测试环境准备二、主从搭建1.创建复制用户2.创建复制关系3.开启复制,确认复制是否成功4.同

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

opencv图像处理之指纹验证的实现

《opencv图像处理之指纹验证的实现》本文主要介绍了opencv图像处理之指纹验证的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、简介二、具体案例实现1. 图像显示函数2. 指纹验证函数3. 主函数4、运行结果三、总结一、