【分享】啥是API网关?大公司为啥都有API网关?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【分享】啥是API网关?大公司为啥都有API网关?相关的知识,希望对你有一定的参考价值。

参考技术A 在这篇文章中将我们一起来探讨当前的API网关的作用。
一、API网关的用处
API网关我的分析中会用到以下三种场景。

二、API网关在企业整体架构中的地位
一个企业随着信息系统复杂度的提高,必然出现外部合作伙伴应用、企业自身的公网应用、企业内网应用等,在架构上应该将这三种应用区别开,三种应用的安排级别、访问方式也不一样。
因此在我的设计中将这三种应用分别用不同的网关进行API管理,分别是:API网关(OpenAPI合伙伙伴应用)、API网关(内部应用)、API网关(内部公网应用)。

三、企业中在如何应用API网关
1、对于OpenAPI使用的API网关来说,一般合作伙伴要以应用的形式接入到OpenAPI平台,合作伙伴需要到 OpenAPI平台申请应用。
因此在OpenAPI网关之外,需要有一个面向合作伙伴的使用的平台用于合作伙伴,这就要求OpenAPI网关需要提供API给这个用户平台进行访问。
如下架构:

当然如果是在简单的场景下,可能并不需要提供一个面向合作伙伴的门户,只需要由公司的运营人员直接添加合作伙伴应用id/密钥等,这种情况下也就不需要合作伙伴门户子系统。
2、对于内网的API网关,在起到的作用上来说可以认为是微服务网关,也可以认为是内网的API服务治理平台。
当企业将所有的应用使用微服务的架构管理起来,那么API网关就起到了微服务网关的作用。
而当企业只是将系统与系统之间的调用使用rest api的方式进行访问时使用API网关对调用进行管理,那么API网关起到的就是API服务治理的作用。
架构参考如下:

3、对于公司内部公网应用(如APP、公司的网站),如果管理上比较细致,在架构上是可能由独立的API网关来处理这部分内部公网应用,如果想比较简单的处理,也可以是使用面向合作伙伴的API网关。
如果使用独立的API网关,有以下的好处:
• 面向合作伙伴和面向公司主体业务的优先级不一样,不同的API网关可以做到业务影响的隔离。
• 内部API使用的管理流程和面向合作伙伴的管理流程可能不一样。
• 内部的API在功能扩展等方面的需求一般会大于OpenAPI对于功能的要求。
基于以上的分析,如果公司有能力,那么还是建议分开使用合作伙伴OPEN API网关和内部公网应用网关。

四、API网关解决方案
私有云解决方案如下:
• Kong是基于nginx+Lua进行二次开发的方案
https://konghq.com/
• Eolinker和Kong比较接近,但是因为是国内公司开发的,后续的技术支持和培训比较友好。
https://www.eolinker.com
• Netflix Zuul,zuul是spring cloud的一个推荐组件, https://github.com/Netflix/zuul
• orange,这个开源程序也是国人开发的,不过这个是个人开发不是公司。
http://orange.sumory.com/
公有云解决方案:
• Amazon API Gateway, https://aws.amazon.com/cn/api-gateway/
• 阿里云API网关, https://www.aliyun.com/product/apigateway/
• 腾讯云API网关, https://cloud.tencent.com/product/apigateway
自开发解决方案:
• 基于Nginx+Lua+ OpenResty的方案,可以看到Eolinker,Kong,orange都是基于这个方案。
• 基于Netty、非阻塞IO模型。通过网上搜索可以看到国内的宜人贷等一些公司是基于这种方案。
• 基于Node.js的方案。这种方案是应用了Node.js天生的非阻塞的特性。
• 基于java Servlet的方案。zuul基于的就是这种方案,这种方案的效率不高,这也是zuul总是被诟病的原因。
五、企业怎么选择API网关
现在的亚马逊、阿里、腾讯云都在提供基础公有云的API网关,当然这些网关的基础功能肯定是没有问题,但是二次开发,扩展功能、监控功能可能就不能满足部分用户的定制需求了。
另外很多企业因为自身信息安全的原因,不能使用外网公有网的API网关服务,这样就只有选择私有云的方案了。
在需求上如果基于公有云的API网关只能做到由内部人员为外网人员申请应用,无法做到定制的合作伙伴门户,这也不适合于部分企业的需求。
如果作为微服务网关,大多数情况下是希望网关服务器和服务提供方服务器是要在内网的,在这里情况下也只有私有云的API网关才能满足需求。
综合上面的分析,基础公有云的API网关只有满足一部分简单客户的需求,对于很多企业来说私有云的API网关才是正确的选择。

易观API网关—Kong分享篇


前言

易观API网关—Kong分享篇

(▲图片版权来自网络,版权归作者。)


上图是一个蜘蛛网,当小公司发展成为大公司的时候,各个系统之间的调用就如蛛网一样的复杂,如何可以更好做API的管理,今天给大家介绍一个第三方的API 管理利器—API Gateway: Kong。


API 网关,即API Gateway是内部服务的一道屏障,可以提供高性能、高可用的 API 托管服务,从而帮助服务的开发者便捷地对外提供服务而不用着重考虑安全控制、流量控制等。网关也可以提供API 发布、管理、维护等的管理。开发者只需要简单的操作即可把自己开发的服务至于网关的保护之下。

易观API网关—Kong分享篇

(▲图片版权来自网络,版权归作者。)


❶平台建设背景


随着易观业务发展,公司产品、业务系统逐渐增多。每一款产品、每一个系统都会提供不同的服务,这些服务包含系统之间相互调用的内部服务以及可以开放给外界的公共服务。随着业务的增长,系统的不断壮大,服务的数量也在不断的增长。不同的系统中的服务会有越来越多的交叉,所以提取这些服务为公共的服务,统一提供接口来供各个系统调用。


由于系统繁多,接口繁多,如果各个系统都采取直接调用服务的方式,对于服务的升级以及系统的升级来说,都会比较复杂,甚至会对系统进行重构,既增加开发人员工作量,同时也增加了整个系统拓扑的复杂性。在这种背景下,API网关就可以完美地解决上述问题。


API网关置于各个服务的上层,为各个服务披上一层盔甲。可以提供安全防护,支持Appkey认证,支持SSL/TLS加密,支持针对IP或应用的白名单、黑名单,使API开放在安全的环境。同时可以提供流量控制、监控服务的调用等一系列的功能。


❷技术选型


Kong,Mashape开源的API层。是基于Nginx_Lua模块写的。是一个基于openresty的api代理层,数据采用了 Apache Cassandra/PostgreSQL存储,并且提供了一些优秀的插件,比如验证,日志,调用频次限制等。

 

易观API网关—Kong分享篇


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的一个非常诱人的地方就是提供了大量的插件来扩展应用,通过设置不同的插件可以为服务提供各种增强的功能。


认证插件:

 

易观API网关—Kong分享篇


安全插件:

 

易观API网关—Kong分享篇


流量控制插件:

 

易观API网关—Kong分享篇


日志插件:

 

易观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网关—Kong分享篇


API管理:

 

易观API网关—Kong分享篇


API添加:可以选择KEY认证、OAuth2.0认证以及Basic认证

 

易观API网关—Kong分享篇


API调用统计:

 


❼总结


Kong基于Nginx,安装部署简单,功能强大,目前公司以Kong为API Gateway已经为多个服务提供统一的安全防护,比如验证码服务、短信服务、邮件发送服务等公共服务,都注册在API Gateway下,提供统一的调用接口;各个业务系统部分对外开放的服务也注册在API Gateway下,通过配置OAuth2.0认证方式对外提供服务;也有部分对内的服务,系统间调用比较多的,也都分离出来放到API Gateway下。


通过Kong,我们可以省去很多安全方面的设计,从而更专注地实现服务自身的逻辑。API自身的功能再加上Kong提供的强健的外衣,使我们的系统提供更加可靠、高效、有保证的服务。


附:


别光看,长按关注呀!


以上是关于【分享】啥是API网关?大公司为啥都有API网关?的主要内容,如果未能解决你的问题,请参考以下文章

api网关

易观API网关—Kong分享篇

为什么都有API网关?聊聊API网关的作用

大家用过API网关吗

分享一个基于Abp Vnext开发的API网关项目

一个创业公司的API网关落地实践