# api-gateway **Repository Path**: shao-mingtao/api-gateway ## Basic Information - **Project Name**: api-gateway - **Description**: 自研网关框架 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2024-04-06 - **Last Updated**: 2025-03-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # gateway ## 绪论 ### 引言 在当今日益复杂和快速变化的网络环境中,分布式系统已经成为了构建高性能、高可靠性网络应用的核心。随着云计算、物联网和大数据等领域的迅猛发展,对于分布式系统的需求愈发迫切。分布式系统的优势在于能够将计算和存储资源分布在不同的节点上,从而实现更好的资源利用和横向扩展能力。然而,分布式系统的复杂性也带来了诸多挑战,如网络通信延迟、节点间数据一致性、服务发现与注册等问题。 在分布式系统中,网关作为连接客户端与服务端的关键组件,起着桥梁和转发的作用。它负责处理外部请求,进行路由转发、负载均衡、安全认证等关键功能,对于整个系统的性能、可靠性和安全性起着至关重要的作用。因此,设计和实现一个高效、可扩展的分布式网关框架对于构建稳定、可靠的分布式系统至关重要。 我的毕业设计旨在借助Netty这一高性能的网络通信框架,结合自主研发的分布式路由、负载均衡、流量控制和安全认证等模块,构建一个灵活、高效、可扩展的分布式网关解决方案。我的目标是打造一个开放、易用的网关框架,提供给开发者一个稳定、高性能的网关服务,助力他们快速构建和部署分布式系统,实现业务的快速迭代和持续创新。 ### 研究背景 ##### 国内外研究现状 几种业内常用的分布式网关技术选型 - Nginx+OpenResty ​ 缺点是基于lua语言开发的,不适合后期进行业务扩展或者是功能增强 - KONG+APISIX 是一种强大的分布式网关的解决方案,但是在社区并不是非常活跃 - Netflix+Zuul1.0 最大的缺点就是是基于阻塞IO开发的,性能非常的差 同时尽管更新后的2.0版本解决了阻塞IO的问题,但是进入了维护期,开发前景不明朗 *论文里面换成表格展示* ![image-20240406140711480](C:\Users\MattS\AppData\Roaming\Typora\typora-user-images\image-20240406140711480.png) ### 研究意义和内容 研究意义:本论文旨在探讨自研分布式网关解决方案的意义和实现内容。现有的大部分的分布式网管解决方案已经经过广泛实践,但仍存在一些局限性。因此,本文将从以下三个方面展开讨论: - 开源网关的不足之处:现有的开源网关解决方案存在组件繁多、功能复杂等问题,不符合团队的技术栈和需求。例如,某些解决方案可能在同步阻塞请求上性能较差,或者在解决漏洞时受制于开源社区的排期,影响系统的稳定性和开发进度。 - 自研网关解决方案的优势:自研网关可以根据团队需求灵活配置同步和异步请求,提高系统的一致性和可靠性。此外,自主开发的网关可完全掌控开发和维护进度,降低运维成本,并根据团队技术优势进行定制化开发,提高技术实力。 - 未来展望:通过本项目的研究与实践,旨在建立一个优秀的的开源分布式网关解决方案。 研究内容: - 灵活的配置选项:实现网关的配置选项,使得用户可以根据具体需求自定义配置,包括同步和异步请求的处理、路由规则、安全策略等。 - 高性能和可扩展性:设计和优化网关的性能,确保其能够处理大规模的请求流量,并具备良好的水平扩展性,以适应企业级应用的需求。 - 多样化的插件支持:提供丰富的插件系统,允许用户根据需要扩展网关的功能,例如认证、限流、日志记录等,以满足不同场景下的需求。 - 稳定性和安全性:保证网关的稳定性和安全性,包括对潜在漏洞的及时修复、对攻击的防范等,以确保企业数据和系统的安全。 - 易用性和文档支持:提供清晰易用的接口和文档,降低用户上手门槛,使得用户能够快速上手并正确使用网关。 - 社区参与和持续优化:搭建社区平台,吸引更多开发者参与到网关的优化和改进中,持续推动项目的发展和完善。 综合以上功能和研究内容,自研网关框架将具备高度可定制化、高性能、稳定性和安全性,并且要能够吸引社区参与,持续优化和改进。 ## 问题综述 分布式网关作为企业微服务架构中的关键组成部分,承担着连接内部服务和外部用户请求的关键角色。它不仅仅是一个简单的请求转发器,更是一个功能强大的中间层,负责处理路由转发、协议转换、监控统计、熔断限流和日志记录等任务。随着企业服务数量的增加和服务间依赖关系的复杂化,分布式网关的重要性日益凸显。 在微服务架构中,服务之间的调用频繁且复杂,服务可能使用不同的协议和接口规范,这增加了系统的耦合度和管理难度。分布式网关的引入,使得企业能够更加灵活地管理和监控服务之间的通信,提高了系统的可观察性和稳定性。它可以统一管理服务的访问权限和安全策略,实现对外部请求的过滤和控制,确保企业数据和系统的安全性。 尽管引入分布式网关可能会增加系统的复杂性,但其带来的好处是不言而喻的。对于服务数量庞大、复杂度高的企业而言,分布式网关是确保系统可靠性和可扩展性的重要保障。因此,深入了解分布式网关的作用和功能,对于构建稳健、高效的微服务架构具有重要意义。 ## 软件架构 ### 网关的生命周期 1. **接收请求**: - 网关接收来自客户端的HTTP请求。 - 进行请求的验证,包括验证请求的原地址、目标地址、协议和端口,以及客户端身份验证,以确保请求的安全性。 2. **解析请求**: - 对接收到的请求进行解析,包括解析请求方法、URL、请求参数和请求头等信息。 3. **资源定位**: - 根据请求的目标地址和协议,将请求路由到正确的后端服务器上。 4. **获取服务实例**: - 通过负载均衡算法选择合适的后端服务器实例,确保请求能够均衡地分发到不同的服务器上。 5. **发送请求**: - 将请求转发给选定的后端服务器实例,以便服务器处理请求。 6. **接收响应**: - 网关接收来自后端服务器的响应,包括处理完成的数据或错误信息。 7. **返回响应**: - 将服务器处理完成的响应返回给客户端,确保客户端能够获取到请求的结果。 **请求的整个生命流程** ![image-20240406144717705](C:\Users\MattS\AppData\Roaming\Typora\typora-user-images\image-20240406144717705.png) ### 功能点 ### 拓扑结构 ![image-20240406151741303](C:\Users\MattS\AppData\Roaming\Typora\typora-user-images\image-20240406151741303.png) *拓扑架构后面可以写一些每个部分具体是干啥的* ### 技术选型 - 原生Java:使用原生Java的目的是为了极致的轻量化,同时不引入Spring等框架不仅仅是为了实现架构的轻量化,也是防止用户在基于Spring相关框架的时候出现版本依赖问题或是其他第三方依赖导致的问题。降低用户使用的复杂度。 - Netty: Netty采用了异步、事件驱动的设计,能够实现高效的网络通信。通过利用NIO(Non-blocking IO)机制,可以处理大量并发连接,提高系统的吞吐量和响应速度。特别是在网关项目中,能够处理大量的并发请求。同时, Netty提供了灵活的扩展机制和组件化的设计,使得开发者可以根据项目需求轻松地定制和扩展功能。其模块化的结构使得新增功能的集成变得更加简单。在该项目中,灵活的扩展机制和组件化的设计使得网关框架有更高的自由度的更多的拓展接口,能够适应不同的部署场景。 - 注册中心:Nacos - 配置中心:Nacos Nacos设计为高可用和可靠的分布式系统,支持集群部署和故障转移,可以确保服务的连续可用性。Nacos提供了灵活而强大的服务注册和发现功能,使得服务之间可以轻松地相互发现和调用,支持多种服务发现模式,如基于DNS、基于HTTP和基于RPC的服务发现。Nacos支持动态配置管理,可以动态地管理应用程序的配置信息,包括数据库连接、日志级别、业务参数等,而无需重新部署应用程序。 Nacos提供了统一的配置中心,集中管理各种配置信息,包括应用程序配置、分布式系统配置、微服务配置等,使得配置管理变得更加简单和便捷。Nacos支持健康检查和流量管理功能,可以实时监控服务的健康状态,并根据需求进行流量控制和负载均衡,保障系统的稳定性和可靠性。Nacos采用了分布式一致性算法,确保集群中各个节点之间的数据一致性和同步性,避免了数据的冲突和不一致性。Nacos提供了丰富的开放API和插件机制,支持与各种第三方系统和框架进行集成,如Spring Cloud、Dubbo、Kubernetes等,具有良好的生态整合能力。 ## 高性能网关的核心功能 ### 异步化设计 异步化的目的是为了提高系统的响应速度和吞吐量,同时能够较好的处理突发大流量场景,在分布式网关中主要有这几个部分需要进行异步化设计 请求转发异步化 请求响应异步化 插件过滤异步化 同时异步化也分为单异步模式和双异步模式。 单异步模式是指在任意时刻只能有一个方向进行数据传输,双异步模式允许同一时刻内双向进行数据传输。 在该项目的架构中,鉴于插件过滤只存在单向的数据传输,因此插件过滤使用单异步模式,对于请求的转发和响应使用双异步模式。 **基于CompletableFuture的异步化实现 ** CompletableFuture是JDK原生类,提供了对于异步化编程的支持,通过链式编程非常简洁的实现了异步化设计。 ### 充分使用缓存降低读写压力 ### 合理使用串行化 并不是始终使用并行的设计,对于耗时较久,人物之间并没有依赖关系的,例如远程RPC调用的场景,就建议使用串行化而不是并行化。 ### 高吞吐量(Disraptor) 理论上是可以使用第三方的消息中间件做一个削峰填谷以实现高吞吐量的,但是既然是轻量化框架,引入第三方的消息中间件势必会导致框架的复杂度提高,同时第三方的消息中间件也会涉及到大量的网络传输,不仅会降低系统的性能,甚至还会出现消息丢失的可能性,在分布式网关中,低性能和消息丢失都是不可容忍的。 所以推荐使用本地缓存Disraptor或者是MPMC ### 高效的工作线程管理 ## 网关架构图 ![image-20240406171258752](C:\Users\MattS\AppData\Roaming\Typora\typora-user-images\image-20240406171258752.png) Common:维护项目中的公共代码 Register Center:用于服务注册和发现 Config Center:统一配置中心 Container:包装网关的所有核心功能 Context:封装请求上下文 FilterChain:通过责任链设计模式将这个执行过程穿起来 **执行流程图** ![image-20240406174101963](C:\Users\MattS\AppData\Roaming\Typora\typora-user-images\image-20240406174101963.png) ## gateway-core设计(主要就是BootStrap) core主要实现的功能: - 加载网关静态配置 - 插件初始化 - 连接配置中心,将配置中心数据加载到网关,监听配置中心 - 启动容器 - 连接注册中心,将注册中心的实例加载到本地 #### **基于领域模型(DDD)进行设计** **什么是领域模型** 领域模型设计是软件开发中一种重要的设计方法,它主要关注于对业务领域的建模和抽象,以解决复杂业务需求并实现高内聚、低耦合的软件系统。下面详细讲解领域模型设计的主要内容和特点: 1. **业务领域的建模:** 领域模型设计首先要对业务领域进行建模,即将现实世界中的业务问题抽象为软件系统中的领域模型。通过对业务需求和业务规则的分析,将业务领域划分为不同的概念和实体,并定义它们之间的关系和行为。 2. **领域对象和实体:** 在领域模型设计中,通常会定义各种领域对象和实体,代表了业务领域中的各种概念和实体。这些对象和实体通常会反映出业务需求的本质和特点,如订单、产品、用户等。 3. **领域服务和业务逻辑:** 除了领域对象和实体之外,领域模型设计还包括了领域服务和业务逻辑的定义。领域服务通常是对特定业务操作的封装,它们提供了对领域对象和实体的访问和操作接口。业务逻辑则是对业务规则和约束的实现,它们定义了业务操作的行为和流程。 4. **聚合和聚合根:** 在领域模型设计中,常常会使用聚合和聚合根来组织和管理领域对象。聚合是一组相关联的领域对象的集合,而聚合根则是这个集合中的一个特定对象,它负责管理整个聚合的生命周期和一致性。 5. **领域事件和领域通知:** 领域模型设计还可以包括领域事件和领域通知的定义,用于实现领域对象之间的消息传递和事件驱动的编程模式。通过领域事件和领域通知,可以实现领域对象之间的解耦和协作。 6. **领域模型与数据模型的映射:** 领域模型设计通常会与数据模型进行映射,将业务领域中的概念和实体映射到数据库表和字段中。这种映射可以通过对象关系映射(ORM)工具来实现,从而实现领域模型与数据模型之间的无缝集成。 总的来说,领域模型设计是一种面向业务的设计方法,它通过对业务领域的建模和抽象,实现了软件系统与业务需求的高度契合和灵活性。在实际应用中,领域模型设计通常与领域驱动设计(DDD)等方法结合使用,以实现复杂业务系统的设计和开发。 #### 核心上下文模型封装 - Context上下文核心定义 - BaseContext基础上下文实现 - 上下文参数 - GaetwayRequest实现 - GaetwayResponse实现 #### 请求响应设计 ## gateway-config-center设计 ## gateway-register-center设计