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

news2024/10/6 17:17:53

🌈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 {

	@Autowired
	private 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.coloradmin.cn/o/1594682.html

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

相关文章

EasyUI Jquery 学习笔记 ——DataGrid(数据网格)与 Tree(树)详细版

1. DataGrid(数据网格)与 Tree(树) 1.1 Datagrid 数据网格 扩展自 $.fn.panel.defaults。通过 $.fn.datagrid.defaults 重写默认的 defaults。 数据网格(datagrid)以表格格式显示数据,并为选择、排序、分组和编辑数据提供了丰富的支持。数据网格(datagrid)的设计目…

前端三件套学习笔记(持更)

目录 1、HTML,CSS,JS区别 2、HTML结构 1、HTML,CSS,JS区别 结构写到 HTML 文件中&#xff0c; 表现写到 CSS 文件中&#xff0c; 行为写到 JavaScript文件中。 2、HTML结构 <!DOCTYPE html> <html><head><title>我的第一个页面</title><…

[尚硅谷flink] 检查点笔记

在Flink中&#xff0c;有一套完整的容错机制来保证故障后的恢复&#xff0c;其中最重要的就是检查点。 文章目录 11.1 检查点11.1.1 检查点的保存1&#xff09;周期性的触发保存2&#xff09;保存的时间点3&#xff09;保存的具体流程 11.1.2 从检查点恢复状态11.1.3 检查点算法…

计算机服务器中了rmallox勒索病毒怎么办,rmallox勒索病毒解密流程步骤

在企业的生产运营过程中网络发挥着巨大作用&#xff0c;利用网络可以拓宽市场&#xff0c;提高办公效率&#xff0c;网络为企业的生产运营提供了极大便利&#xff0c;但也为企业的数据安全带来隐患。近日&#xff0c;云天数据恢复中心接到多家企业的求助&#xff0c;企业的计算…

二维相位解包理论算法和软件【全文翻译- 菲林(Flynn)最小不连续性方法(4.5)】

4.5 菲林最小不连续性方法 在迄今为止对路径跟踪算法的讨论中,我们忽略了一种非常自然的方法,现在我们将对其进行描述。如果我们仔细观察图 4.42(a)中包裹相位数据中的条纹图案,就会发现 "条纹线 "或最亮像素和最暗像素之间的边界标志着从 0 到 2π 的过渡,它们…

Linux gcc 6

本章开始学习工具 什么是工具&#xff1f; 本质也是指令 yum 命令 小火车 sudo yum install sl&#xff08;安装sl&#xff09; sudo yum install -y sl //直接yes就不提示了 yum list //将yum源上的软件都穷举出来 yum search sl //结果不友好&#xff0c;不推荐 yum lis…

智能革命:未来人工智能创业的天地

智能革命&#xff1a;未来人工智能创业的天地 一、引言 在这个数字化迅速变革的时代&#xff0c;人工智能(AI)已经从一个边缘科学发展成为推动未来经济和社会发展的关键动力。这一技术领域的飞速进步&#xff0c;不仅影响着科技行业的每一个角落&#xff0c;更是为创业者提供了…

PTA 2813:画家问题(熄灯问题)

有一个正方形的墙&#xff0c;由NN个正方形的砖组成&#xff0c;其中一些砖是白色的&#xff0c;另外一些砖是黄色的。Bob是个画家&#xff0c;想把全部的砖都涂成黄色。但他的画笔不好使。当他用画笔涂画第(i,j)个位置的砖时&#xff0c; 位置(i−1,j)、 (i1,j)、(i,j−1)、(i…

设计模式学习笔记 - 设计模式与范式 -行为型:17.中介模式:什么时候用中介模式?什么时候用观察者模式?

概述 本章学习 23 种经典设计模式中的最后一个设计模式&#xff0c;中介模式。和之前讲过的命令模式、解释器模式类似&#xff0c;中介模式也不怎么常用&#xff0c;应用场景比较特殊、有限&#xff0c;但是&#xff0c;跟它俩不同的是&#xff0c;中介模式理解起来并不难&…

《手把手教你》系列基础篇(八十六)-java+ selenium自动化测试-框架设计基础-Log4j实现日志输出(详解教程)

1.简介 自动化测试中如何输出日志文件。任何软件&#xff0c;都会涉及到日志输出。所以&#xff0c;在测试人员报bug&#xff0c;特别是崩溃的bug&#xff0c;一般都要提供软件产品的日志文件。开发通过看日志文件&#xff0c;知道这个崩溃产生的原因&#xff0c;至少知道触发崩…

图文教程 | 2024Typora最新版免费激活使用教程(新旧版可用)

一、打开官网下载最新版Typora Typora 官网下载 安装&#xff1a; Typora中文官网&#xff1a;https://typoraio.cn/ Typora官网&#xff1a;https://typora.io/releases/all 官网长这个样子 下面这个不是官网&#xff01;&#xff01;&#xff01;&#xff01;注意&#x…

《一》Qt的概述

1.1 什么是Qt Qt是一个跨平台的C图形用户界面应用程序框架。它为应用程序开发者提供建立图形界面所需的所有功能。它是完全面向对象的&#xff0c;很容易扩展&#xff0c;并且允许真正的组件编程。 1.2 Qt的发展史 1991年 Qt最早由芬兰奇趣科技开发 1996年 进入商业领域&#x…

【Django开发】0到1美多商城项目md教程第7篇:登录,1. 互联开发者申请步骤【附代码文档】

美多商城完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;欢迎来到美多商城&#xff01;&#xff0c;项目准备。展示用户注册页面&#xff0c;创建用户模块子应用。用户注册业务实现&#xff0c;用户注册前端逻辑。图形验证码&#xff0c;图形验证码接口设…

结合 react-webcam、three.js 与 electron 实现桌面人脸动捕应用

系列文章目录 React 使用 three.js 加载 gltf 3D模型 | three.js 入门React three.js 3D模型骨骼绑定React three.js 3D模型面部表情控制React three.js 实现人脸动捕与3D模型表情同步结合 react-webcam、three.js 与 electron 实现桌面人脸动捕应用 示例项目(github)&…

Jackson 2.x 系列【19】模块 Module

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Jackson 版本 2.17.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-jaskson-demo 文章目录 1. 前言2. 核心类2.1 Module2.2 SimpleModule 3. 案例演示3.1 自定义模块3.2 注册…

ES查询和监控

es安装 参考https://blog.csdn.net/okiwilldoit/article/details/137107087 再安装kibana&#xff0c;在它的控制台里写es查询语句。 es指南 es权威指南-中文版&#xff1a; kibana用户手册-中文版&#xff1a; es中文社区 es参考手册API es客户端API es查询语句 # 查询e…

杰发科技AC7840——CAN通信简介(3)_时间戳

0. 时间戳简介 时间戳表示的是收到该CAN消息的时刻&#xff0c;通过连续多帧的时间戳&#xff0c;可以计算出CAN消息的发送周期&#xff0c;也可以用于判断CAN消息是否被持续收到。 1. 使用步骤 注意分别是发送和接收的功能&#xff1a; 2. 现象分析_接收时间戳 看下寄存器的…

鸿蒙端云一体化开发--开发云函数--适合小白体制

开发云函数 那什么是云函数&#xff1f;我们将来又怎么去使用这个云函数呢&#xff1f; 答&#xff1a;我们之前要编写一些服务端的业务逻辑代码&#xff0c;那现在&#xff0c;在这种端云一体化的开发模式下&#xff0c;我们是把服务端的业务逻辑代码&#xff0c;通过云函数来…

HackTheBox-Machines--MonitorsTwo

文章目录 0x01 信息收集0x02 CVE-2022-46169 漏洞利用0x03 权限提升0x04 提升到root权限 MonitorsTwo 测试过程 0x01 信息收集 a.端口扫描: 发现22、80端口    b.信息收集: 1.2.22 Cacti信息收集 nmap -sC -sV 10.129.186.1321.访问 10.129.186.132&#xff0c;为 1.2.22 Ca…

Java 面试宝典:你知道多少种解决 hash 冲突的方法?

大家好&#xff0c;我是大明哥&#xff0c;一个专注「死磕 Java」系列创作的硬核程序员。 本文已收录到我的技术网站&#xff1a;https://www.skjava.com。有全网最优质的系列文章、Java 全栈技术文档以及大厂完整面经 回答 在使用 hash 表时&#xff0c; hash 冲突是一个非常…