文档章节

HTTP API网关选择之一Kong介绍

STINGWOH
 STINGWOH
发布于 2017/09/04 11:48
字数 1529
阅读 201
收藏 1
点赞 0
评论 0

 

转自 张开涛的博客

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

 

架构

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

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

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

 

Kong的安装请参考官网示例。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的整体流程架构如下图所示:

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管理请扫描如下二维码学习。

 

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

 

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文档进行学习。

本文转载自:

共有 人打赏支持
STINGWOH
粉丝 2
博文 40
码字总数 11386
作品 0
苏州
Kong 网关API安装部署以及应用实例----------腾云驾雾

背景介绍 之前项目上api的接口用的是自己nginx搭建的反向代理接口,觉得功能性比较查差,故而另辟蹊径找到了kong作为接口网关服务。 工作原理 kong会把所有的后端接口对应的数据放到cassand...

xinsir999 ⋅ 01/08 ⋅ 0

Mashape API 网关--Kong

Kong 是在客户端和(微)服务间转发API通信的API网关,通过插件扩展功能。Kong 有两个主要组件: Kong Server :基于 nginx 的服务器,用来接收 API 请求。 Apache Cassandra :用来存储操作...

孔小菜 ⋅ 2015/05/04 ⋅ 3

微服务网关netflix-zuul

引言:前面一个系列文章介绍了认证鉴权与API权限控制在微服务架构中的设计与实现 ,好多同学询问有没有完整的demo项目,笔者回答肯定有的。由于之前系列文章侧重讲解了权限前置,所以近期补上...

aoho ⋅ 2017/11/14 ⋅ 0

kong api 网关访问异常

刚开始接触kong网关,在本地环境中部署kong网关,可能正常添加接口,但是测试访问接口是出现异常. 运行环境 mac kong 版本:0.12.1 /etc/kong/kong.conf文件 kong start 启动后 生成的.kong_evn...

天马行空& ⋅ 01/24 ⋅ 0

Kong —— Mashape 开源 API 网关

Kong 是在客户端和(微)服务间转发API通信的API网关,通过插件扩展功能。Kong 有两个主要组件: Kong Server :基于 nginx 的服务器,用来接收 API 请求。 Apache Cassandra :用来存储操作...

oschina ⋅ 2015/05/08 ⋅ 0

【微服务】网关Kong整合SpringBoot和Consul设计

前面的博客已经整理了SpringBoot整合Consul以及Kong的相关文章。这次讲讲对于这套微服务架构如何实施我的理解。 先上图,整体架构图如下: 模块说明: Client: 外部访问应用 Api-GateWay-Cl...

Tree ⋅ 01/11 ⋅ 0

Kong 0.9.5 发布, Mashape 开源 API 网关

Kong 0.9.5 发布了,Kong 是 Mashape 开源在客户端和(微)服务间转发 API 通信的 API 网关,通过插件扩展功能。Kong 有两个主要组件:基于 nginx 的服务器,用来接收 API 请求的 Kong Serve...

王练 ⋅ 2016/11/13 ⋅ 2

Kong 0.12.2 发布, 分布式微服务抽象层

Kong 0.12.2 已发布,这是 0.12 系列最新的稳定版本。同时发布的还有 0.13.0 rc1 ,新版本将减轻 Kong 的使用配置。 Kong 0.12.2 主要亮点: 新的 端点,用以取回健康检查程序所看到的上游的...

王练 ⋅ 03/03 ⋅ 0

Kong 0.11.1 发布, 分布式微服务抽象层

Kong 是一个云原生、快速、可扩展和分布式的微服务抽象层(也称为 API 网关),通过插件扩展功能。Kong 有两个主要组件:基于 nginx 的服务器,用来接收 API 请求的 Kong Server;以及用来存...

王练 ⋅ 2017/10/27 ⋅ 1

Kong 0.9.9 发布, Mashape 开源 API 网关

Kong 0.9.9 发布了,Kong 是 Mashape 开源在客户端和(微)服务间转发 API 通信的 API 网关,通过插件扩展功能。Kong 有两个主要组件:基于 nginx 的服务器,用来接收 API 请求的 Kong Serve...

王练 ⋅ 2017/02/06 ⋅ 1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

C++内存映射文件居然是这样?!

内存映射文件大家都时不时听过,但它到底是个什么?赶紧来看看吧 内存映射文件到底是干嘛的呢?让我们先来思考下面几个问题: 如果您想读的内容大于系统分配的内存块怎么办?如果您想搜索的字...

柳猫 ⋅ 28分钟前 ⋅ 0

MySQL 数据库设计总结

规则1:一般情况可以选择MyISAM存储引擎,如果需要事务支持必须使用InnoDB存储引擎。 注意:MyISAM存储引擎 B-tree索引有一个很大的限制:参与一个索引的所有字段的长度之和不能超过1000字节...

OSC_cnhwTY ⋅ 今天 ⋅ 0

多线程(四)

线程池和Exector框架 什么是线程池? 降低资源的消耗 提高响应速度,任务:T1创建线程时间,T2任务执行时间,T3线程销毁时间,线程池没有或者减少T1和T3 提高线程的可管理性。 线程池要做些什...

这很耳东先生 ⋅ 今天 ⋅ 0

使用SpringMVC的@Validated注解验证

1、SpringMVC验证@Validated的使用 第一步:编写国际化消息资源文件 编写国际化消息资源ValidatedMessage.properties文件主要是用来显示错误的消息定制 [java] view plain copy edit.userna...

瑟青豆 ⋅ 今天 ⋅ 0

19.压缩工具gzip bzip2 xz

6月22日任务 6.1 压缩打包介绍 6.2 gzip压缩工具 6.3 bzip2压缩工具 6.4 xz压缩工具 6.1 压缩打包介绍: linux中常见的一些压缩文件 .zip .gz .bz2 .xz .tar .gz .tar .bz2 .tar.xz 建立一些文...

王鑫linux ⋅ 今天 ⋅ 0

6. Shell 函数 和 定向输出

Shell 常用函数 简洁:目前没怎么在Shell 脚本中使用过函数,哈哈,不过,以后可能会用。就像java8的函数式编程,以后获取会用吧,行吧,那咱们简单的看一下具体的使用 Shell函数格式 linux ...

AHUSKY ⋅ 今天 ⋅ 0

单片机软件定时器

之前写了一个软件定时器,发现不够优化,和友好,现在重写了 soft_timer.h #ifndef _SOFT_TIMER_H_#define _SOFT_TIMER_H_#include "sys.h"typedef void (*timer_callback_function)(vo...

猎人嘻嘻哈哈的 ⋅ 今天 ⋅ 0

好的资料搜说引擎

鸠摩搜书 简介:鸠摩搜书是一个电子书搜索引擎。它汇集了多个网盘和电子书平台的资源,真所谓大而全。而且它还支持筛选txt,pdf,mobi,epub、azw3格式文件。还显示来自不同网站的资源。对了,...

乔三爷 ⋅ 今天 ⋅ 0

Debian下安装PostgreSQL的表分区插件pg_pathman

先安装基础的编译环境 apt-get install build-essential libssl1.0-dev libkrb5-dev 将pg的bin目录加入环境变量,主要是要使用 pg_config export PATH=$PATH:/usr/lib/postgresql/10/bin 进......

玛雅牛 ⋅ 今天 ⋅ 0

inno安装

#define MyAppName "HoldChipEngin" #define MyAppVersion "1.0" #define MyAppPublisher "Hold Chip, Inc." #define MyAppURL "http://www.holdchip.com/" #define MyAppExeName "HoldChipE......

backtrackx ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部