当前位置: 首页 > 科技观察

HTTPAPI网关选择之一Kong简介

时间:2023-03-15 19:09:53 科技观察

Kong是Mashape开源的高性能高可用API网关和API服务管理层。它基于OpenResty,进行API管理,并提供插件实现API的AOP。Kong在Mashape中管理超过15,000个API,支持200,000名开发人员,每月处理数十亿个请求。本文将从架构、API管理、插件三个层面介绍Kong。1.架构按照康威定律,我们的系统架构将被拆解。系统由一堆服务组成,如下图所示:比如在访问库存服务、优惠券服务、价格服务之前会做一些特殊的处理,比如限流、缓存、日志、请求统计等。而这些处理几乎是所有服务都需要的。这不就是我们常说的AOP吗?当我们的服务比较多的时候,我们应该把这些通用的处理集中到一个地方进行管理,如下图所示:管理常用功能。Kong的安装请参考官网示例。Kong的整体结构如下:Kong的核心基于OpenResty构建,实现请求/响应的Lua处理;Kong插件拦截请求/响应,如果你接触过JavaServlets,它相当于一个拦截器,实现请求/响应的AOP处理;KongRestful管理API,提供API/API消费者/插件管理;数据中心用于存储Kong集群节点信息、API、消费者、插件等信息,目前提供PostgreSQL和Cassandra支持。推荐使用Cassandra以获得高可用性;dnsmasq用于为Nginx提供DNS解析功能;Kong集群中的节点通过gossip协议自动发现其他节点,当通过某个Kong节点的管理API进行一些变更时,其他节点也会得到通知。每个Kong节点的配置信息都会被缓存起来,比如插件,所以当某个Kong节点上修改插件配置时,需要通知其他节点配置变化。2.API/API消费者/插件管理Kong的整体流程架构如下图所示:1.添加API服务首先我们需要通过Kong管理API向Kong注册API服务,如下图:curl–I–XPOST\--urlhttp://kong:8001/apis/\--data'name=queryStockService'\--data'upstream_url=http://stock.jd.local/'\--data'request_host=api.jd.com'--data'request_path=queryStock'给Kong添加一个API,全局***名是queryStockService,当我们访问http://api.jd.com/queryStock时,它会upstream到http://stock.jd.local/queryStock处理,这个不是Nginx反向代理的功能,Kong实现了API的动态添加。2.添加API消费者我们的一些API是公开的,所有人都可以访问,而一些API是私有的,只有授权才能访问。在一个开放的平台中,只有授权的开发者才能访问API,一些高级的API只对部分开发者开放,不同的开发者有不同的API调用限制等等。在这些非公开的场景中,需要有一个API消费者。curl-i-XPOST\--urlhttp://kong:8001/consumers/\--data"username=zhangkaitao"\会生成一个consumer_id"e5da92dd-fbe8-4031-bebf-34c741e209b1",会用到添加插件到该ID的章节。3.添加插件插件可以是全局的也可以是本地的。和限流插件一样,我们可以配置成全局限流。目前支持:所有API和所有消费者、所有API和特定消费者、所有消费者和特定API、特定消费者和特定API。为queryStockService添加每秒50次的当前限制。特定的API和所有消费者配置。curl-XPOSThttp://kong:8001/apis/queryStockService/plugins\--data"name=rate-limiting"\--data"config.second=50"目前kong的限流实现是基于计数器的,默认是本地限流可以配置实现集群限流,比如使用Redis。为queryStockService添加密钥验证。curl-i-XPOST\--urlhttp://kong:8001/apis/queryStockService/plugins/\--data'name=key-auth'为消费者添加秘钥。curl-i-XPOST\--urlhttp://kong:8001/consumers/zhangkaitao/key-auth/\--data'key=myKey'通过秘钥访问API。curl-i-XGET\--urlhttp://api.jd.com/queryStock\--header"Host:api.jd.com"\--header"apikey:myKey"特定API和特定消费者限流,它需要配合身份认证模块。curl-XPOSThttp://kong:8001/apis/abc/plugins\--data"name=rate-limiting"\--data"consumer_id=e5da92dd-fbe8-4031-bebf-34c741e209b1"\--data"配置。second=1”这样就完成了添加API、添加API消费、添加API插件的介绍。3、Kong默认插件认证:Kong提供BasicAuthentication、Key认证、OAuth2.0认证、HMAC认证、JWT、LDAP认证认证实现。安全:ACL(访问控制)、CORS(跨源资源共享)、动态SSL、IP限制、爬虫检测实现。流量控制:请求流量限制(基于请求计数)、上游响应流量限制(基于上游响应计数)、请求大小限制。限流支持本地、Redis和集群限流方式。分析监控:Galileo(记录请求和响应数据,实现API分析)、Datadog(记录APIMetric,如请求数、请求大小、响应状态和延迟,可视化APIMetric)、Runscope(记录请求和响应数据,实现API性能测试和监控)。转换:请求转换(在转发给上游之前修改请求),响应转换(在上游响应返回给客户端之前修改响应)。日志:TCP、UDP、HTTP、File、Syslog、StatsD、Loggly等,也可以自己开发插件,比如缓存。4.总结作为一个API网关,Kong提供了API管理功能,并围绕API管理实现了一些默认的插件。此外,它还具有横向扩展集群的能力,从而提高整体的吞吐量。Kong本身是基于OpenResty的,可以在现有Kong的基础上进行扩展,实现更复杂的功能。Kong默认缺少一些特性,比如API级超时、重试、回退策略、缓存、API聚合、ABTest等,需要开发者自定义扩展。如果你要做一个开放平台,你要做一个HTTPAPI网关,Kong是你的选择。【本文为专栏作者张凯涛原创文章,作者微信公众号:凯涛博客(kaitao-1234567)】点此阅读更多本作者好文