HTTP API网关选择之一Kong介绍

Wesley13
• 阅读 663

转自 张开涛的博客

Kong是Mashape开源的高性能高可用API网关和API服务管理层。它基于OpenResty,进行API管理,并提供了插件实现API的AOP。Kong在Mashape 管理了超过15,000 个API,为200,000开发者提供了每月数十亿的请求支持。本文将从架构、API管理、插件三个层面介绍Kong。

架构

按照康威定律,我们系统架构会拆的很散,系统由一堆服务组成,如下图所示:

HTTP API网关选择之一Kong介绍 如在访问库存服务、优惠券服务、价格服务时之前都会做一些特殊处理,如限流、缓存、日志、请求统计。而这些处理几乎是所有服务都需要的,这不就是我们常说的AOP嘛,当我们服务多起来的时候,应该将这些通用处理集中到一个地方进行管理,如下图所示:

HTTP API网关选择之一Kong介绍

即通过Kong统一管理通用功能。

Kong的安装请参考官网示例。Kong整体架构如下所示:

HTTP API网关选择之一Kong介绍

  1. Kong核心基于OpenResty构建,实现了请求/响应的Lua处理化;

  2. Kong插件拦截请求/响应,如果接触过Java Servlet,等价于拦截器,实现请求/响应的AOP处理;

  3. Kong Restful 管理API提供了API/API消费者/插件的管理;

  4. 数据中心用于存储Kong集群节点信息、API、消费者、插件等信息,目前提供了PostgreSQL和Cassandra支持,如果需要高可用建议使用Cassandra;

  5. dnsmasq用于提供给Nginx DNS解析功能;

  6. Kong集群中的节点通过gossip协议自动发现其他节点,当通过一个Kong节点的管理API进行一些变更时也会通知其他节点。每个Kong节点的配置信息是会缓存的,如插件,那么当在某一个Kong节点修改了插件配置时,需要通知其他节点配置的变更。

API/API消费者/插件管理

Kong的整体流程架构如下图所示:

HTTP API网关选择之一Kong介绍

1、添加API服务

首先我们需要通过Kong管理API向Kong注册API服务,如下所示:

curl –I –X POST \

  --url http://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 -X POST \

  --url http://kong:8001/consumers/ \

  --data "username=zhangkaitao"\

其会生成一个consumer_id “e5da92dd-fbe8-4031-bebf-34c741e209b1”,添加插件章节会用到该ID。

3、添加插件

插件可以是全局的,也可以是局部的。如限流插件,我们可以配置为全局限流。目前支持:所有API和所有消费者、所有API和特定消费者、所有消费者和特定API、特定消费者和特定API。

为queryStockService添加50次/秒的限流。特定API和所有消费者配置。

curl -X POSThttp://kong:8001/apis/queryStockService/plugins \

    --data "name=rate-limiting"\

    --data "config.second=50"

目前Kong的限流实现是基于计数器,默认是本地限流,可以配置为如使用Redis,实现集群限流。

为queryStockService添加密钥身份认证。

curl -i -X POST \

  --url http://kong:8001/apis/queryStockService/plugins/ \

  --data 'name=key-auth'

为消费者添加秘钥。

curl -i -X POST \

  --url http://kong:8001/consumers/zhangkaitao/key-auth/\\

  --data 'key=myKey'

通过秘钥访问API。

curl -i -X GET \

  --url http://api.jd.com/queryStock \

  --header "Host: api.jd.com"\

  --header "apikey: myKey"

特定API和特定消费者限流,需要配合身份认证模块。

curl -X POST http://kong:8001/apis/abc/plugins \

--data "name=rate-limiting"\

    --data "consumer_id=e5da92dd-fbe8-4031-bebf-34c741e209b1"\

    --data "config.second=1"

到此添加API、添加API消费、添加API插件就介绍完了。更多API管理请扫描如下二维码学习。

HTTP API网关选择之一Kong介绍

更多插件配置学习请扫描如下二维码学习。

HTTP API网关选择之一Kong介绍

Kong默认插件

身份认证:Kong提供了Basic Authentication、Key authentication、OAuth2.0 authentication、HMAC authentication、JWT、LDAP authentication认证实现。

安全:ACL(访问控制)、CORS(跨域资源共享)、动态SSL、IP限制、爬虫检测实现。

流量控制:请求限流(基于请求计数限流)、上游响应限流(根据upstream响应计数限流)、请求大小限制。限流支持本地、Redis和集群限流模式。

分析监控:Galileo(记录请求和响应数据,实现API分析)、Datadog(记录API Metric如请求次数、请求大小、响应状态和延迟,可视化API Metric)、Runscope(记录请求和响应数据,实现API性能测试和监控)。

转换:请求转换(在转发到upstream之前修改请求)、响应转换(在upstream响应返回给客户端之前修改响应)。

日志:TCP、UDP、HTTP、File、Syslog、StatsD、Loggly等。

也可以开发自己的插件,如缓存等。

总结

Kong作为API网关提供了API管理功能,及围绕API管理实现了一些默认的插件,另外还具备集群水平扩展能力,从而提升整体吞吐量。Kong本身是基于OpenResty,可以在现有Kong的基础上进行一些扩展,从而实现更复杂的特性。

有一些特性Kong默认是缺失的,如API级别的超时、重试、fallback策略、缓存、API聚合、ABTest等,这些需要开发者自己定制和扩展。

如果你要做开放平台,你要做HTTP API网关,Kong是您的一个选择。

事情太多,最近原创的文章有点少。后续有时间会介绍Kong整体流程的实现。更多Kong的介绍请扫描如下二维码查看Kong文档进行学习。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Prodan Labs Prodan Labs
3年前
Kubernetes Ingress — Kong
Kong是由Mashape公司开源的一个高性能、高可用、易扩展的APIGateway项目,基于OpenResty(NginxLua模块),并提供了插件实现API的AOP功能。可以通过负载均衡、插件扩展等方式,来处理网络请求。Kong主要的概念Servi
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
2年前
API网关 kong 的初步认识
Kong是Mashape开源的高性能高可用API网关和API服务管理层。自2015年在github开源后,广泛受到关注。它基于OpenResty,进行API管理,并提供了插件实现API的AOP。Kong的插件机制是其高可扩展性的根源,Kong可以很方便地为路由和服务提供各种插件,网关所需要的基本特性。Kong支持特性:云原生:与平台无关,K
Wesley13 Wesley13
2年前
Kong的简介和安装
Kong是在客户端和(微)服务间转发API通信的API网关,通过插件扩展功能。Kong有两个主要组件:1、KongServer:基于nginx的服务器,用来接收API请求。2、ApacheCassandra:用来存储操作数据。你可以通过增加更多KongServer机器对Kong服务进行水平扩展,通过前置的负载均衡器向这些机
Wesley13 Wesley13
2年前
vivo 微服务 API 网关架构实践
一、背景介绍网关作为微服务生态中的重要一环,由于历史原因,中间件团队没有统一的微服务API网关,为此准备技术预研打造一个功能齐全、可用性高的业务网关。二、技术选型常见的开源网关按照语言分类有如下几类:NginxLua:OpenResty、Kong等;Java:Zuul1/Zuu
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
高性能API网关Kong介绍
本文关键词:高性能、API网关、Kong、微服务1.Introduction是随着微服务(Microservice)概念兴起的一种架构模式。原本一个庞大的单体应用(Allinone)业务系统被拆分成许多微服务(Microservice)系统进行独立的维护和部署,服务拆分带来的变化是API的规模成倍增长,API的管理难度也在日益增加,使用API网关发布和管
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这