易观API网关—Kong分享篇
Posted 易观开发者服务
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了易观API网关—Kong分享篇相关的知识,希望对你有一定的参考价值。
前言
(▲图片版权来自网络,版权归作者。)
上图是一个蜘蛛网,当小公司发展成为大公司的时候,各个系统之间的调用就如蛛网一样的复杂,如何可以更好做API的管理,今天给大家介绍一个第三方的API 管理利器—API Gateway: Kong。
API 网关,即API Gateway是内部服务的一道屏障,可以提供高性能、高可用的 API 托管服务,从而帮助服务的开发者便捷地对外提供服务而不用着重考虑安全控制、流量控制等。网关也可以提供API 发布、管理、维护等的管理。开发者只需要简单的操作即可把自己开发的服务至于网关的保护之下。
(▲图片版权来自网络,版权归作者。)
❶平台建设背景
随着易观业务发展,公司产品、业务系统逐渐增多。每一款产品、每一个系统都会提供不同的服务,这些服务包含系统之间相互调用的内部服务以及可以开放给外界的公共服务。随着业务的增长,系统的不断壮大,服务的数量也在不断的增长。不同的系统中的服务会有越来越多的交叉,所以提取这些服务为公共的服务,统一提供接口来供各个系统调用。
由于系统繁多,接口繁多,如果各个系统都采取直接调用服务的方式,对于服务的升级以及系统的升级来说,都会比较复杂,甚至会对系统进行重构,既增加开发人员工作量,同时也增加了整个系统拓扑的复杂性。在这种背景下,API网关就可以完美地解决上述问题。
API网关置于各个服务的上层,为各个服务披上一层盔甲。可以提供安全防护,支持Appkey认证,支持SSL/TLS加密,支持针对IP或应用的白名单、黑名单,使API开放在安全的环境。同时可以提供流量控制、监控服务的调用等一系列的功能。
❷技术选型
Kong,Mashape开源的API层。是基于nginx_Lua模块写的。是一个基于openresty的api代理层,数据采用了 Apache Cassandra/PostgreSQL存储,并且提供了一些优秀的插件,比如验证,日志,调用频次限制等。
Kong主要有两个主要的组件,一个是Server,是基于Nginx的服务器,用来接收API请求;另外就是Cassandra / PostgreSQL,用来存储操作数据。Kong中可以通过插件扩展已有功能,这些插件在API请求响应循环的生命周期中被执行。插件使用Lua编写。而且Kong还有如下几个基础功能:HTTP基本认证、密钥认证、CORS(Cross-origin Resource Sharing,跨域资源共享)、TCP、UDP、文件日志、API请求限流、请求转发以及Nginx监控。
由于Kong是基于Nginx的,所以可以水平扩展多个Kong服务器,通过前置的负载均衡配置把请求均匀地分发到各个Server,来应对大批量的网络请求。
❸安装Kong
安装Kong可以通过官方给的rpm包进行安装,也可以通过源码安装。通过对源码进行编译或者直接安装rpm包即可完成Kong的安装。安装完Kong后要对Kong进行配置,来选择用哪种方式来存储配置信息,官方提供了Cassandra和PostgreSQL两种方式,根据公司的实际使用情况,选择了PostgreSQL。另外需要注意Cassandra和PostgreSQL的版本,版本冲突的话会导致一些怪异的问题。官方对版本的描述为:Kong supports both PostgreSQL 9.4+ andCassandra 2.2.x as its datastore。
安装步骤如下:
1.wget
2.rpm –ivh kong-0.8.2.el6.noarch.rpm
3.安装postgre:yum install postgresql94-server.x86_64 postgresql94-contrib.x86_64
4.配置Kong存储: vi /etc/kong/kong.yml
5.启动Kong:kong start
Kong启动后默认会启动8000/8001两个端口,8000是API请求的代理端口,8001是Kong Restful Admin API的配置端口,通过8001端口我们可以对Kong进行各种安全配置、流量控制等。
其他的一些客户端命令:
重新加载Kong配置: kong reload
重启Kong服务: kong restart
查看Kong运行状态:kong status
Kong集群命令:kong cluster [parameters] [members|force-leave|reachability|keygen]
❹Kong Admin API
Kong添加API是通过调用Kong Admin API来实现的。Kong Admin API是RestFul形式API,通过http调用即可完成相应的功能,操作简单但功能强大。下面就介绍一下如何添加自己的API:
1. 添加API:
curl -i -X POST --url http://127.0.0.1:8001/apis/
--data 'name=mockbin'
--data 'upstream_url=http://mockbin.com/'
--data 'request_host=mockbin.com'
添加成功则会返回:
HTTP/1.1 201 Created
Date: Fri, 27 May 2016 03:22:33 GMT
Content-Type: application/json; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Access-Control-Allow-Origin: *
Server: kong/0.8.2
{"upstream_url":"http://mockbin.com/","strip_request_path":false,"id":"a74ed3af-2592-4b74-b1de-6bfe023deae5","created_at":1464319353000,"preserve_host":false,"name":"mockbin","request_host":"mockbin.com"}
2. 访问服务:通过调用:
curl -i -X GET --url http://127.0.0.1:8000/ --header 'Host: mockbin.com‘
即可跳转到
通过上面两步,很简单地把自己的服务加入到了Kong的保护之下。当然到此Kong还没有提供任何的保护措施,下面会介绍通过Kong添加安全控制、白名单、流量控制等来保护我们的服务。此处还需要指出的是:Kong的使用有两种方式,一种应用通过携带Host头部来增加API应用,另一种是通过不同的uri来提供API应用。具体到API,可以通过参数request_host、request_path来设置。
Kong还提供了修改API、删除API、查询服务状态、查询集群状态等API,具体调用方式参见官方文档:https://getkong.org/docs/0.9.x/admin-api/
❺插件设置
Kong的一个非常诱人的地方就是提供了大量的插件来扩展应用,通过设置不同的插件可以为服务提供各种增强的功能。
认证插件:
安全插件:
流量控制插件:
日志插件:
以上是Kong的官网上的插件的截图,可以看到Kong支持各种功能的插件,另外还支持自定义插件,通过自定义插件,可以实现自己想要的各种功能。下面就介绍一下安全认证和流控插件的使用。
1.认证插件:
以key认证为例,给服务添加key认证:
$ curl -X POST http://127.0.0.1:8001/apis/{api}/plugins --data "name=key-auth“
{api}为自己添加好的api的名称,通过上面的操作即可成功添加key插件,添加成功后如果直接访问API,则会返回401错误,提示客户端没有进行认证。如何才能访问呢?只需要三步:
首先:创建消费者:
$ curl -X POST http://127.0.0.1:8001/consumers/
--data "username=<consumer>"
--data "custom_id=<CUSTOM_ID>"
其次:为该消费者创建一个KEY:
$ curl -X POST http://127.0.0.1:8001/consumers/{consumer}/key-auth
创建成功则返回:
HTTP/1.1 201 Created
{
"consumer_id": "876bf719-8f18-4ce5-cc9f-5b5af6c36007",
"created_at": 1443371053000,
"id": "62a7d3b7-b995-49f9-c9c8-bac4d781fb59",
"key": "62eb165c070a41d5c1b58d9d3d725ca1“
}
最后:携带key访问API:
$ curl http://kong:8000/{api path}?apikey=<some_key>
好了,这样就为服务添加完成了KEY的认证。除了KEY认证以外,Kong还支持Basic认证、OAuth2.0认证、HMAC认证、JWT、LDAP认证。其中OAuth2.0认证常用于提供对外接口,配置比较复杂,以后再和大家分享。
2.安全插件:
以上添加了KEY插件,为自己的服务添加了基本的防护,接下来通过设置安全插件可以控制IP白名单、黑名单以及ACL来控制具体哪些消费者或者哪些终端不可以访问自己的服务。以IP白名单为例,添加IP白名单如下:
$ curl -X POST http://kong:8001/apis/{api}/plugins
--data "name=ip-restriction"
--data "config.whitelist=54.13.21.1, 143.1.0.0/24"
很简单,通过上述命令则可以给{api} 添加IP白名单。config.whitelist即为白名单列表,多个IP以逗号分隔,并且支持CIDR。如果想设置黑名单,则设置config.blacklist即可。
3.流量控制插件:
通过以上认证和安全的配置,我们的服务基本上已经安全了,接下来需要配置的就是对流量的控制,可以控制哪些消费者流量大些,哪些消费之流量小点。可以对单位时间内的访问次数进行限制:
$ curl -X POST http://kong:8001/apis/{api}/plugins
--data "name=rate-limiting"
--data "config.second=500"
--data "config.hour=20000"
以上命令可以对API每分钟、每小时的访问次数进行限制。需要说明的是,如果服务没有添加认证插件,则该流控默认以IP为依据进行限制;否则以消费者为依据进行限制。
还可以对请求的包的大小进行设置:
$ curl -X POST http://kong:8001/apis/{api}/plugins
--data "name=request-size-limiting"
--data "config.allowed_payload_size=128"
通过以上三种插件的设置,基本上已经可以满足我们的使用。此外我们和可以设置日志插件以及监控插件,来监控、分析我们的API的调用情况。Kong可以集成第三方的服务来实现监控的功能,支持:
Galileo:链接: https://getkong.org/plugins/galileo
https://galileo.mashape.com
DataDog:链接: https://getkong.org/plugins/datadog
http://docs.datadoghq.com/guides/basic_agent_usage
Runscope:链接: https://getkong.org/plugins/runscope
https://www.runscope.com/docs/api
❻自定义界面
以上介绍的操作全是通过命令来实现的,比较抽象,对于真正部署、实施、监控都不太方便。Kong的免费版本也没有提供可以操作Admin API的可视化界面,因此,为了方便开发和集成,我们自己开发了一套简单的界面来帮助公司开发人员方便地集成自己的服务。
我们自定义的界面功能包含API的创建、认证插件的添加、其他扩展插件的添加、API管理、Kong服务器状态查询以及API调用统计等功能。功能也在随着需求的增加而不断地丰富完善。
提供自定义查询服务状态:
API管理:
API添加:可以选择KEY认证、OAuth2.0认证以及Basic认证
API调用统计:
❼总结
Kong基于Nginx,安装部署简单,功能强大,目前公司以Kong为API Gateway已经为多个服务提供统一的安全防护,比如验证码服务、短信服务、邮件发送服务等公共服务,都注册在API Gateway下,提供统一的调用接口;各个业务系统部分对外开放的服务也注册在API Gateway下,通过配置OAuth2.0认证方式对外提供服务;也有部分对内的服务,系统间调用比较多的,也都分离出来放到API Gateway下。
通过Kong,我们可以省去很多安全方面的设计,从而更专注地实现服务自身的逻辑。API自身的功能再加上Kong提供的强健的外衣,使我们的系统提供更加可靠、高效、有保证的服务。
附:
以上是关于易观API网关—Kong分享篇的主要内容,如果未能解决你的问题,请参考以下文章