# API网关
**API网关是什么?**
API网关是随着微服务(Microservice)概念兴起的一种架构模式。原本一个庞大的单体应用(All in one)业务系统被拆分成许多微服务(Microservice)系统进行独立的维护和部署,服务拆分带来的变化是API的规模成倍增长,API的管理难度也在日益增加,使用API网关发布和管理API逐渐成为一种趋势。一般来说,API网关是运行于外部请求与内部服务之间的一个流量入口,实现对外部请求的协议转换、鉴权、流控、参数校验、监控等通用功能。
**为什么要做API网关?**
在没有API网关之前,业务研发人员如果要将内部服务输出为对外的HTTP API接口。通常要搭建一个Web应用,用于完成基础的鉴权、限流、监控日志、参数校验、协议转换等工作,同时需要维护代码逻辑、基础组件的升级,研发效率相对比较低。此外,每个Web应用都需要维护机器、配置、数据库等,资源利用率也非常差。
![API网关-为什么做](API网关-为什么做.png)
**Tomcat自身问题**
- **缓存太多**。Tomcat用了很多对象池技术,内存有限的情况下,流量一高很容易触发gc
- **内存copy**。Tomcat默认用堆内存,所以数据需要读到堆内,而后端服务是Netty,有堆外内存,需要通过数次copy
- **Tomcat读body是阻塞的**。Tomcat的NIO模型和Reactor模型不一样,读body是Block的
- **Tomcat对链接重用的次数是有限制的**。默认是100次,当达到100次后,Tomcat会通过在响应头里添加Connection:close,让客户端关闭该链接,否则如果再用该链接发送的话,会出现400
**Tomcat Buffer**
Tomcat buffer 的关系图如下:
![TomcatBuffer](TomcatBuffer.png)
通过上面的图,我们可以看出,Tomcat 对外封装的很好,内部默认的情况下会有三次 copy。
## 基本功能
- **反向代理**:类似于Nginx效果,实现外部HTTP请求反向代理转为内部RPC请求进行转发
- **动态发现**:加入后端微服务中心,实现动态发现后端服务实例
- **负载均衡**:根据后端服务的实例列表进行负载均衡分配
- **服务路由**:可以根据请求URL中的参数进行不同服务的调用路由
## 功能设计
### API发布
使用API网关的控制面,业务研发人员可以轻松的完成API的全生命周期管理,如下图所示:
![API网关-API生命周期管理](API网关-API生命周期管理.png)
业务研发人员从创建API开始,完成参数录入、DSL脚本生成;接着可以通过文档和MOCK功能进行API测试;API测试完成后,为了保证上线稳定性,管理平台提供了发布审批、灰度上线、版本回滚等一系列安全保证措施;API运行期间会监控API的调用失败情况、记录请求日志,一旦发现异常及时发出告警;最后,对于不再使用的API进行下线操作后,会回收API所占用的各类资源并等待重新启用。整个生命周期,全部通过配置化、流程化的方式,由业务研发人员全自助管理,上手时间基本在10分钟以内,极大地提升了研发效率。
### 配置中心
API网关的配置中心存放API的相关配置信息——使用自定义的DSL(Domain-Specific Language,领域专用语言)来描述,用于向API网关的数据面下发API的路由、规则、组件等配置变更。配置中心的设计上使用统一配置管理服务和本地缓存结合的方式,实现动态配置,不停机发布。API的配置如下图所示:
![API网关-配置中心](API网关-配置中心.png)
API配置的详细说明
- **Name、Group**:名字、所属分组
- **Request**:请求的域名、路径、参数等信息
- **Response**:响应的结果组装、异常处理、Header、Cookies信息
- **Filters、FilterConfigs**:API使用到的功能组件和配置信息
- **Invokers**:后端服务(RPC/HTTP/Function)的请求规则和编排信息