概述
文章目录
- Kong网关快速入门指南
- 前言
- Kong网关快速入门指南
- Kong网关架构
- 暴露服务
- 添加Service
- 添加Route
- 保护你的服务
- 添加Rate Limiting插件
- 提升性能
- 添加Proxy Cache插件
- 服务安全
- API网关认证方式
- 免费认证插件
- 收费认证插件
- Key认证
- 添加Key Auth插件
- 创建一个Consumer
- 生成该Consumer的API Keys
- 测试
- HMAC认证
- 添加HMAC Authentication插件
- 创建一个Consumer
- 生成该Consumer的HMAC Auth credentials
- 测试
- HMAC认证参考文档
- JWT认证
- OAuth2认证
- 设置负载均衡
- 添加Upstream
- 配置Upstream的Targets
- 配置Service的Host为Upstream
- 测试
- 参考文档
- 扩展阅读
Kong网关快速入门指南
前言
本文描述了Kong网关快速入门指南,作为学习和使用Kong网关参考。
工具和环境:
-
Kong Communiity 2.5
-
Konga 0.14.9
-
本文Kong地址:
http://192.168.0.100:8000
假设已安装和配置Kong网关和Konga控制台。
参见:
- 以Docker方式安装和配置Kong网关和Konga控制台
Kong网关快速入门指南
为简单起见,下面操作都在Konga控制台上操作完成。
Kong网关架构
说明:
- API Client调用某个API时,请求会经过Consumer、Route、Service、Load Balancer,最后分发到某个Upstream。
- Consumer代表调用API的客户端,可能是一个App,Web或Service。Consumer用来控制谁可以来调用某个API。
- Service代表某个微服务或一组API。
- Route用来对Service作路由控制。一个Service可以有多个Route。
- Load Balancer对Service的多个Upstream作负载均衡。对反向代理(Reverse Proxy)来说,后端服务被视作Upstream。
- Kong网关通过plugin来支持认证、安全控制、流量控制、数据转换和日志等。
参见:
- https://docs.konghq.com/getting-started-guide/2.4.x/overview/
暴露服务
对应场景:一个新的微服务上线。
参见:
- https://docs.konghq.com/getting-started-guide/2.4.x/expose-services/
添加Service
在Konga中,打开Services,新建Service。
Name: `demo`
Description: `REST API Mock Demo`
Url: `http://httpbin.org`
另外还可以设置:
- Retries - 失败后重试次数,默认值为5
- Connect timeout - 建立连接超时,默认值为60000ms,即60s
- Write timeout - 写超时,默认值为60000ms,即60s
- Read timeout - 读超时,默认值为60000ms,即60s
这里都保持默认值。
需要为Service配置Route后才能访问该Service。
添加Route
在新建的Service下,添加Route。
Name: `demo-route`
Paths: `/demo` # Press <Enter> to add
Protocols: `http`
说明:
- 一个Route可以配多个Path,也就是多个Path都可以分发到同一个Service。
- 通常会对Path命名进行规范管理。
在浏览器中访问http://192.168.0.100:8000/demo/anything,返回结果和直接访问http://httpbin.org/anything 是类似的。
保护你的服务
对应场景:服务流量控制。
参见
- https://docs.konghq.com/getting-started-guide/2.4.x/protect-services/
添加Rate Limiting插件
在该Service下,添加插件,选择 Traffic Control / Rate Limiting。
Consumer: # 保持为空,表示对所有Consumer生效
minute: 5 # 限制每分钟5次调用,只作演示用
说明:
- Rate Limiting插件支持按每秒/分钟/小时/天/月/年进行限制,实际使用时请根据实际情况设定。
- 不指定Consumer时,根据
ip
作限制。
在浏览器中不断刷新http://192.168.0.100:8000/demo/anything ,超过限制次数后返回错误信息:
{
"message": "API rate limit exceeded"
}
等到限制窗口结束后,又可以正常使用。
用Postman或Insomina REST Client来测试http://192.168.0.100:8000/demo/anything ,观察Response headers。
示例:
ratelimit-limit: 5
ratelimit-remaining: 0
ratelimit-reset: 28
retry-after: 28
说明:
ratelimit-remaining: 0
表示已达到流量限制。ratelimit-reset: 28
表示28s后将会重置计数器。
提升性能
对应场景:频繁读取,但是很少变更的数据。
除了在服务端从缓存中读取数据外,还可以在API Gateway中设置Proxy Cache来直接返回缓存的响应数据,而无需调用Upstream服务。
添加Proxy Cache插件
在该Service下,添加插件,选择 Traffic Control / Proxy Cache。
strategy: `memory`
保存后再打开插件配置,可以看到:
- Response Code:
200
,301
,404
- Request Method:
GET
,HEAD
- Content Type:
text/plain
,application/json
用Postman或Insomina REST Client来测试http://192.168.0.100:8000/demo/anything ,观察Response headers。
命中proxy cache时数据示例:
x-cache-key: c1573d15156c059d840282a05eb50bdb
x-cache-status: Hit
x-kong-proxy-latency: 2
x-kong-upstream-latency: 0
服务安全
对应场景:只有通过认证的Consumer才能访问服务。
参见:
- https://docs.konghq.com/getting-started-guide/2.4.x/secure-services/
API网关认证方式
Kong网关的认证插件:https://docs.konghq.com/hub/#authentication ,其中标注了ENTERPRISE
或PLUS
的插件只有Kong收费版才有。
免费认证插件
- Basic Authentication
- 将
username:password
作Base64编码,放在HTTP headers中。 - 只能在HTTPS时使用。如果在HTTP中使用,一旦数据包被截获,很容易通过Base64解码获得用户名和密码。
- 不安全,不建议使用。
- 将
- Key Authentication
- 将
apikey
放在Query Param或HTTP headers中。 - 如果
apikey
放在Query Param,很容易就泄漏apikey
。 - 只能在HTTPS时使用。如果在HTTP中使用,一旦数据包被截获,
apikey
就泄漏。 - 比较不安全,不建议使用。
- 将
- HMAC Authentication
- 消息发送者对消息用secret作Hash签名,消息接受者用同一个secret对消息进行Hash签名,并比较两个签名是否相同,只有两个签名相同时才进行响应。
- 支持防止数据被篡改。
- 支持降低被重放攻击(Replay Attack)的风险。
- 安全,建议使用。
- JWT
- OAuth 2.0 Authentication
收费认证插件
- OpenID Connect
- 可以支持OpenID Connect的IDP(比如Keycloak)集成。
- 支持基于用户登录状态的API调用控制。
Key认证
对应场景:A系统通过Webhook方式调用B系统提供的REST API。
key names: apikey # 默认为apikey
key in header: YES # 可以将key放在request headers
key in query: YES # 可以将key放在query param中
key in body: NO # 将key放在request body中,比较少使用
说明:
- 只能在HTTPS时使用。如果在HTTP中使用,一旦数据包被截获,
apikey
就泄漏。 - 允许将key放在query param中,虽然比较方便客户端调用API,但是增加了泄漏风险,一般只用在系统之间的Webhook调用。
添加Key Auth插件
在服务中,添加Authentication / Key Auth插件。
创建一个Consumer
创建一个Consumer:
username: `consumer1`
custom_id: `consumer1`
生成该Consumer的API Keys
Key: # 默认为空,由系统自动生成随机字符串
测试
在Query Param中添加apikey
:
- http://192.168.0.100:8000/demo/anything?apikey=7zDSD5jSsYRcDox3OCOFJmVVOFHp5F7r
在Header中添加apikey
:
curl -X GET http://192.168.0.100:8000/demo/anything
-H "apikey: 7zDSD5jSsYRcDox3OCOFJmVVOFHp5F7r"
或用httpie
来测试:
http http://192.168.0.100:8000/demo/anything apikey:"7zDSD5jSsYRcDox3OCOFJmVVOFHp5F7r"
HMAC认证
对应场景:某电商平台暴露在互联网上的REST API,只允许其电商App和电商网站调用。
添加HMAC Authentication插件
在服务中,添加Authentication / HMAC Authentication插件。
consumer: # 保留为空,表示对所有consumer
hide credentials: NO # 保留为NO,假设需要后端服务进行验签
clock skew: 300 # 保留默认值300,时钟偏差检查,只接受与后端服务系统时间相差300s内的请求,防止重放攻击。
validate request boday: NO # 如果设置为YES,需要确保Request body不为空,在Request body为空时,会验签失败。
algorithms: hmac-sha256 # 用sha256的摘要算法
创建一个Consumer
创建一个Consumer:
username: `demo-app`
custom_id: `demo-app`
生成该Consumer的HMAC Auth credentials
username: `demo-app`
secret: `Secret!@#456`
测试
在Postman中测试。
添加一个Environment,在该Environment下创建Variables:
username
- 值为上面Consumer的usernamesecret
- 值为上面Consumer的secret
在测试request中添加Headers:
Date: {{curDate}}
Digest: {{computedDigest}}
Authorization: {{authorization}}
在测试request中配置Pre-request Script:
// environment variables
// username
// secret
var username = pm.environment.get('username');
var secret = pm.environment.get('secret');
var curDate = new Date().toGMTString();
var sha256digest = CryptoJS.SHA256(request.data);
var base64sha256 = CryptoJS.enc.Base64.stringify(sha256digest);
var computedDigest = 'SHA-256=' + base64sha256;
var signingString = "date: " + curDate + "n" + "digest: " + computedDigest;
var signature = CryptoJS.enc.Base64.stringify(CryptoJS.HmacSHA256(signingString, secret));
var algorithm = "hmac-sha256";
var authorization = "hmac username="" + username + "", algorithm="" + algorithm + "", headers="date digest", signature="" + signature + """;
// headers
// Date: {{curDate}}
// Digest: {{computedDigest}}
// Authorization: {{authorization}}
pm.environment.set("curDate", curDate);
pm.environment.set('digest', computedDigest);
pm.environment.set('authorization', authorization);
// debug
console.log(request.data);
console.log(curDate);
console.log(computedDigest);
console.log(signingString);
console.log(authorization);
在Postman的Console中查看debug信息示例:
{}
Tue, 20 Jul 2021 02:57:41 GMT
SHA-256=TqXFCKZWbnYkBUP4/rBv1Fd3e+OVScQBZDav2mXSMw4=
date: Tue, 20 Jul 2021 02:57:41 GMT
digest: SHA-256=TqXFCKZWbnYkBUP4/rBv1Fd3e+OVScQBZDav2mXSMw4=
hmac username="demo-app", algorithm="hmac-sha256", headers="date digest", signature="0058cz5mCFa6JxEnGrT7l8n45Jdg8tMEmFzsZC7bsJg="
GET http://192.168.0.100:8000/demo/anything
说明:
- 可以看到,在HMAC认证时,即使HTTP请求数据被截获,也无法破解得到secret。
- 在开启validate request body后,可有效防止request body数据被篡改。
- 配置合适大小的clock skew(时钟偏差)后,可有效降低被重放攻击(replay attack)的风险。
参见:
-
https://gist.github.com/DinoChiesa/75796b27828cf8e15c91
-
https://qomarullah.medium.com/api-gateway-using-kong-hmac-authentication-6ac73441d708
-
https://blog.csdn.net/qq_39170899/article/details/107806980
注意:
- 如果勾选了validate request body,需要确保request body不为空,在request body为空时,会验签失败。
HMAC认证参考文档
- https://www.okta.com/identity-101/hmac/
JWT认证
参见:
- 在Kong网关中使用JWT认证
OAuth2认证
参见:
- 在Kong网关中使用OAuth2认证
设置负载均衡
对应场景:API网关将请求负载均衡地分发到多个后端服务。
添加Upstream
添加Upstream:
Name: demo-upstream
说明:
- 还可以配置对后端服务的健康检查。
配置Upstream的Targets
编辑demo-upstream
,添加Targets:
# Target 1
Target: httpbin.org:80
Weight: 100
# Target 2
Target: mockbin.org:80
Weight: 100
说明:
- 设置Target的IP或Hostname加上端口,默认端口为8000。
- 这里设置两个Target的权重(Weight)一样,表示将会“平均”地分发请求到这两个Target。
配置Service的Host为Upstream
编辑Service,将Service的Host从原来的httpbin.org
改为demo-upstream
。
在即使只有一个Target时,配置Upstream,也是一种好的实践。
测试
在浏览器上多次访问http://192.168.0.100:8000/demo ,可以看到交替访问httpbin.org
或mockbin.org
。
参考文档
- Kong Gateway for Beginners: Adding a Service, Route and Plugins
- https://docs.konghq.com/getting-started-guide/2.4.x/overview/
扩展阅读
- 选择 Kong 作为你的 API 网关
最后
以上就是难过项链为你收集整理的Kong网关快速入门指南Kong网关快速入门指南的全部内容,希望文章能够帮你解决Kong网关快速入门指南Kong网关快速入门指南所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复