详解API网关核心功能和API管理扩展
内部的微服务对外部访问来说位置透明,外部应用只需和网关交互
统一拦截接口服务,实现安全,日志,限流熔断等需求
大量适配器实现对遗留系统的遗留接口适配,多协议转换能力
进行数据的复制映射,路由等能力
非中心化架构-》走微服务里面的服务注册中心进行接口交互
中心化架构-》走网关进行接口服务暴露和共享交互
提供服务注册和服务接入的能力
提供服务代理和服务路由能力,能够将服务路由到具体的原始服务上
提供负载均衡能力(该点并不是必须具备)
其二是类似容器化集成和部署,已经可以通过Kubernetes实现了负载均衡
将一个已有的SOAP WS服务发布和注册为一个Http Rest接口服务。
将一个数据库表,或存储过程发布为一个Http Rest接口服务。
将一个JMS消息接口发布为一个Http Rest接口服务。
将一个JAR包中的API接口方法或函数发布为一个Http Rest接口服务。
云原生:与平台无关,Kong可以从裸机运行到Kubernetes
动态路由:Kong的背后是OpenResty+Lua,所以继承了动态路由的特性 限流和熔断
健康检查
日志:可以记录通过Kong的HTTP,TCP,UDP请求和响应。
鉴权:权限控制,IP黑白名单,同样是OpenResty的特性
SSL:Setup a Specific SSL Certificate for an underlying service or API
监控:Kong提供了实时监控插件
认证:如数支持HMAC,JWT,Basic,OAuth2.0等常用协议
REST API:通过Rest API进行配置管理,从繁琐的配置文件中解放
可用性:天然支持分布式
高性能:背靠非阻塞通信的Nginx,性能自不用说
插件机制:提供众多开箱即用的插件,且有易于扩展的自定义插件接口
consumer_id:可选参数,消费者id(启用了消费者认证可以使用,根据id识别发出请求的消费者);
config.http_endpoint:日志接收服务器(包括使用的协议,http or https);
config.method:可选参数,默认POST,访问日志服务器的请求方式(可选值:PUT,PATCH,POST);
config.timeout:可选参数,默认10000毫秒,请求超时时间;
config.keepalive:可选参数,默认60000毫秒,连接在关闭之前可存活时间。
Temporarily disable a Service (e.g. it is under maintenance).
Temporarily disable a Route (e.g. the rest of the Service is up and running, but a particular endpoint must be disabled).
Temporarily disable a Consumer (e.g. excessive consumption).
Authorization code(授权码模式):标准的Server授权模式,非常适合Server端的Web应用。一旦资源的拥有者授权访问他们的数据之后,他们将会被重定向到Web应用并在URL的查询参数中附带一个授权码(code)。在客户端里,该code用于请求访问令牌(access_token)。并且该令牌交换的过程是两个服务端之前完成的,防止其他人甚至是资源拥有者本人得到该令牌。另外,在该授权模式下可以通过refresh_token来刷新令牌以延长访问授权时间,也是最为复杂的一种方式。
Implicit Grant(隐式模式):该模式是所有授权模式中最简单的一种,并为运行于浏览器中的脚本应用做了优化。当用户访问该应用时,服务端会立即生成一个新的访问令牌(access_token)并通过URL的#hash传回客户端。这时,客户端就可以利用JavaScript等将其取出然后请求API接口。该模式不需要授权码(code),当然也不会提供refresh token以获得长期访问的入口。
Resource Owner Password Credentials(密码模式):自己有一套用户体系,这种模式要求用户提供用户名和密码来交换访问令牌(access_token)。该模式仅用于非常值得信任的用户,例如API提供者本人所写的移动应用。虽然用户也要求提供密码,但并不需要存储在设备上。因为初始验证之后,只需将OAuth的令牌记录下来即可。如果用户希望取消授权,因为其真实密码并没有被记录,因此无需修改密码就可以立即取消授权。token本身也只是得到有限的授权,因此相比最传统的username/password授权,该模式依然更为安全。
Client Credentials(客户端模式):没有用户的概念,一种基于APP的密钥直接进行授权,因此APP的权限非常大。它适合像数据库或存储服务器这种对API的访问需求。
异步特性:我们使用Jetty容器来部署应用,并开启Servlet3.0的异步特性,由于网关业务本身就是调用大量业务接口,因此IO操作会比较频繁,使用该特性能较大提升网关整体并发能力及吞吐量。
缓存:为了进一步提升网关的性能,我们增加了一层分布式缓存(借用Codis实现),将一些不经常变更的API元数据缓存下来,这样不仅减少了应用和DB的交互次数,还加快了读取效率。
链式处理:在设计网关的时候,我们采用责任链模式来实现网关的核心处理流程,将每个处理逻辑看成一个Pipe,每个Pipe按照预先设定的顺序先后执行。
平滑限流:消除了简单计数器限流带来的短时间内流量不均的问题。目前网关支持IP、店铺、API、应用ID和三方ID等多个维度的限流,也支持各维度的自由组合限流。
熔断降级:使用Hystrix进行熔断降级处理。Hystrix支持线程池和信号量2种模式的隔离方案,内部也开发了一个基于Hystrix的服务熔断平台。
预警监控:实时地从Kafka消费API调用日志,如果发现某个API的RT或者错误次数超过配置的报警阈值,则会立即触发报警。
隔离作用:作为企业系统边界,隔离外网系统与内网系统。
解耦作用:通过解耦,使得微服务系统的各方能够独立、自由、高效、灵活地调整。
脚手架作用:提供了一个地点,方便通过扩展机制对请求进行一系列加工和处理。
安全防护功能:API请求到达网关需要经过身份认证、权限认证,才能到达后端服务。
流量控制功能:API调用次数,异常,分级。流控粒度:分钟、小时、天。
请求管理功能:可根据配置进行参数类型、参数值(范围、枚举、正则)的校验
监控告警功能:提供实时、可视化的API监控,调用量、调用方式、响应时间、错误率。
API交易功能:提供API交易市场,计量计费、Quota控制、运营售卖等需求。
控制台:通过清晰的UI界面对网关集群进行各项配置。
集群管理:Goku网关节点是无状态的,配置信息自动同步,支持节点水平拓展和多集群部署。
热更新:无需重启服务,即可持续更新配置和插件。
服务编排:一个编排API对应多个backend,backend的入参支持客户端传入,也支持backend间的参数传递;backend的返回数据支持字段的过滤、删除、移动、重命名、拆包和封包;编排API能够设定编排调用失败时的异常返回。
数据转换:支持将返回数据转换成JSON或XML。
负载均衡:支持有权重的round-robin负载平衡。
服务发现:从Consul、Eureka等注册中心发现后端服务器。HTTP(S)反向代理:隐藏真实后端服务,支持Rest API、Webservice。
多租户管理:根据不同的访问终端或用户来判断。
访问策略:支持不同策略访问不同的API、配置不同的鉴权(匿名、Apikey、Basic)等。
灵活的转发规则:支持模糊匹配请求路径,支持改写转发路径等,可为不同访问策略或集群设置不同的负载。
IP黑白名单。
自定义插件:允许插件挂载在常见阶段,例如before match,access和proxy。
CLI:使用命令行来启动、关闭和重启Goku。
Serverless:在转发过程的每一个阶段,都可以添加并调用自定义的插件。
请求日志(access log):仅记录转发的基本内容,自定义记录字段与排序顺序,定期自动清理日志。
运行日志(system log):提供控制台和节点的运行日志,默认仅记录ERROR等级的信息,可将等级按实际情况调成INFO、WARN或DEBUG。
可扩展:简单易用的插件机制方便扩展功能。
高性能:性能在众多网关之中表现优异。
Open API:提供API对网关进行操作,便于集成。
版本控制:支持操作的发布和多次回滚。
监控和指标:支持Prometheus、Graphite。
开放策略:系统自带访问策略,使用开放策略时不需要传递策略ID参数;
普通策略:自定义访问策略,需要传递策略ID参数。
策略插件包括:流量控制、鉴权、IP黑白名单等。
API插件包括:参数映射、额外参数、熔断、服务降级等。
基于Netty NIO的响应式架构;分布式缓存基于Redis;数据库基于MySQL,分布式配置基于ZooKeeper。
API配置缓存,运行时不依赖DB,配置更新后自动通知各网关节点;
支持自定义组件,动态加载,在不中断网关服务的情况下重新加载配置和运行组件;
API服务连续异常后自动熔断和自我恢复,访问异常、超时处理;
网关核心运行过程不写磁盘IO,避免磁盘IO性能影响网关吞吐量;
Docker容器化支持,拆分网关、管理服务、第三方中间件依赖等镜像,便于灵活扩容。