InfiniGate自研网关实现四

13.服务发现组件搭建和注册网关连接

以封装 api-gateway-core 为目的,搭建 SpringBoot Starter 组件,用于服务注册发现的相关内容处理。

这里最大的目的在于搭建起用于封装网关算力服务的 api-gateway-core 系统,提供网关服务注册发现能力。那么之所以要开发一个这样的组件,也就是 SpringBoot Starter。是因为我们希望把这样的统一公用能力进行一致的管理,如果没有这样的组件服务,那么将需要每一个 SpringBoot 服务都要做类似这样的事情,整体来看就会耗费很大的成本,所以要把这样的功能进行收口。由于我在开发api-gateway-core时为了项目的可扩展性,没有使用SpringBoot框架,因此api-gateway-core还不能直接封装为一个SpringBoot Starter组件。所以我写了一个api-gateway-assist 这个辅助组件,它是一个 SpringBoot Starter 起到包装和连接的作用。

  • api-gateway-core 是网关的算力服务,api-gateway-center 是网关的注册中心,那么为了把这块服务链接起来,中间则需要一套 api-gateway-engin 网关的引擎,用于启动网关的算力服务。
  • 但由于启动网关的算力服务还需要一些功能的整合,来包装网关算力到注册中心的连接,所以这部分需要整合到 api-gateway-assist 这个辅助组件,它是一个 SpringBoot Starter 起到包装和连接的作用。

具体实现:

不熟悉SpringBoot自定义Starter的可以先看一下这篇文章:中间件研发之Springboot自定义starter-CSDN博客

1.在config包下定义配置类GatewayServiceProperties,在类中添加属性信息,这些属性信息就是最后的配置到 yml 中的配置属性。

2.在service包下创建RegisterGatewayService 注册网关类,在该类中调用 api-gateway-center 提供的服务发现接口,向网关中心注册网关算力节点。这是第一步非常重要的关联作用,有了这块逻辑的处理,才能打通整个网关算力和网关注册中心

3.在application包下创建GatewayApplication类实现Spring框架中的ApplicationListener接口,用于监听Spring上下文刷新事件ContextRefreshedEvent。这个类的目的是在Spring应用上下文刷新时执行一些初始化操作,比如注册网关服务到配置中心。重复注册则是标记服务启动

包结构如下:

14.网关映射聚合信息查询实现

以封装 api-gateway-core 为目的,搭建 SpringBoot Starter 组件,用于服务注册发现的相关内容处理.

这里主要实现在注册中心提供一个接口,这个接口用来:将各个RPC服务配置【系统、接口、方法】信息拉取下来(其实就是一个根据网关算力节点查询对应的RPC服务),注册到网关算力中,完成RPC映射的过程。

首先通过 gateway_distribution 表,把网关和RPC应用服务关联起来,方便知道哪个网关算力处理哪些RPC映射管理。有了这个映射关系后,就可以把对应的 application_interface、application_interface_method、application_system 三个表维护应用的配置信息关联起来了。

具体实现:

1.在用户接口层interfaces包下的GatewayConfigManage类中新增一个queryApplicationSystemRichInfo接口,用于根据算力节点id查询对应的RPC服务。

2.在应用层application包下的IConfigManageService接口中新增一个方法queryApplicationSystemRichInfo(防腐层)

3.在领域层domain的对应领域包下实现上面接口中新增的方法,在这个方法中写查询RPC服务的逻辑。调用持久层的接口是该业务子领域的repository包下接口的方法(防腐层)。

4.在infrastructure基础层包下的repository包下实现防腐层的接口,实现的方法主要是对要增删改的数据进行一些填充或者是对查询出来的数据进行封装,然后再调用dao层的接口,真正地去操作数据库的数据。

15.服务配置拉取和组件使用验证

结合第13节组件的开发和第14节数据结构的提供,在第15节中重构网关助手组件服务,并把组件引入到 SpringBoot 中使用。

结合着第13节,网关算力的助手组件初步实现,本章需要进行扩展以及验证使用。这一节需要完成从第14节中提供的网关聚合配置信息,拉取到网关算力中,打通这部分的接口调用。后续再处理映射操作,因为映射还需要把网关核心算力引入到助手组件中进行包装使用。

具体实现:

1.把第13节中写的api-gateway-assist下的service包进行重构,重构成DDD架构下domain领域包。

2.在service包下的GatewayCenterService类中新增pullApplicationSystemRichInfo方法,用于拉取注册中心的网关算力节点对应的RPC服务信息。

16.网络通信配置提取

提取 Netty 通信服务配置信息,包括:IP、端口、线程等,到会话的 Configuration 配置类中进行统一的维护和管理,便于外部调用方向内部传递信息。

在网关会话中会从注册中心拉取网关算力节点的服务配置信息,这些配置信息存放到Configuration配置类。

具体实现:

只需修改Netty启动类的相关配置,改为从Configuration配置类中获取

public class GatewaySocketServer implements Callable<Channel> {

    private final Logger logger = LoggerFactory.getLogger(GatewaySocketServer.class);

    private final Configuration configuration;
    private DefaultGatewaySessionFactory gatewaySessionFactory;

    private EventLoopGroup boss;
    private EventLoopGroup work;
    private Channel channel;

    public GatewaySocketServer(Configuration configuration, DefaultGatewaySessionFactory gatewaySessionFactory) {
        this.configuration = configuration;
        this.gatewaySessionFactory = gatewaySessionFactory;
        this.initEventLoopGroup();
    }

    private void initEventLoopGroup(){
        boss = new NioEventLoopGroup(configuration.getBossNThreads());
        work = new NioEventLoopGroup(configuration.getWorkNThreads());
    }

    @Override
    public Channel call() throws Exception {
        ChannelFuture channelFuture = null;
        try {
            ServerBootstrap b = new ServerBootstrap();
            b.group(boss, work)
                    .channel(NioServerSocketChannel.class)
                    .option(ChannelOption.SO_BACKLOG, 128)
                    .childHandler(new GatewayChannelInitializer(configuration, gatewaySessionFactory));
            // Docker 容器部署会自动分配IP,所以我们只设定端口即可。
            // channelFuture = b.bind(new InetSocketAddress(configuration.getHostName(), configuration.getPort())).syncUninterruptibly();
            channelFuture = b.bind(configuration.getPort()).syncUninterruptibly();
            this.channel = channelFuture.channel();
        } catch (Exception e) {
            logger.error("socket server start error.", e);
        } finally {
            if (null != channelFuture && channelFuture.isSuccess()) {
                logger.info("socket server start done.");
            } else {
                logger.error("socket server start error.");
            }
        }
        return channel;
    }

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Mysql 多表查询,内外连接

内连接&#xff1a; 隐式内连接 使用sql语句直接进行多表查询 select 字段列表 from 表1 , 表2 where 条件 … ; 显式内连接 将‘&#xff0c;’改为 inner join 连接两个表的 on select 字段列表 from 表1 [ inner ] join 表2 on 连接条件 … ; select emp.id, emp.name, …

宝塔安装多个版本的PHP,如何设置默认的PHP版本

如何将默认的PHP版本设置为7.3.32&#xff0c; 创建软链接指向7.3版本&#xff0c;关键命令&#xff1a;ln -sf /www/server/php/73/bin/php /usr/bin/php 然后再查看PHP版本验证一下结果 [rootlocalhost ~]# ln -sf /www/server/php/73/bin/php /usr/bin/php [rootlocalho…

Mysql进阶-sql优化篇

sql优化 sql优化insert优化批量插入手动提交事务主键顺序插入大批量插入数据 主键优化数据组织方式页分裂页合并主键设计原则 order by 优化原则 group by优化limit优化count 优化count的几种用法 update优化 sql优化 insert优化 批量插入 Insert into tb_test values(1,Tom…

一文读懂设计模式-单例模式

单例模式&#xff08;Singleton Pattern&#xff09;提供了一种创建对象的最佳方式 单例模式涉及到一个单一的类&#xff0c;该类负责创建自己的对象&#xff0c;同时确保只有单个对象被创建&#xff0c;这个类提供了一种访问其唯一的对象的方式&#xff0c;可以直接访问&…

IPD推行成功的核心要素(四)IPD究竟分几期做更合适?

集成产品开发 IPD体系&#xff08;Integrated Product Developm e nt&#xff09;是产品创新型企业关于产品开发&#xff08;从概念到产品开发、发布直至退市的全过程&#xff09;的一种理念与方法。IPD体系强调以市场需求作为产品开发的驱动力&#xff0c;将产品开发作为一项投…

快手短剧,和爱优腾踏入同一条河流

文丨黄小艺 “我们定制短剧的重心排序分别是抖音、淘宝、快手。”MCN机构从业者周明&#xff08;化名&#xff09;说道&#xff0c;“无论是单条还是品牌冠名剧&#xff0c;我们在快手短剧拿到的收益都相对偏低。” 近期&#xff0c;商业数据派和多家机构创作者沟通后发现&am…

Windows系统安装MongoDB数据库

MongoDB是一个基于分布式文件存储的NoSQL数据库&#xff0c;由C语言编写的。MongoDB的数据存储基本单元是文档&#xff0c;它是由多个键值对有序组合的数据单元&#xff0c;类似于关系数据库中的数据记录。适合存储JSON形式的数据&#xff0c;数据格式自由&#xff0c;不固定。…

区块链共识机制的演进

分布式系统的基本概念 FLP不可能原理和CAP原理 FLP 不可能原理&#xff08;FLP impossibility&#xff09;&#xff1a;在网络可靠&#xff0c;存在节点失效&#xff08;即便只有一个&#xff09;的最小化异步模型系统中&#xff0c;不存在一个可以解决一致性问题的确定性算法…

动手实践DDD领域驱动设计,DDD到底好不好用?真有那么神吗

文章目录 一、到底什么是DDD1、传统的MVC三层架构2、DDD到底解决了什么问题3、DDD四层架构4、为什么需要舍弃MVC而用DDD 二、DDD改造实战1、充血模型2、避免大实体3、Dao改造4、构建防腐层5、抽象中间件6、使用领域服务&#xff0c;封装跨实体业务7、使用设计模式8、改造结果9、…

自然资源-城市更新从立项到开发全流程梳理

自然资源-城市更新从立项到开发全流程梳理 一、城市更新项目分类 &#xff08;一&#xff09;按改造力度划分&#xff1a;整治、改建和拆建 按照改造力度由弱到强&#xff0c;城市更新项目可分为 整治类、改建类和 拆建类三种类型。不同城市命名略有不同&#xff0c;但实质相…

知识付费行业数字化转型:转的是什么?你知道吗!

在知识付费的浪潮中&#xff0c;数字化转型正悄然改变着这个行业的格局&#xff01;那么&#xff0c;知识付费行业数字化转型到底转的是什么呢&#xff1f;这是一个值得我们深入探讨的问题。 1.转的是商业模式&#xff1a;从传统的销售模式转向多元化的盈利模式。从简单的买卖关…

Pycharm2024版,更换安装源

1、选择Python Packages 2、点击图中的小齿轮 3、点击 号 4、添加源地址 常用源如下&#xff1a; 清华&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple 阿里云&#xff1a;http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.ustc.edu.cn…

MySQL·索引

目录 索引的意义 索引的理解 为何IO交互要是 Page 理解Page 其他数据结构为何不行&#xff1f; 聚簇索引 VS 非聚簇索引 索引操作 主键索引操作 唯一键索引操作 普通索引的创建 总结 全文索引 索引的意义 索引&#xff1a;提高数据库的性能&#xff0c;索引是物美…

挖洞不懂JS?没关系!一个BP小技巧让你快速在JS代码中找到关键信息

我们在漏洞挖掘的时候&#xff0c;一个很重要的方式是对网站的JavaScript代码做审计&#xff0c;比如 找到了一堆path&#xff0c;但是不知道参数&#xff0c;也fuzz不出来&#xff0c;一个可能的未授权接口就只能放弃 数据被加密了&#xff0c;但是不知道算法&#xff0c;需要…

HTML五彩缤纷的爱心

写在前面 小编准备了一个五彩缤纷的爱心&#xff0c;送给各位小美女们~ 在桌面创建一个.txt文本文件&#xff0c;把代码复制进去&#xff0c;将后缀.txt改为.html&#xff0c;然后就可以双击运行啦&#xff01; HTML简介 HTML&#xff08;超文本标记语言&#xff09;是一种…

【HCIP学习】BGP对等体组、聚合、路由反射器、联盟、团体属性

一、大规模BGP网络所遇到的问题 BGP对等体众多&#xff0c;配置繁琐&#xff0c;维护管理难度大 BGP路由表庞大&#xff0c;对设备性能提出挑战 IBGP全连接&#xff0c;应用和管理BGP难度增加&#xff0c;邻居数量过多 路由变化频繁&#xff0c;导致路由更新频繁 二、解决大…

小区物业管理系统

文章目录 小区物业管理系统一、项目演示二、项目介绍三、部分功能截图四、部分代码展示五、底部获取项目源码&#xff08;9.9&#xffe5;带走&#xff09; 小区物业管理系统 一、项目演示 小区物业管理系统 二、项目介绍 基于springbootvue的前后端分离物业管理系统 系统角…

实验12:综合实验

1、实验目的及要求&#xff1a; 通过本次实验完成一个小型网络中配置设备。实现配置一个路由器、两个交换机和两台PC&#xff0c;以支持IPv4和IPv6连接&#xff1b;路由器和交换机必须安全管理&#xff0c;配置VLAN间路由、DHCP、以太网通道和端口安全。通过登录思科网络技术学…

Nginx详解:高性能Web服务器与反向代理的奥秘

Nginx&#xff0c;发音为“engine-x”&#xff0c;是一个开源、高性能的HTTP和反向代理服务器&#xff0c;也是邮件代理服务器。自2004年首次发布以来&#xff0c;Nginx凭借其轻量级、高效能和高并发处理能力&#xff0c;在互联网领域迅速崛起&#xff0c;成为许多大型网站和高…

某东抢购某台脚本——高成功率

某东抢购某台脚本——高成功率 小白操作-仅供学习参考 说明 这段代码主要关联了许多网络请求和对应的业务逻辑处理&#xff0c;用于处理与一个名为“茅台商城”的应用相关的网络操作。主要功能和关键组件的详细说明如下&#xff1a; 全局变量和配置&#xff1a; 使用AES加密…