前言
随着系统规模变大、复杂度越来越高,微服务架构渐渐成为主流。当一个单体应用被拆分成许许多多的微服务应用后,也带来了一些问题。一些与业务非强相关的功能,比如权限控制、日志输出、数据加密、熔断限流等,每个微服务应用都需要,因此存在着大量重复的代码实现。而且由于系统的迭代、人员的更替,各个微服务中这些功能的实现细节出现了较大的差异,导致维护成本变高。另一方面,原先单体应用下非常容易做的接口管理,在服务拆分后没有了一个集中管理的地方,无法统计已存在哪些接口、接口定义是什么、运行状态如何。
网关就是为了解决上述问题。作为微服务体系中的核心基础设施,一般需要具备接口管理、协议适配、熔断限流、安全防护等功能,各种开源的网关产品(比如 zuul)都提供了优秀高可扩展性的架构、可以很方便的实现我们需要的一些功能、比如鉴权、日志监控、熔断限流等。
但是,仅有这些功能还不够。企业内部系统一般都是异构的,存在多种协议的接口,而对外提供服务的接口依然是 http 协议的。因此,协议转换是非常现实的需求。还有数据聚合的能力,开源产品提供的都是一对一路由功能,并不直接提供聚合、编排的能力。而在实际开发中,需要对一些小接口进行聚合是很常见的,如果需要去写代码、发布就会很繁琐,而且以后小接口升级还得同步更新。
因此,我们参考 SpringCloud 网关产品的优秀设计理念,在基础网关的功能上支持多种下游协议、支持服务编排功能,并提供可视化的配置平台。
1 技术选型
1.1 方案对比
我们选择了 Java 微服务体系中三个主流的 API 网关框架 Zuul1、Zuul2 和 SpringCloud Gatewa