【自研网关系列】请求服务模块和客户端模块实现

🌈Yu-Gateway:基于 Netty 构建的自研 API 网关,采用 Java 原生实现,整合 Nacos 作为注册配置中心。其设计目标是为微服务架构提供高性能、可扩展的统一入口和基础设施,承载请求路由、安全控制、流量治理等核心网关职能。

🌈项目代码地址:https://github.com/YYYUUU42/YuGateway-master

如果该项目对你有帮助,可以在 github 上点个 ⭐ 喔 🥰🥰

🌈自研网关系列:可以点开专栏,参看完整的文档

目录

1、模块说明

2、请求服务模块

3、客户端

4、实现流程

1、模块说明

这个模块式是测试网关HTTP请求服务模块,后续需要开发过滤器链的功能,这个模块主要就是测试功能,毕竟是驴是马,还是需要拿出来溜一下才知道,网关的性能也是需要测试才知道如何的

2、请求服务模块

主要就是 controller 层发送请求,里面核心的是 @ApiService 和 @ApiInvoker 注解,在客户端实现

/*** @author yu* @date 2024-04-14*/
@RestController
@ApiService(serviceId = "backend-http-server", protocol = ApiProtocol.HTTP, patternPath = "/http-server/**")
@Slf4j
public class HttpController {@Autowiredprivate ApiProperties apiProperties;@ApiInvoker(path = "/http-server/ping")@GetMapping("/http-server/ping")public String ping() {log.info("{}", apiProperties);return "pong";}
}

3、客户端

主要类说明

ApiAnnotationScanner 是注解扫描类,扫描 ApiService、ApiInvoker 注解

ApiClientAutoConfiguration:自动装配

AbstractClientRegisterManager:抽象客户端注册管理器,支持多种协议,方便后续扩展

SpringMVCClientRegisterManager:SpringMVC 客户端注册管理器

4、实现流程

这里依旧用 debug 的方式来讲解流程,总体的执行流程如下

1、Spring Boot应用启动,读取 META-INF/spring.factories文件,查找所有的自动配置类。在您的项目中,spring.factories文件指定了ApiClientAutoConfiguration作为自动配置类。

2、Spring Boot创建并初始化 ApiClientAutoConfiguration 类。在ApiClientAutoConfiguration类的初始化过程中,会执行其中的 @Bean 方法,例如 springMVCClientRegisterManager(),并将其返回值注册为Spring容器中的bean。

在applicant.yml 配置文件中写入配置,将配置传入到 springMVCClientRegisterManager() 中

3、SpringMVCClientRegisterManager类的构造方法被执行,它继承了AbstractClientRegisterManager。在AbstractClientRegisterManager的构造方法中,初始化了 ApiProperties 和 RegisterCenter

这里会先父类的构造函数

public SpringMVCClientRegisterManager(ApiProperties apiProperties) {super(apiProperties);
}

依旧是用 spi 的方式将配置注册到 Nacos 中

protected AbstractClientRegisterManager(ApiProperties apiProperties) {this.apiProperties = apiProperties;//初始化注册中心对象ServiceLoader<RegisterCenter> serviceLoader = ServiceLoader.load(RegisterCenter.class);//获取注册中心实现 如果没有就报错registerCenter = serviceLoader.findFirst().orElseThrow(() -> {log.error("not found RegisterCenter impl");return new RuntimeException("not found RegisterCenter impl");});//注册中心初始化代码registerCenter.init(apiProperties.getRegisterAddress(), apiProperties.getEnv());
}

4、Spring Boot 继续初始化其他的 bean。如果 AbstractClientRegisterManager 有其他的初始化方法,那么这些方法将会被执行。这里没有其他的 bean,所以直接到下一步

5、当Spring Boot应用启动时,SpringMVCClientRegisterManager 的 onApplicationEvent 方法将会被调用,因为它实现了 ApplicationListener<ApplicationEvent> 接口。在 onApplicationEvent 方法中,它会检查传入的事件是否是 ApplicationStartedEvent 。如果是,那么它会调用 doRegisterSpringMvc方法 ,进行服务的注册。

@Override
public void onApplicationEvent(ApplicationEvent applicationEvent) {//监听spring启动事件if (applicationEvent instanceof ApplicationStartedEvent) {try {//执行具体的springmvc项目注册doRegisterSpringMvc();} catch (Exception e) {log.error("doRegisterSpringMvc error", e);throw new RuntimeException(e);}log.info("springmvc api started");}
}

6、在doRegisterSpringMvc方法中,首先获取所有的RequestMappingHandlerMapping,然后遍历所有的请求处理映射器,获取所有的HandlerMethod。对于每一个HandlerMethod,扫描服务得到服务定义信息,然后创建服务实例,最后调用register方法进行服务的注册。

服务的实例和定义

弄好之后就可以在 Nacos 看到服务了

服务具体信息

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

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

相关文章

传送指令三菱

1&#xff0c;mov指令表示接通后一直传送 2&#xff0c;movP 接通后只传送一次 3&#xff0c;DMOV 32位传送 1&#xff0c; m0 接通 执行一次写入 值改变了 2&#xff0c;m1 接通 执行写入 值变为6 断开M1 值未发生变化 断开M0 在执行写入 值变为5 dmov 32 位 mov 16位 实…

基于物理原理的p-GaN HEMT动态导通电阻SPICE建模

来源&#xff1a;Physics-Based SPICE Modeling of Dynamic ON-State Resistance of p-GaN HEMTs&#xff08;TPEL 23年&#xff09; 摘要 这封快报介绍了一种新型基于物理学原理的SPICE建模方法&#xff0c;专门针对氮化镓基p型门极高电子迁移率晶体管&#xff08;p-GaN HEM…

如何选择最好的数据恢复软件?最佳免费数据恢复软件集

丢失或删除文件并不意味着它已从您的设备中永久删除。 下次您不小心删除或丢失文件时&#xff0c;请不要惊慌&#xff0c;丢失的文件仍然可以恢复&#xff0c;但前提是您迅速采取行动。 驱动器具有用于存储文件的目录。删除数据需要很长时间&#xff0c;因此您删除的任何文件都…

计算机炸了,电子信息也是劝退专业?

还不是因为这个版本&#xff0c;计算机专业受到了制裁&#xff0c;导致这些偏计算机类的专业也受到了牵连 我本科的时候是一所双一流院校的计科专业&#xff0c;我们学校的电子信息专业堪称苦逼&#xff0c;我们计科学的东西&#xff0c;他们都要学&#xff0c;他们学的一些东…

PostgreSQL入门到实战-第三十弹

PostgreSQL入门到实战 PostgreSQL教程网站官网地址PostgreSQL概述更新计划 PostgreSQL教程网站 https://www.postgresqltutorial.com/ 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://www.postgresql.org/PostgreS…

MySQL优化慢SQL的6种方式

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《mysql经验总结》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途 目录 写在前面 优化思路 优化方法 1.避免查询不必要的列 2.分页优化 3.索引优化 4.JOIN优化 5.排序优化 6.UNION 优化…

【MYSQL】MySQL整体结构

无论你是前端还是后端&#xff0c;只要是一个合格的开发者&#xff0c;对于MySQL这个名词相信都不陌生&#xff0c;MySQL逐渐成为了最受欢迎的关系型数据库&#xff0c;无论你是大前端&#xff0c;亦或是Java、Go、Python、C/C、PHP....等这些语言的程序员&#xff0c;对于MySQ…

蓝牙技术在智能硬件中应用火热,你的蓝牙适配测试如何解决?

蓝牙技术在物联网中的应用非常广泛&#xff0c;可以为人们的生活和工作带来更多的便利和智能化体验&#xff0c;主要五大核心应用场景&#xff0c;具体如下&#xff1a; 1、智能家居 通过蓝牙连接智能家居设备&#xff0c;如智能灯泡、智能插座、智能恒温器等&#xff0c;可以…

Android Emulator 构建和启动

Android Emulator 构建和启动 AVD 的创建和启动 欢迎入群交流 编译模拟器 下载Android源码 参考文章 Android AOSP 下载和编译 source ./build/envsetup.sh编译x86-64,userdebug版本 lunch sdk_phone_x86_64-userdebug编译arm64,userdebug版本 lunch sdk_phone_arm64-userd…

Python列表到Excel表格第一列的转换技术详解

目录 一、Python列表与Excel表格的关系 二、所需工具与库 三、使用openpyxl将列表写入Excel第一列 四、使用pandas将列表写入Excel第一列 五、案例分析与注意事项 六、扩展应用与进阶学习 七、总结与展望 在数据处理和分析中&#xff0c;经常需要将Python中的数据&#…

【复习笔记】FreeRTOS(六) 队列操作

本文是FreeRTOS复习笔记的第六节&#xff0c;队列操作。 上一篇文章&#xff1a; 【复习笔记】reeRTOS(四) 列表项的插入和删除 文章目录 1.队列操作1.1.队列操作过程1.2.队列操作常用的API函数 二、实验设计三、测试例程四、实验效果 1.队列操作 队列是为了任务与任务、任务与…

Java编程练习之多重继承

在Java中类不允许多重继承&#xff0c;但使用接口可以实现多重继承&#xff0c;因为一个类可以同时实现多个接口&#xff0c;这样可以将所有需要实现的接口放在implements关键字后&#xff0c;并使用英文逗号隔开&#xff0c;但这可能会在一个类中产生庞大的代码量&#xff0c;…