自研一套高性能API网关,你都需要做什么?

本文涉及的产品
云原生 API 网关,700元额度,多规格可选
简介: 本文介绍了自研API网关的基本组成和架构,涵盖网关的作用、请求生命周期、功能点详解(如插件和规则)、技术选型(Java、Netty、Nacos)及设计要点。通过异步化设计、缓存、串行化优化、提高吞吐量和合理配置工作线程,确保高性能与稳定性。最后,提供了网关的架构图,帮助读者全面理解其构建过程。

一、引子

其实有点小小的标题党啦,毕竟相信各位读者对“高性能”的追求是永无止境的。但如果你确实有打算自研一套API网关,那么我认为了解构建它的基本组成和架构是很有必要的,本篇博客主要是围绕这些东西做一个整体的介绍。

二、基本概念

1.网关的作用

简单来说,网关就是客户端与后端服务沟通的桥梁。网关负责接收客户端发来的请求,并将它转发到相应的后端服务上进行处理。因此,网关可以承接来自外部的Http协议请求,并将其转换为服务内部的协议请求,比如dubbo、grpc等。另外,既然作为访问后端服务的入口,那么监控统计、熔断限流等等都可以实现。

2.请求的生命周期

从客户端的请求到服务端返回处理的结果,大致经过了以下流程:
1.png

3.功能点详解

  • 执行各种插件

我们在上面的作用里提到的那些功能都是由一个一个插件提供的,比如协议转换插件、认证鉴权插件、黑白名单插件等,通过各种各样的插件构建了网关强大的功能。在实际场景里,我们也可以根据自己的业务需求去开发插件。

  • 规则

一次请求根据业务需求不一定要执行全部的插件,所以就需要规则去定义某个请求需要执行哪些插件,访问哪些路径。

三、技术选型

1.基础架构

Java原生-这里可能有的读者就有疑问了,Java和高性能有点“冲突”吧,市面上现在主流的网关Java写的也没几个,上来就整个Java算怎么回事呢?

这里提一嘴我对技术选型的看法:性能是很重要,但是我觉得还有一个重要的考虑点就是团队的规模。假如说当前你们是个小团队,大家就是Java用的最熟练,老板短期内也不考虑继续招人。这个时候选择不熟悉的技术,那应该是当前工作量不饱和了。在我眼里,稳定 > 性能!

2.网络通信框架

Netty-这个没什么好说的,既然语言选择了Java,网络通信框架选择它就是毋庸置疑的,高性能 + 高可靠。

3.注册中心和配置中心

Nacos-注册中心和配置中心是网关几乎必备的功能,这里的单一选择都是非常多的,就不赘述了。我来说明选择Nacos的原因。一方面它支持Java,另一方方面它把两个功能都集成了,维护成本-1。当然,它的功能也很强大,例如动态服务发现、服务配置、服务共享与管理等等。

四、设计要点

1.异步化设计

通过对请求生命周期的分析,在该异步化的地方就做异步化处理是提高性能的关键。例如:请求转发、请求响应、插件过滤等。并且对于不同的事件还需要采取不同的异步模式,例如插件过滤采用异步阻塞模式、请求响应则采用异步非阻塞模式。

2.充分使用缓存

缓存可以说是优化性能的大杀器,大家在日常工作中肯定对于redis也是常伴身边,但网关这里的缓存我们尽量还是使用内存作为缓存更为合适,相应的数据结构可以用Map、Queue等。为什么不用redis呢?因为和任何中间件进行通信都有IO成本,对于追求高性能的我们当然是要规避的。

3.合理使用串行化

有的读者看到这里可能会困惑,串行化不是和高性能相矛盾吗?我要并行!但事无绝对,从场景出发,如果是耗时较小的一系列任务,我们采用并行的方式执行,频繁的上下文切换带来的成本可能远远大于任务本身的执行成本。所以,对于那些耗时较久、任务之间并没有直接依赖关系,例如RPC远程调用才更适合并行化。

4.提高吞吐量

提高吞吐量其实就是提升缓冲能力,在流量高峰期间使用本地缓冲,例如Disruptor、MPMC等。

5.合适的工作线程

根据任务的类型选择合适的工作线程:

  • CPU密集型

配置公式:CPU核数+1

  • IO密集型

配置公式1:CPU核数*2

配置公式2:CPU核数 / (1-阻塞系数) 通常0.8-0.9之间

五、架构图

通过对上述内容的总结,我们可以抽象出该网关的标准的架构图:
2.png

目录
相关文章
|
2月前
|
SQL 缓存 测试技术
构建高性能RESTful API:最佳实践与避坑指南###
—— 本文深入探讨了构建高性能RESTful API的关键技术要点,从设计原则、状态码使用、版本控制到安全性考虑,旨在为开发者提供一套全面的最佳实践框架。通过避免常见的设计陷阱,本文将指导你如何优化API性能,提升用户体验,确保系统的稳定性和可扩展性。 ###
71 12
|
3月前
|
中间件 Go API
使用Go语言构建高性能RESTful API
在现代软件开发中,RESTful API因其简洁和高效而成为构建网络服务的首选。Go语言以其并发处理能力和高性能著称,是开发RESTful API的理想选择。本文将介绍如何使用Go语言构建RESTful API,包括基础的路由设置、中间件的使用、数据验证、错误处理以及性能优化。通过实际代码示例,我们将展示Go语言在API开发中的强大功能和灵活性。
|
4月前
|
Go API 开发者
深入探讨:使用Go语言构建高性能RESTful API服务
在本文中,我们将探索Go语言在构建高效、可靠的RESTful API服务中的独特优势。通过实际案例分析,我们将展示Go如何通过其并发模型、简洁的语法和内置的http包,成为现代后端服务开发的有力工具。
|
3月前
|
消息中间件 缓存 API
构建高性能RESTful API的策略与实践
构建高性能RESTful API的策略与实践
44 0
|
4月前
|
前端开发 关系型数据库 MySQL
ThingsGateway:一款基于.NET8开源的跨平台高性能边缘采集网关
ThingsGateway:一款基于.NET8开源的跨平台高性能边缘采集网关
128 2
|
4月前
|
运维 监控 Kubernetes
高效应对突增流量:构建弹性高性能的SMS网关策略
本篇内容来自于ArchSummit全球架构师峰会演讲实录。
196 1
|
5月前
|
缓存 API 数据库
打造高性能后端API:从设计到部署的实战之旅
【8月更文挑战第31天】在数字化时代的浪潮中,后端API成为了连接用户、数据与服务的桥梁。本文将带领读者踏上一段从API设计、开发到部署的旅程,通过实际案例分析,揭示如何构建一个高性能的后端系统。我们将探讨现代后端架构的关键要素,包括RESTful API设计原则、数据库优化技巧、缓存策略、以及容器化部署的实践。文章旨在为开发者提供一套实用的方法论,帮助他们在面对复杂业务需求时,能够设计出既高效又可扩展的后端服务。
|
5月前
|
UED 存储 自然语言处理
【语言无界·体验无疆】解锁Vaadin应用全球化秘籍:从代码到文化,让你的应用畅游世界每一个角落!
【8月更文挑战第31天】《国际化与本地化实战:构建多语言支持的Vaadin应用》详细介绍了如何使用Vaadin框架实现应用的国际化和本地化,提升用户体验和市场竞争力。文章涵盖资源文件的创建与管理、消息绑定与动态加载、日期和数字格式化及文化敏感性处理等方面,通过具体示例代码和最佳实践,帮助开发者构建适应不同语言和地区设置的Vaadin应用。通过这些步骤,您的应用将更加灵活,满足全球用户需求。
70 0
|
5月前
|
API 数据库 UED
全面解析构建高性能API的秘诀:运用Entity Framework Core与异步编程提升Web应用响应速度及并发处理能力的详细指南与实践案例
【8月更文挑战第31天】本文详细介绍了如何利用 Entity Framework Core (EF Core)的异步编程特性构建高性能 API。通过创建基于 EF Core 的 .NET Core Web API 项目,配置数据库上下文,并定义领域模型,文章展示了如何使用异步方法进行数据查询、加载相关实体及事务处理。具体代码示例涵盖了 GET、POST、PUT 和 DELETE 操作,全面展示了 EF Core 异步编程的优势,有助于提升 API 的响应速度和处理能力。
66 0
|
5月前
|
缓存 JavaScript API
构建高性能后端API:从理论到实践
【8月更文挑战第31天】 在数字化浪潮的推动下,后端API的性能成为影响用户体验和应用响应速度的关键因素。本文将带你深入理解高性能API的设计原则和实现方法,通过具体的代码示例展示如何优化API性能,确保你的后端服务能够快速、稳定地处理大量请求。