当前互联网特别是移动互联网,设备与平台之间的交互的基础是服务API接口。以API驱动的开发是团队之间最常用的协作方式,而作为交互的基石,API的准确性,完整性和及时性是影响开发效率的关键。
在生产环境中,创建、发布、维护、监控和保护任意规模的API,接收和处理成千上万个并发API的调用,管理流量、授权和访问控制、监控以及API版本也是采用微服务架构所必须解决的问题。
reference:
http://chrisrc.me/2017/02/11/api-gateway-kong-on-dcos/
解决上述问题的一种方案是API网关(API Gateway),API网关的主要职责是提供统一的服务入口,让微服务对前端透明,并提供路由,缓存,安全,过滤,流量控制等管理功能
API网关在网络拓扑中位于客户端和后端服务之间,当前互联网架构中,在这个位置扮演重要角色的通常是反向代理和负载平衡系统如Nginx,因此,扩展Nginx(结合LUA)实现API网关的职能也是一种常见的方案,Mashape公司开发的KONG项目正是基于这种思路实现的一个开源产品。
KONG
KONG是一个通过lua-nginx-module实现的在Nginx中运行的Lua应用程序。KONG没有使用lua-nginx-module直接编译Nginx,而是基于OpenResty,与已经包含了lua-nginx-module的OpenResty一起分发。
KONG支持用Cassandra和PostgreSQL作为数据存储服务器,负载存储来自Kong操作的数据,同时,借助于Nginx,OpenResty和Lua插件体系,KONG作为API网关具备了高性能,高扩展性和灵活性。
KONG提供了API支持用户自定义插件扩展,并实现了众多的插件支持API网关的职能:
-
认证
HTTP基本认证,密钥认证,OAuth,JWT,HMAC和LDAP -
安全
ACL,CORS( Cross-origin Resource Sharing,跨域资源共享),动态SSL,IP限定和机器人侦测 -
流量控制
请求限流,请求响应限流,请求载荷限定 -
分析与监控
Galileo,Datadog,Runscope -
数据转换
请求转换,响应转换,请求/响应关联 -
日志记录
TCP,UDP,HTTP,文件日志,Syslog,StatsD和Loggly。
安装部署
KONG提供了多种部署方式,支持Docker容器部署,AWS部署,CentOS/RedHat,Debian/Ubuntu,Heroku,OSX,Vagrant和源代码编译部署。
以Docker容器部署为例:
-
启动数据库(这里使用Cassandra,使用PostgreSQL时请参考官方文档):
123$ docker run -d --name kong-database \-p 9042:9042 \cassandra:2.2 -
启动KONG服务实例:
12345678910$ docker run -d --name kong \--link kong-database:kong-database \-e "KONG_DATABASE=cassandra" \-e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \-p 8000:8000 \-p 8443:8443 \-p 8001:8001 \-p 7946:7946 \-p 7946:7946/udp \kong -
检查KONG是否正常启动:
1$ curl http://127.0.0.1:8001 -
使用KONG,可参考官方5分钟快速上手示例。
配置管理
Mashape官方为KONG提供了商业化的在线监控分析工具Galileo和在线API开发工具Gelato。
Github上也存在一些第三方开发的工具,涉及图形化配置管理的有Django Kong Admin,Jungle,Kong Dashboard等,下面简要介绍Kong Dashboard的功能。
Kong Dashboard是用Javascript实现的,可以通过NPM或Docker等方式方便的安装和启动:
NPM方式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
# Install Kong Dashboard
npm install -g kong-dashboard
# Start Kong Dashboard
kong-dashboard start
# To start Kong Dashboard on a custom port
kong-dashboard start -p [port]
# To start Kong Dashboard with basic auth
kong-dashboard start -a user=password
# You can set basic auth user with environment variables
# Do not set -a parameter or this will be overwritten
set kong-dashboard-name=admin && set kong-dashboard-pass=password && kong-dashboard start
|
Docker方式:
1
2
3
4
5
6
7
8
|
# Start Kong Dashboard
docker run -d -p 8080:8080 pgbi/kong-dashboard
# Start Kong Dashboard on a custom port
docker run -d -p [port]:8080 pgbi/kong-dashboard
# Start Kong Dashboard with basic auth
docker run -d -p 8080:8080 pgbi/kong-dashboard npm start -- -a user=password
|
通过浏览器打开,可以看到如下界面:
通过界面可以方便的管理API,用户和插件。
管理API:
添加API:
管理用户:
添加用户:
管理插件:
主要功能
KONG作为API网关,其核心功能是代理客户端的请求并通过丰富的插件进行处理,此外KONG还支持集群部署,CLI命令行管理,丰富的管理API便于第三方集成以及插件开发API便于用户开发自己的处理插件。详细信息请参考官方文档。
KONG 与 DC/OS 的结合
如上图所示,API网关与DC/OS的整合存在两种模式,在模式1中,API网关独立于DC/OS集群之外,Marathon-LB部署于公开节点上作为外部负载均衡服务;在模式2中,API网关位于在DC/OS集群内部,部署在公开节点上(也可以部署在私有节点上,此时需要额外的Marathon-LB作为外部负载均衡服务),Marathon-LB作为内部负载均衡服务。
KONG作为API网关与DC/OS集群的整合既可以按上述模式1方式部署也可以按模式2进行。按模式2部署时,API网关是单实例覆盖全业务还是按业务进行实例拆分也可以根据实际需求进行调整。
下述步骤按单实例覆盖全业务的模式进行部署实践,其他场景可以根据实际需要调整。在此场景中,客户端请求的流动过程如下:
客户端请求 <—> Marathon-LB (“external”) <—> KONG <—> Marathon-LB (“internal”) <—> 内部服务
-
部署Marathon-LB (“external”):
1dcos package install marathon-lb -
部署KONG所需的数据库:
部署KONG所需要的Cassandra存储(也可以使用PostgreSQL)。注意,Kong 0.9.x(含)之前的版本仅支持Cassandra 2.2,Kong 0.10开始支持Cassandra 3.x。
下述是Cassandra 2.2的应用部署JSON定义:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748{"id": "/kong/cassandra2","instances": 1,"cpus": 0.5,"mem": 2048,"disk": 0,"container": {"docker": {"image": "cassandra:2.2","forcePullImage": false,"privileged": false,"portMappings": [{"containerPort": 9042,"protocol": "tcp","hostPort": 9042,"servicePort": 10121}],"network": "BRIDGE"},"type": "DOCKER","volumes": [{"containerPath": "/var/lib/cassandra","hostPath": "/data/cassandra/2.2","mode": "RW"}]},"healthChecks": [{"protocol": "TCP","gracePeriodSeconds": 60,"intervalSeconds": 30,"timeoutSeconds": 30,"maxConsecutiveFailures": 3}],"portDefinitions": [{"port": 10121,"protocol": "tcp","labels": {}}],"requirePorts": false} -
部署KONG:
1dcos marathon app add kong.jsonKONG的Marathon应用程序JSON定义如下:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899{"id": "/kong","cmd": "KONG_NGINX_DAEMON=\"off\" KONG_CLUSTER_ADVERTISE=$HOST:$PORT3 kong start","cpus": 1,"mem": 512,"disk": 0,"instances": 1,"acceptedResourceRoles": ["*"],"container": {"type": "DOCKER","volumes": [],"docker": {"image": "kong","network": "BRIDGE","portMappings": [{"containerPort": 8000,"hostPort": 0,"servicePort": 10001,"protocol": "tcp","name": "proxy","labels": {}},{"containerPort": 8001,"hostPort": 0,"servicePort": 10002,"protocol": "tcp","name": "admin","labels": {}},{"containerPort": 8443,"hostPort": 0,"servicePort": 10003,"protocol": "tcp","name": "ssl","labels": {}},{"containerPort": 7946,"hostPort": 0,"servicePort": 10004,"protocol": "tcp,udp","name": "serf","labels": {}}],"privileged": false,"parameters": [],"forcePullImage": true}},"env": {"KONG_CASSANDRA_CONTACT_POINTS": "node.cassandra.l4lb.thisdcos.directory","KONG_DATABASE": "cassandra"},"healthChecks": [{"protocol": "TCP","portIndex": 1,"gracePeriodSeconds": 300,"intervalSeconds": 60,"timeoutSeconds": 20,"maxConsecutiveFailures": 3,"ignoreHttp1xx": false}],"labels": {"HAPROXY_1_GROUP": "external","HAPROXY_0_GROUP": "external"},"portDefinitions": [{"port": 10001,"protocol": "tcp","name": "proxy","labels": {}},{"port": 10002,"protocol": "tcp","name": "admin","labels": {}},{"port": 10003,"protocol": "tcp","name": "ssl","labels": {}},{"port": 10004,"protocol": "udp","name": "serf-udp","labels": {}}]} -
部署Marathon-LB (“internal”):
1dcos package install --options=marathon-lb-internal.json marathon-lb对应的Marathon应用JSON定义如下:
12345678{"marathon-lb":{"name":"marathon-lb-internal","haproxy-group":"internal","bind-http-https":false,"role":""}} -
部署内部服务
注意,本方案里用 “internal” Marathon-LB作为内部应用服务的负载均衡器,因此在部署应用服务时,在LABEL中“HAPROXY_GROUP”的值应设置为“internal”。
本例使用3个Nginx实例作为服务示例。 -
部署Kong Dashboard管理程序:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546{"id": "/kong-dashboard","instances": 1,"cpus": 0.1,"mem": 128,"disk": 0,"container": {"docker": {"image": "pgbi/kong-dashboard","forcePullImage": false,"privileged": false,"portMappings": [{"containerPort": 8080,"protocol": "tcp","servicePort": 10305,"labels": {"VIP_0": "/kong-dashboard:8080"}}],"network": "BRIDGE"}},"healthChecks": [{"protocol": "HTTP","path": "/","gracePeriodSeconds": 60,"intervalSeconds": 60,"timeoutSeconds": 30,"maxConsecutiveFailures": 3,"ignoreHttp1xx": false}],"labels": {"HAPROXY_GROUP": "internal"},"portDefinitions": [{"port": 10305,"protocol": "tcp","labels": {}}]} -
检查KONG网关是否正常工作
通过Kong Dashboard向API网关添加API接口,访问接口检查是否正常。
-
部署完成后,服务实例列表如下:
-
结论: 部署完成后,外部客户端通过外部MLB(192.168.1.51:10031)访问API网关KONG(192.168.1.81),KONG将请求代理给内部MLB(192.168.1.80),内部MLB为三个Nginx服务(微服务示例)提供负载均衡。
通过以下CURL命令测试:
1curl -i -X GET --url http://192.168.1.51:10301/ --header 'Host: 192.168.1.80'
相关推荐
微服务网关是现代分布式系统中的关键组成部分,它在微服务架构中扮演着重要的角色,主要负责外部请求的路由、过滤、安全控制以及服务治理等功能。本文将详细探讨微服务网关的架构设计及其重要原则。 1. **前言** ...
微服务网关的基本功能和多种网关对比,spring cloud gateway的基本使用。 服务网关是微服务架构中的一个关键的角色,用来保护、增强和控制对于微服务的访问,服务网关是一个处于应用程序或服务之前的系统,用来管理...
微服务网关
而Spring Cloud Gateway作为一款强大的微服务网关,承担着路由、过滤器等功能,它能有效地为微服务集群提供统一的入口。在实际项目中,为了保证服务的安全性,我们常常需要将Spring Cloud Gateway与Spring Security...
微服务网关的发展前景广阔,将陆续支持托管 Kong、Ambassador 等网关引擎,将陆续支持 Nacos 等多种微服务注册中心,将陆续提供丰富的控制策略,包括各种鉴权方式、流量控制、安全防护、服务组装变换等等,将陆续...
微服务架构-服务网关 微服务架构中网关(Zuul)的相关功能、优缺点进行相关的普及和介绍。微服务网关是系统的唯一对外的入口,介于客户端和服务器端之间的中间层,处理非业务功能提供路由请求、鉴权、监控、缓存、...
Apisix微服务网关实践 Apisix是一款高性能的微服务网关,它提供了API路由、负载均衡、API版本控制、API限流与降级、API安全等高级特性,构建微服务生态的优秀工具。作为微服务网关,Apisix提供了安全、负载均衡和...
Java中的JWT令牌与微服务网关的使用是现代微服务架构中常见的技术组合。JWT(Json Web Token)是一种轻量级的身份验证机制,用于在分布式系统中安全地传输信息。微服务网关则是微服务架构的关键组件,它作为外部...
未来,微服务网关将持续演进,支持更多的网关引擎(如Kong、Ambassador)、微服务注册中心(如Nacos)以及多种微服务框架(如Dubbo、gRPC),提供更加丰富的控制策略,包括鉴权、流量控制、安全防护等。此外,还将...
微服务网关是现代分布式系统中的重要组成部分,它作为一个统一的入口,负责处理所有客户端到后端服务的请求。在本资源"微服务网关后端 1-8章 功能点演示代码.zip"中,我们可以看到一个名为"gateway_demo-master"的...
微服务网关.vsdx
基于Spring Boot框架的微服务网关系统 项目简介 本项目是一个基于Spring Boot框架的微服务网关系统,旨在提供一个高效、可扩展的微服务架构解决方案。项目包含多个微服务模块,通过Spring Cloud Gateway进行统一...
关于金融行业的微服务API网关,目前有多种实现,如Spring Cloud的Kong、Orange、Netflix Zuul和SpringCloud Gateway等。虽然框架层面并未区分专门的金融和非金融应用,但在实际应用中,金融行业可能需要更严格的安全...
Kong是一个专门用于微服务架构的开源API网关,它以轻量级、高性能和可扩展性著称。API网关作为微服务架构中的重要组件,负责处理外部请求并将其适配到后端的微服务上。Kong支持多种插件,这些插件可以实现访问控制、...
基于SpringCloudGateway的微服务网关
微服务架构网关接口设计微服务架构网关接口设计微服务架构网关接口设计微服务架构网关接口设计微服务架构网关接口设计微服务架构网关接口设计微服务架构网关接口设计
微服务应用建设,应当是先建设微服务基础设施,然后在这个基础上拆分应用,可见微服务基础设施建设是实施微服务的核心,而微服务网关就是其中最重要的微服务基础设施之一。传统网络层的网关主要作用是链接和协议转换...
《微服务网关Go Gateway深度解析》 微服务架构已经成为现代软件开发的主流模式,而作为微服务架构的重要组成部分,微服务网关起着至关重要的作用。本文将深入探讨Go Gateway,一个用Go语言实现的微服务网关,以及其...
Goku_lite项目已停止维护,我们推出了新一代Goku网关,欢迎关注apintoGoku API Gateway 是一个基于 Golang 的微服务网关,支持高性能动态路由、服务编排、多租户管理、API 访问控制等,也适用于微服务体系下的 API ...