背景
关注Vert.x已有4年,在多个项目使用中见证了威力,也踩了很多坑,但对它的喜爱有增无减。一直想基于Vert.x开发一个类似Nginx的API网关,虽然zuul、spring cloud gateway已经很优秀,但是手撕API网关(重复造轮子)的心一直没有死。
在新冠疫情爆发期间,花了2周时间写了一个基本可用的API网关Agate,借此正好填补空虚失落的焦虑和抚慰多愁善感的心灵。下面介绍一下其架构和实现,更多可以参加源码工程:Agate。
架构
Agate由2部分组成:
Agate-Manager:
管理API的定义、配置信息,将这些信息持久化到数据库中,同时将要发布的API配置推送Consul中。
为了快速原型,当前使用spring mvc + jsp页面来实现的UI页面。
Agate-Gateway:
监听Consul中API配置的变更,执行API的部署和启停,同时接受API客户端的请求,并根据API定义做路由处理,期间会执行日志、限流、熔断、认证、缓存等增强处理。
Gateway使用了Vert.x框架,全异步流程处理,抽象了BeforeHandler、RouteHandler、AfterHandler、FailureHandler处理过程。
系统依赖
Vert.x 4.0 和 Consul 1.7
特性列表
BlackWhiteList 未实现
Logging 已实现
RateLimit 已实现
Tracing 已实现
Metrics 已实现
Security 未实现
CircuitBreaker 未实现
GrayDeployment 未实现
Routing 已实现
实现效果
结语
限于时间和水平有限,很多地方实现的不是太好,后续还要持续完善,也希望有志之士能参与建设。对于正在学习网络编程的同学来说,Vert.x是个不可多得好工具;对于研究高性能网关实现的同学来说,Agate是个不(自)可(吹)多(自)得(擂)的参考。