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对象。

  • 7
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程小猹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值