ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

从写死到可配置:CodeGuide 仓库 API 网关第16章——Netty 网络通信配置提取实战解析

从写死到可配置:CodeGuide 仓库 API 网关第16章——Netty 网络通信配置提取实战解析 从写死到可配置CodeGuide 仓库 API 网关第16章——Netty 网络通信配置提取实战解析【免费下载链接】CodeGuide:books: 本代码库是作者小傅哥多年从事一线互联网 Java 开发的学习历程技术汇总旨在为大家提供一个清晰详细的学习教程侧重点更倾向编写Java核心内容。如果本仓库能为您提供帮助请给予支持(关注、点赞、分享)项目地址: https://gitcode.com/gh_mirrors/code/CodeGuide导读本文聚焦 CodeGuide 仓库中《API网关》系列第16章「网络通信配置提取」的核心改造讲解如何把原本写死在GatewaySocketServer类中的 Netty 服务 IP、端口、线程等配置提取到会话Session的Configuration配置类中统一维护。读完本文你将掌握网关核心组件「配置与实现解耦」的落地手法、Maven 打包跳过测试的工程化优化以及为后续 api-gateway-assist 组件化装配做准备所需的包结构划分思路。一、章节定位为什么需要网络通信配置提取第16章是《API网关》系列中承上启下的一章。在第18章里小傅哥已经用 Netty 构建出一套具备会话Session抽象的网关核心通信组件 api-gateway-core一次 HTTP 请求被抽象为一次会话完成建立连接、协议转换、方法映射、泛化调用、返回结果等一系列操作详见第1章HTTP请求会话协议处理。但此时这套核心通信组件存在一个明显的硬伤网络通信的配置信息是写死的。具体来说在 api-gateway-core-08 版本中Netty 服务的 IP 地址、端口、线程等配置直接固化在GatewaySocketServer类内部。这意味着网关算力服务的启动参数不可被外部调整每部署一套网关算力都需要改动核心代码无法通过配置驱动的方式让外部调用方向内部传递启动信息。而第16章的改造目的正如文档所明确的本章重点提取 Netty 通信服务配置信息包括IP、端口、线程等到会话的 Configuration 配置类中进行统一的维护和管理便于外部调用方向内部传递信息。这是一次典型的「配置提取Configuration Extraction」重构把变化的部分从代码中剥离出来交给统一配置模型承载从而让核心组件保持框架化、独立化的定位。二、改造动机从独立通信核心到可被装配的组件要理解本章为什么非改不可需要先看清 api-gateway-core 在整个网关体系中的角色定位。第1章就强调过之所以单独创建 api-gateway-core 工程是因为要把它独立于各种容器它不是直接与 SpringBoot 一起开发而是像 ORM 框架一样可以被独立使用、谁都可以结合见第1章。第9章进一步明确api-gateway-core 是整个网关最核心的通信层承接 HTTP 请求、调用 RPC 服务而 api-gateway-sdk 负责向 api-gateway-center注册中心推送注册接口再通过网关引擎 api-gateway-engine 拉取接口并在本地服务完成注册见第9章网关注册中心服务初始创建。第13章与第15章则引入了 api-gateway-assist 这个SpringBoot Starter 辅助组件它把 api-gateway-core 包装起来负责网关算力与注册中心之间的连接、服务配置拉取等能力见第13章服务发现组件搭建和注册网关连接与第15章服务配置拉取和组件使用验证。由此可以看清第16章的改造动机链条api-gateway-core独立通信核心配置写死 │ 第16章提取配置到 Configuration让外部可传参 ▼ api-gateway-assistSpringBoot Starter 包装组件 │ 第17章引入 core通过 GatewayAutoConfig 创建通信组件 Bean ▼ api-gateway-engine网关引擎启动算力服务第16章的配置提取工作正是为了在第17章开发的 api-gateway-assist-03 网关通信助手组件中让网关通信服务的启动可以指定 Netty 服务的 IP 地址和端口信息。也就是说配置提取不是孤立的重构而是整个网关组件化装配链路的前置准备。三、工程改造点一POM 打包优化跳过 test 阶段在动手改配置之前还需要处理一个工程化细节。由于 api-gateway-core 需要被打包成 Jar给 api-gateway-assist 引入使用每次执行mvn install时默认都会运行 test 阶段的测试。文档明确指出需要对 POM 配置进行优化避免每次打包都对 test 进行操作读者可以通过观察打包日志输出中的 install 过程来验证这一优化是否生效。在 Maven 工程中常见的跳过测试手段有两类二者语义不同需要区分属性效果说明maven.test.skiptrue跳过测试编译与运行测试代码都不会被编译速度最快skipTeststrue仅跳过测试运行测试代码仍会被编译只是不执行针对组件打包 Jar 给其他工程引入这一场景通常采用maven.test.skiptrue的粒度来加速打包。在 api-gateway-core 的 pom.xml 中可通过properties或maven-surefire-plugin插件配置实现properties maven.test.skiptrue/maven.test.skip /properties或使用 Surefire 插件显式声明build plugins plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-surefire-plugin/artifactId configuration skipTeststrue/skipTests /configuration /plugin /plugins /build注意以上是 Maven 通用配置写法第16章文档仅明确了优化 POM、避免每次打包都做 test 操作这一目标与验证方式未给出具体配置片段实际以仓库中 api-gateway-core 的 pom.xml 为准。验证方法很简单执行mvn install后观察日志输出中是否还出现 test 相关的编译与运行阶段。这个细节虽然不起眼却是组件化交付中很容易被忽略的成本点每次 install 都跑一遍测试在核心组件迭代频繁时会明显拖慢构建速度影响开发效率。四、工程改造点二包结构调整cn.bugstack.gateway→cn.bugstack.gateway.core第二个工程化改造点是包结构的调整这背后是一个组件隔离的设计考量。文档明确指出api-gateway-assist 引入 api-gateway-core 以后如果希望把这个 Jar 包就打入到 api-gateway-assist 中那么 api-gateway-core 的包结构最好是有一个区分的。但目前是cn.bugstack.gateway之后就是各个分层功能了所以我们调整为cn.bugstack.gateway.core的结构来处理。改造前后的对比维度改造前改造后根包名cn.bugstack.gatewaycn.bugstack.gateway.core内部结构根包后直接跟随各个分层功能根包后统一挂core再分层与 assist 代码的隔离包名相同易混淆包名区分Jar 打入后职责清晰为什么要做这样的区分原因在于api-gateway-assist 引入 api-gateway-core 的 Jar 后如果希望把这个 Jar 直接打入到 api-gateway-assist 中而不是作为外部依赖单独分发那么两个工程的类在同一个运行时中就会共存。此时如果包名雷同不仅 IDE 中难以区分类的归属还可能在类加载、自动配置扫描如ComponentScan、Spring Boot 的自动装配路径匹配时产生歧义。统一加上core后缀后api-gateway-core 的类路径变成cn.bugstack.gateway.core.*与 api-gateway-assist 自身的cn.bugstack.gateway.*层次清晰分开实现了源码层级上的物理隔离。这在《API网关》后续的章节如第28章网关组件工程模块合并中也为多个组件工程的拆分、合并预留了清晰的边界。五、核心改造点三Configuration 会话配置类承载网络通信配置完成 POM 与包结构的准备后真正的核心改造是把 GatewaySocketServer 中写死的网络配置提取到会话Session的 Configuration 配置类中统一维护。5.1 为什么放在 Configuration 里要理解这个设计选择需要回顾整个网关会话模型的架构。在《API网关》的会话模型中一次 HTTP 请求会被抽象为一次会话GatewaySession而会话的创建依赖配置对象。在仓库《API 网关 - 媲美美团这套Shepherd网关架构》一文展示的会话工厂实现中可以清晰看到 Configuration 的核心地位public class DefaultGatewaySessionFactory implements GatewaySessionFactory { private final Configuration configuration; public DefaultGatewaySessionFactory(Configuration configuration) { this.configuration configuration; } Override public GatewaySession openSession(String uri) { // 获取数据源连接信息这里把 Dubbo、HTTP 抽象为一种连接资源 DataSourceFactory dataSourceFactory new UnpooledDataSourceFactory(); dataSourceFactory.setProperties(configuration, uri); DataSource dataSource dataSourceFactory.getDataSource(); // 创建执行器 Executor executor configuration.newExecutor(dataSource.getConnection()); // 创建会话DefaultGatewaySession return new DefaultGatewaySession(configuration, uri, executor); } public Configuration getConfiguration() { return configuration; } }从这段源码可以推断Configuration是整个会话模型中的全局配置上下文——它不仅是会话工厂构造时必传的参数还被用于数据源属性设置、执行器创建并且通过gatewaySession.getConfiguration()在映射代理中获取接口语句信息如getHttpStatement(uri)。因此把 Netty 网络通信配置IP、端口、线程放进Configuration是顺应既有架构的选择外部调用方只需构建好一个 Configuration 并传入通信服务的启动参数、会话的创建参数、后续的服务映射注册信息全部经由同一个配置上下文统一管理避免了另起炉灶引入第二套配置模型。5.2 提取的配置项清单根据文档明确的包括IP、端口、线程等提取后的 Configuration 至少需要承载以下网络通信配置配置项含义在 Netty 中的使用位置IP 地址Netty 服务绑定/监听的地址ServerBootstrap.bind(ip, port)或 channel 绑定地址端口Netty 服务监听的端口ServerBootstrap.bind(ip, port)线程boss 线程数负责接收连接的 acceptor 线程数NioEventLoopGroup(bossThreads)线程worker 线程数负责 IO 读写与业务处理的线程数NioEventLoopGroup(workerThreads)结合 Netty 的常规服务端启动模型改造前这些值直接以字面量形式出现在GatewaySocketServer内部改造后则由外部通过 Configuration 注入。一个基于文档描述整理的设计示意字段名仅作示意以仓库实现为准// 示意网络通信配置从 GatewaySocketServer 提取到 Configuration 中 public class Configuration { // Netty 服务监听地址与端口 private String hostName; // IP 地址 private int port; // 端口 // Netty 线程模型 private int bossThreads; // 接收连接线程数 private int workerThreads; // IO 处理线程数 // 其余网关会话所需配置数据源、接口映射等 // ... }而GatewaySocketServer的职责则收敛为纯粹的服务启动器从 Configuration 中取出 hostName、port、bossThreads、workerThreads组装ServerBootstrap完成绑定与启动不再关心这些值从何而来。5.3 改造后的收益把配置从代码中提取出来后带来的直接收益可以归纳为三点可配置性网关算力的 IP、端口、线程数可以在启动时按需指定同一套 api-gateway-core Jar 可以支撑多套算力服务的差异化部署关注点分离GatewaySocketServer只负责怎么启动Configuration 负责用什么参数启动职责边界更清晰为组件化铺路外部调用方如 api-gateway-assist可以在 SpringBoot 环境中读取 application.yml 配置组装 Configuration 后再驱动通信组件的创建与启动实现外部传参、内部消费的闭环。六、配置提取后的使用方式与第17章组件装配衔接第16章的配置提取成果紧接着在第17章被真正使用。文档指出第17章会把 api-gateway-core【本章止最新版本】引入到 api-gateway-assist 中通过GatewayAutoConfig配置类对网关通信组件进行 Bean 对象的创建和启动随后在GatewayApplication中处理从网关注册中心拉取到的接口信息完成向 api-gateway-core 的注册映射操作详见第17章核心通信组件管理和处理服务映射。由此可以勾勒出配置提取后的完整使用链路application.yml外部配置IP、端口、线程等 │ 读取 ▼ GatewayAutoConfigSpringBoot 自动配置类 │ 组装 ▼ Configuration会话配置类承载网络通信配置 │ 传入 ▼ GatewaySocketServer / 会话工厂创建 Netty 服务与会话同时这一链路还会继续演进第18章会把网关的注册和拉取配置操作放到ApplicationContextAware接口的setApplicationContext方法中以便在注册服务、拉取配置过程中出现失败时直接抛异常关闭容器见第18章容器关闭监听和异常管理。可见Configuration 所承载的配置不仅是网络通信参数更是整个网关算力生命周期管理的配置底座。七、验证与自检清单完成本章改造后建议按以下清单进行验证POM 打包优化验证在 api-gateway-core 工程执行mvn install观察打包日志中 test 阶段是否被跳过确认 Jar 能被正常安装到本地仓库包结构一致性验证检查 api-gateway-core 下所有类的包声明是否已统一为cn.bugstack.gateway.core.*并确认没有遗留旧的cn.bugstack.gateway根包下的类配置提取验证确认GatewaySocketServer中不再存在写死的 IP、端口、线程字面量启动参数均从 Configuration 中读取外部传参验证在测试工程可参考后续第17章的ApiTest测试类思路中构建 Configuration 并指定 IP、端口启动通信服务后用 HTTP 客户端如网络调试助手访问http://localhost:{port}验证 Netty 服务按预期地址与端口监听。八、小结第16章「网络通信配置提取」虽然是一章中等难度★★☆☆☆的改造但它浓缩了组件化开发中几个高频出现的工程实践配置提取把写死在类中的 IP、端口、线程等参数收敛到会话的Configuration配置类中统一维护实现外部传参、内部消费构建优化通过优化 POM让核心组件打包时跳过 test 阶段提升mvn install的构建效率包结构治理将根包从cn.bugstack.gateway调整为cn.bugstack.gateway.core为 Jar 打入 assist 组件后的类隔离做好铺垫。这三个动作看似基础却共同决定了 api-gateway-core 能否从一个自娱自乐的独立通信组件进化为可以被 SpringBoot Starter 组件化装配、被外部配置驱动的网关算力核心。正如系列文档反复强调的编程中那些琐碎的细节才是真正的问题所在——配置提取这一章正是对这句话最好的注脚。如需继续追踪本章成果的落地效果可依次阅读仓库中的第17章核心通信组件管理和处理服务映射与第18章容器关闭监听和异常管理并结合《API 网关 - 媲美美团这套Shepherd网关架构》中的会话模型源码加深对 Configuration 在整个网关架构中地位的理解。【免费下载链接】CodeGuide:books: 本代码库是作者小傅哥多年从事一线互联网 Java 开发的学习历程技术汇总旨在为大家提供一个清晰详细的学习教程侧重点更倾向编写Java核心内容。如果本仓库能为您提供帮助请给予支持(关注、点赞、分享)项目地址: https://gitcode.com/gh_mirrors/code/CodeGuide创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表