我是靠谱客的博主 难过项链,最近开发中收集的这篇文章主要介绍Kong网关快速入门指南Kong网关快速入门指南,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

  • 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网关架构

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 ,其中标注了ENTERPRISEPLUS的插件只有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的username
  • secret - 值为上面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.orgmockbin.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网关快速入门指南所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(70)

评论列表共有 0 条评论

立即
投稿
返回
顶部