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

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

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

相关文章

ZYNQ之嵌入式驱动开发——字符设备驱动

文章目录 Linux驱动程序分类Linux应用程序和驱动程序的关系简单的测试驱动程序在petalinux中添加LED驱动新字符设备驱动 Linux驱动程序分类 驱动程序分为字符设备驱动、块设备驱动和网络设备驱动。 字符设备是按字节访问的设备&#xff0c;比如以一个字节收发数据的串口&#…

软信天成:业务流程管理驱动企业数字化转型

近日&#xff0c;在国家发展改革委办公厅、国家数据局综合司联合印发的《数字经济2024年工作要点》中&#xff0c;明确强调了本年度大力推进重点领域数字化转型&#xff0c;营造数字化转型生态的战略举措&#xff0c;标志着国家对于企业数字化转型的高度重视与积极倡导。 企业…

dubbo复习:(3) 服务超时时间配置

在dubbo admin中 可以进行类似如下配置 configVersion: v2.7 enabled: true configs:- side: consumeraddresses:- 0.0.0.0parameters:timeout: 55这样配置之后&#xff0c;当服务端响应超过55毫秒时&#xff0c;在服务消费者的控制台就会看到超时信息

(保姆级教程傻瓜式操作)树莓派--基于opencv实现人脸识别

前言 因为当时没有边实验边记录&#xff0c;所以这篇文章可能存在疏漏。不过很多地方我推荐了我参考过的博客或者视频&#xff0c;希望尽可能地解答您的疑惑&#xff0c;如果您仍有不懂的地方&#xff0c;欢迎评论&#xff0c;如果我知道答案&#xff0c;我会很乐意为您解答。 …

私活更好用:SpringBoot开源项目!!【送源码】

今天分享一款非常香的SpringBoot大屏开源项目&#xff0c;非常适合接私活用。 这是一款基于SpringBoot代码生成器的快速开发平台&#xff01;采用前后端分离架构&#xff1a;SpringBoot&#xff0c;Mybatis&#xff0c;Shiro&#xff0c;JWT&#xff0c;Vue&Ant Design。强…

MQTT_介绍_1.1

历史 1999年&#xff1a;MQTT最初由IBM的Andy Stanford-Clark和Cirrus Link的Arlen Nipper开发&#xff0c;用于满足石油和天然气公司在远程地区监控设备的需求。 2006年&#xff1a;IBM发布了MQTT的最初开源实现&#xff0c;但此时MQTT并未获得广泛的关注。 2010年&#xff…

三大平台直播视频下载保存方法

终于解决了视频号下载的问题&#xff0c;2024年5月15日亲测可用。 而且免费。 教程第二部分&#xff0c;有本地电脑无法下载的解决方案。 第一部分&#xff1a;使用教程&#xff08;正常&#xff09; 第1步&#xff1a;下载安装包 下载迅雷网盘搜索&#xff1a;大海福利合集…

【Python报错】Python安装模块时报错Fatal error in launcher

【Python报错】Python安装模块时报错Fatal error in launcher 最近需要用到python下载一个小工具&#xff0c;自信敲下回车键本想看到黑乎乎的终端上会出现快速跳跃的命令代码&#xff0c;没想到&#xff0c;报错了...... Fatal error in launcher: Unable to create process …

【Qt】Qt开源项目

1、Flameshot 截图工具 1.1 简介 Flameshot是一款功能强大但易于使用的屏幕截图软件,中文名称火焰截图。 Flameshot 简单易用并有一个CLI版本,所以可以从命令行来进行截图。 Flameshot 是一个Linux发行版中完全免费且开源的截图工具 1.2 源码 github:https://github.com…

智能监控与安全管理:安全帽检测算法的实践与应用

在工地、煤矿等高危工作环境中&#xff0c;安全帽的佩戴至关重要。安全帽能够有效防止因坠落物体或碰撞等引起的头部伤害&#xff0c;从而保护工作人员的生命安全。然而&#xff0c;传统的检查人员佩戴安全帽的方式主要依赖于现场监督和巡查&#xff0c;这种方法不仅耗费大量人…

不用投稿邮箱,怎样向各大新闻媒体投稿?

身为单位的信息宣传员,我深知肩上责任重大。每个月,完成单位在媒体上投稿发表文章的考核任务,就如同一场无声的赛跑,既要保证速度,更要注重质量。起初,我遵循“前辈们”的老路,一头扎进了邮箱投稿的海洋。但很快,现实给了我一记重拳——邮箱投稿的竞争犹如千军万马过独木桥,稿件…

Hadoop3:客户端向HDFS写数据流的流程讲解(较枯燥)

一、场景描述 我们登陆HDFS的web端&#xff0c;上传一个大文件。 二、流程图 三、讲解 流程1&#xff08;Client与NameNode交互&#xff09; 1、HDFS client创建DistributedFileSystem&#xff0c;通过dfs与NameNode进行2次&#xff08;一来一回4次&#xff09;对话&#x…

x264 帧类型代价计算原理:slicetype_mb_cost 函数分析

slicetype_mb_cost 函数 函数功能 计算每个宏块 MB 的代价 cost。函数参数分析 x264_t *h:全局编码结构体x264_mb_analysis_t *a:宏块分析结构体x264_frame_t **frames:系列帧数据结构体int p0:帧序号之一,一般指向靠前帧int p1:帧序号之一,一般指向靠后帧int b:帧标志…

Go微服务开源框架kratos的依赖注入关系总结

该文章为学习开源微服务框架kratos的学习笔记&#xff01;官方文档见&#xff1a;简介 | Kratos Kratos 一套轻量级 Go 微服务框架&#xff0c;包含大量微服务相关框架及工具。 一、Kratos 项目结构简介 通过 Kratos 工具生成的 Go工程化项目模板如下&#xff1a; applicati…

【半夜学习MySQL】复合查询(含多表查询、自连接、单行/多行子查询、多列子查询、合并查询等详解)

&#x1f3e0;关于专栏&#xff1a;半夜学习MySQL专栏用于记录MySQL数据相关内容。 &#x1f3af;每天努力一点点&#xff0c;技术变化看得见 文章目录 回顾基本查询多表查询自连接子查询单行子查询多行子查询多列子查询在from子句中使用子查询合并查询 回顾基本查询 下面使用…

计算机网络 -- 序列化与反序列化

一 协议的重要性 我们都知道&#xff0c;在进行网络通信的过程中&#xff0c;通信的双方可以是不同的设备&#xff0c;不同的平台&#xff0c;不同的平台&#xff0c;比如说&#xff0c;手机用户和电脑用户进行通信&#xff0c;ios系统和安卓系统进行通信。 自己的数据&#xf…

抖店商品详情API接口(店铺|标题|主图|价格|SKU属性等)

抖店商品详情API接口(店铺|标题|主图|价格|SKU属性等) 抖店商品详情API接口是指通过调用抖音开放平台提供的接口&#xff0c;获取抖店上商品的详细信息的方法。 抖店开放平台提供了一系列的接口&#xff0c;可以用于获取商品的基本信息、价格、库存、销量、评价等各种信息。以…

UIKit之图片浏览器

功能需求 实现一个图片浏览器&#xff0c;点击左右按钮可以切换背景图&#xff0c;且更新背景图对应的索引页和图片描述内容。 分析&#xff1a; 实现一个UIView的子类即可&#xff0c;该子类包含多个按钮。 实现步骤&#xff1a; 使用OC语言&#xff0c;故创建cocoa Touch类…

数据库的存储过程、函数与触发器

使用下面的场景来引入 1.创建表 CREATE DATABASE staff; USE staff; CREATE TABLE employee(id INT NOT NULL AUTO_INCREMENT,userName VARCHAR(255),birthDate DATE,idCard VARCHAR(255),loginName VARCHAR(255),PASSWORD VARCHAR(255),mobile VARCHAR(255),email VARCHAR(2…

开源连锁收银系统哪个好

针对开源连锁收银系统的选择&#xff0c;商淘云是一个备受关注的候选。商淘云以其功能丰富、易于定制和稳定性等优势&#xff0c;吸引了众多企业和开发者的关注。下面将从四个方面探讨商淘云开源连锁收银系统的优势&#xff1a; 首先&#xff0c;商淘云提供了丰富的功能模块。作…