大家好,又见面了,我是你们的朋友全栈君。
kong
- 1、What are Services and Routes?
-
- 1.1 Add a Service
- 1.2 Add a Route
- 1.3 总结和后续步骤
- 2. 保护您的 Service
-
- 2.1 What is Rate Limiting?
- 2.2 Set up Rate Limiting
- 3. 提高性能
-
- 3.1 What is Proxy Caching?
- 3.2 Why use Proxy Caching?
- 3.3 Set up the Proxy Caching plugin
- 4. 安全 Services
-
- 4.1 What is Authentication?
- 4.2 为什么要使用 API 网关身份验证?
- 4.3 设置密钥认证插件
- 4.4 设置消费者和凭证(Consumers and Credentials)
- 4.5 (可选)禁用插件
- 6. 设置智能负载平衡
-
- 6.1 What are Upstreams?
- 6.2 为什么要跨上游目标进行负载平衡?
- 6.3 配置上游(Upstream)服务
- 7. 管理行政(Administrative)团队
-
- 7.1 工作区和团队概述
- 7.2 保护您的网关安装
- 7.3 创建工作区
- 7.4 创建管理员
- 7.5 参考:将 decK 与 RBAC 和工作区一起使用
- 7.6 总结和后续步骤
- 8. 发布、定位和使用服务
kong 官方文档: https://docs.konghq.com/getting-started-guide/2.4.x/overview/ https://docs.konghq.com/enterprise/2.4.x/admin-api/#service-object
1、What are Services and Routes?
在 Kong Gateway 中,Service 是表示外部 upstream API 或微服务的实体——例如,数据转换微服务、计费 API 等。
Service 的主要属性是它的URL,服务在其中侦听请求。您可以使用单个字符串指定 URL,也可以单独指定其协议、主机、端口和路径。
在开始对 Service 发出请求之前,您需要向它添加一个 Route。Route 决定了请求到达 Kong Gateway 后如何(以及是否)发送到它们的服务。一个服务(Service)可以有多个路由(Route)。
此图说明了通过服务路由到后端 API 的请求和响应流。
1.1 Add a Service
出于本示例的目的,您将创建一个指向 Mockbin API 的服务。Mockbin 是一个“echo”类型的公共网站,它将请求作为响应返回给请求者。此可视化将有助于了解 Kong Gateway 如何代理 API 请求。
Kong Gateway 在端口上公开了 RESTful Admin API :8001。网关的配置,包括添加 Services and Routes,是通过对 Admin API 的请求来完成的。
代码语言:javascript复制curl -i -X POST http://<admin-hostname>:8001/services
--data name=example_service
--data url='http://mockbin.org'
如果服务创建成功,您将收到 201 成功消息。
验证服务的端点:
代码语言:javascript复制curl -i http://<admin-hostname>:8001/services/example_service
1.2 Add a Route
要通过 API 网关访问 Service,您需要向其添加 Route。 Define a Route (/mock) for the Service (example_service) with a specific path that clients need to request. Note at least one of the hosts, paths, or methods must be set for the Route to be matched to the service.
为Service (example_service)定义一个Route(/mock),其中包含客户端需要请求的特定路径。请注意,为使 Route 与 service 匹配,必须至少设置一个 hosts, paths, or methods。
代码语言:javascript复制curl -i -X POST http://<admin-hostname>:8001/services/example_service/routes
--data 'paths[]=/mock'
--data name=mocking
201 消息表示路由已成功创建。
验证路由是否将请求转发到服务:
代码语言:javascript复制curl -i -X GET http://<admin-hostname>:8000/mock/request
1.3 总结和后续步骤
Added a Service named example_service with a URL of http://mockbin.org. Added a Route named /mock. This means if an HTTP request is sent to the Kong Gateway node on port 8000(the proxy port) and it matches route /mock, then that request is sent to http://mockbin.org. Abstracted a backend/upstream service and put a route of your choice on the front end, which you can now give to clients to make requests.
- 为 http://mockbin.org URL 添加一个名为 example_service 的 Service。
- 这意味着如果一个 HTTP 请求被发送到端口 8000(代理端口)上的Kong Gateway节点,并且它匹配了路由 /mock,那么该请求将被发送到 http://mockbin.org。
- 抽象一个后端(backend)/上游(upstream)服务,并在前端放置一个您所选择的 route,现在您可以将其提供给客户端来发出请求。
2. 保护您的 Service
在本主题中,您将学习如何使用 Rate Limiting 插件强制执行速率限制。
2.1 What is Rate Limiting?
速率限制(Rate Limiting) 允许您限制 upstream services 从API消费者接收的请求数量,或者每个用户可以调用API的频率。
对于Kong Gateway (Enterprise), Rate limit Advanced插件提供了对滑动窗口算法的支持,以防止API在窗口边界附近过载,并添加了Redis支持,以获得更好的性能。
速率限制可保护 API 免受意外或恶意过度使用。在没有速率限制的情况下,每个用户可以随意请求,这可能导致请求激增,从而使其他消费者感到饥饿。启用速率限制后,API 调用被限制为每秒固定数量的请求。
2.2 Set up Rate Limiting
永久链接设置速率限制: 在端口上调用管理 API8001并配置插件以在节点上启用每分钟五 (5) 个请求的限制,这些请求存储在本地和内存中。
代码语言:javascript复制curl -i -X POST http://<admin-hostname>:8001/plugins
--data name=rate-limiting
--data config.minute=5
--data config.policy=local
验证速率限制:
代码语言:javascript复制curl -i -X GET http://<admin-hostname>:8000/mock/request
在第 6 个请求之后,您应该收到 429“超出 API 速率限制”错误:
代码语言:javascript复制{
"message": "API rate limit exceeded"}
3. 提高性能
使用代理缓存提高性能 在本主题中,您将学习如何使用代理缓存来提高使用代理缓存插件的响应效率。
3.1 What is Proxy Caching?
什么是代理缓存?
Kong Gateway通过缓存提供快速的性能。Proxy Caching插件使用反向代理缓存实现提供了这种快速的性能。它基于请求方法、可配置的响应代码、内容类型缓存响应实体,并且可以缓存每个消费者或每个API。
缓存实体存储一段可配置的时间。当超时到达时,网关将请求转发给Upstream,缓存结果并从缓存中响应,直到超时。插件可以在内存中存储缓存的数据,或者为了提高性能,在Redis中。
3.2 Why use Proxy Caching?
为什么使用代理缓存?
使用代理缓存,这样Upstream服务就不会因为重复的请求而陷入困境。通过代理缓存,Kong Gateway可以响应缓存的结果以获得更好的性能。
3.3 Set up the Proxy Caching plugin
设置代理缓存插件
代码语言:javascript复制curl -i -X POST http://<admin-hostname>:8001/plugins
--data name=proxy-cache
--data config.content_type="application/json; charset=utf-8"
--data config.cache_ttl=30
--data config.strategy=memory
验证代理缓存: 让我们检查代理缓存是否有效。这一步需要 Kong Admin API。
使用 Admin API访问/mock路由并注意响应标头:
代码语言:javascript复制curl -i -X GET http://<admin-hostname>:8000/mock/request
特别是要密切关注的价值X-Cache-Status,X-Kong-Proxy-Latency以及X-Kong-Upstream-Latency:
代码语言:javascript复制HTTP/1.1 200 OK
...
X-Cache-Key: d2ca5751210dbb6fefda397ac6d103b1
X-Cache-Status: Miss
X-Content-Type-Options: nosniff
...
X-Kong-Proxy-Latency: 25
X-Kong-Upstream-Latency: 37
接下来,再次访问/mock路由。
这一次,请注意X-Cache-Status、X-Kong-Proxy-Latency和X-Kong-Upstream-Latency值的差异。缓存状态是命中(Hit),这意味着Kong Gateway直接从缓存响应请求,而不是将请求代理给Upstream服务。
此外,请注意响应中的最小延迟,这使得Kong Gateway能够提供最佳性能:
代码语言:javascript复制HTTP/1.1 200 OK
...
X-Cache-Key: d2ca5751210dbb6fefda397ac6d103b1
X-Cache-Status: Hit
...
X-Kong-Proxy-Latency: 0
X-Kong-Upstream-Latency: 1
为了更快地测试,可以通过调用 Admin API 来删除缓存:
代码语言:javascript复制curl -i -X DELETE http://<admin-hostname>:8001/proxy-cache
4. 安全 Services
使用身份验证保护您的服务
在本主题中,您将了解 API 网关身份验证、设置密钥身份验证插件并添加使用者。
如果您遵循入门工作流程,请确保在继续之前已完成使用代理缓存提高性能。
4.1 What is Authentication?
什么是认证? API网关身份验证是控制允许使用API传输的数据的一种重要方式。基本上,它使用一组预定义的凭据来检查特定的使用者是否有访问API的权限。
Kong Gateway有一个插件库,提供了简单的方法来实现最知名和最广泛使用的API网关身份验证方法。下面是一些常用的短语:
- 基本认证
- 密钥认证
- OAuth 2.0 认证
- LDAP 认证高级
- OpenID 连接
认证插件可以配置为应用于Kong Gateway中的服务实体。反过来,服务实体与它们所表示的 upstream services(上游服务)一一映射,本质上意味着身份验证插件直接应用于那些上游服务。
4.2 为什么要使用 API 网关身份验证?
启用身份验证后,除非客户端首先成功验证,否则Kong Gateway不会代理请求。这意味着上游(API)不需要验证客户端请求,也不会浪费验证凭证的关键资源。
Kong Gateway可以看到所有的身份验证尝试,包括成功的和失败的,等等,它提供了对这些事件进行编目和指示的能力,以证明正确的控制已经到位,并实现遵从性。身份验证还使您有机会确定如何处理失败的请求。这可能意味着仅仅阻塞请求并返回错误代码,或者在某些情况下,您可能仍然希望提供有限的访问。
在本例中,您将启用Key Authentication插件。API密钥身份验证是最流行的API身份验证方法之一,可以实现根据需要创建和删除访问密钥。
有关更多信息,请参见什么是API网关身份验证。
4.3 设置密钥认证插件
在端口上调用 Admin API8001并配置插件以启用密钥身份验证。对于本示例,将插件应用于您创建的/mock路由:
代码语言:javascript复制curl -X POST http://<admin-hostname>:8001/routes/mocking/plugins
--data name=key-auth
尝试再次访问该服务:
代码语言:javascript复制curl -i http://<admin-hostname>:8000/mock
由于您添加了密钥身份验证,您应该无法访问它:
代码语言:javascript复制HTTP/1.1 401 Unauthorized
...
{
"message": "No API key found in request"
}
在Kong代理此路由的请求之前,它需要一个API密钥。对于本例,由于您安装了Key Authentication插件,所以首先需要创建一个具有关联密钥的消费者(consumer)。
4.4 设置消费者和凭证(Consumers and Credentials)
要创建消费者(consumer),请调用 Admin API 和消费者的端点。下面创建了一个名为consumer的新消费者:
代码语言:javascript复制curl -i -X POST http://<admin-hostname>:8001/consumers/
--data username=consumer
--data custom_id=consumer
配置后,调用 Admin API 为上面创建的使用者配置密钥。对于此示例,将密钥设置为apikey。
代码语言:javascript复制curl -i -X POST http://<admin-hostname>:8001/consumers/consumer/key-auth
--data key=apikey
如果没有输入密钥,Kong 会自动生成密钥。
结果:
代码语言:javascript复制HTTP/1.1 201 Created
...
{
"consumer": {
"id": "2c43c08b-ba6d-444a-8687-3394bb215350"
},
"created_at": 1568255693,
"id": "86d283dd-27ee-473c-9a1d-a567c6a76d8e",
"key": "apikey"
}
您现在有了一个用户,它提供了一个API KEY来访问路由。 验证密钥认证: 要验证密钥身份验证插件,请再次访问模拟路由,使用apikey密钥值为的标头apikey。
代码语言:javascript复制curl -i http://<admin-hostname>:8000/mock/request
-H 'apikey:apikey'
您应该收到一条HTTP/1.1 200 OK消息作为回应。
4.5 (可选)禁用插件
如果您逐个主题地遵循本入门指南,则需要在以后的任何请求中使用此 API 密钥。如果您不想继续指定密钥,请在继续之前禁用插件。
代码语言:javascript复制curl -X GET http://<admin-hostname>:8001/routes/mocking/plugins/
输出:
代码语言:javascript复制"id": "2512e48d9-7by0-674c-84b7-00606792f96b"
禁用插件:
代码语言:javascript复制curl -X PATCH http://<admin-hostname>:8001/routes/mocking/plugins/{
<plugin-id>}
--data enabled=false
总结和后续步骤 在本主题中,您:
- 启用密钥认证插件。
- 创建了一个名为 的新消费者consumer。
- 给消费者一个 API 密钥,apikey以便它可以/mock通过身份验证访问路由。
6. 设置智能负载平衡
在本主题中,您将了解如何配置上游服务(upstream services),并为负载平衡创建多个目标。
6.1 What are Upstreams?
上游(Upstream)对象指的是位于Kong Gateway后面的上游API/服务,客户端请求被转发到该API/服务。在Kong Gateway中,上游对象表示虚拟主机名,可用于健康检查、电路中断和通过多个服务(目标)对传入请求进行负载平衡。
在本主题中,您将配置前面创建的服务(example_service),使其指向上游而不是主机。对于我们的示例,上游将指向两个不同的目标,httpbin.org和mockbin.org。在实际环境中,上游将指向在多个系统上运行的相同服务。
下面是一个说明设置的图表:
6.2 为什么要跨上游目标进行负载平衡?
在下面的示例中,您将使用跨两个不同服务器或上游目标部署的应用程序。Kong Gateway需要在两个服务器之间进行负载平衡,这样,如果其中一个服务器不可用,它会自动检测到问题,并将所有流量路由到工作服务器。
6.3 配置上游(Upstream)服务
在本节中,您将创建一个名为 Upstream 的上游upstream并向其添加两个目标。
代码语言:javascript复制curl -X POST http://<admin-hostname>:8001/upstreams
--data name=upstream
更新您之前创建的服务以指向此上游:
代码语言:javascript复制curl -X PATCH http://<admin-hostname>:8001/services/example_service
--data host='upstream'
向上游添加两个目标,每个目标都有端口 80:mockbin.org:80和 httpbin.org:80:
代码语言:javascript复制curl -X POST http://<admin-hostname>:8001/upstreams/upstream/targets
--data target='mockbin.org:80'
$ curl -X POST http://<admin-hostname>:8001/upstreams/upstream/targets
--data target='httpbin.org:80'
你现在有上游有两个目标,httpbin.org以及mockbin.org和服务指向上游。 验证上游服务:
- 配置 Upstream 后,通过http://:8000/mock使用 Web 浏览器或 CLI访问路由来验证它是否正常工作。
- 继续点击端点(Continue hitting the endpoint),站点应该从httpbin变为mockbin。
7. 管理行政(Administrative)团队
在本主题中,您将学习如何使用Kong Gateway(企业)中的工作空间和团队管理和配置用户授权。
7.1 工作区和团队概述
许多组织都有严格的安全要求。例如,组织需要能够隔离管理员的职责,以确保管理员的错误或恶意行为不会导致停机。Kong Gateway (Enterprise)提供了许多安全功能,以帮助客户保护管理环境。
工作空间使组织能够将对象和管理员划分到名称空间中。分割允许共享同一个Kong Gateway集群的管理员团队采用与特定对象交互的角色。例如,一个团队(团队A)可能负责管理一个特定的服务,而另一个团队(团队B)可能负责管理另一个服务。团队应该只拥有在特定工作空间中执行管理任务所需要的角色。
Kong Gateway通过基于角色的访问控制(RBAC)完成所有这些工作。所有管理员都可以被赋予特定的角色,无论您使用的是Kong Manager还是Admin API,后者控制和限制特定工作空间中的管理权限范围。
在本例中,您将首先创建一个名为SecureWorkspace的简单工作空间。然后,您将为该工作区创建一个管理员,其权限仅管理SecureWorkspace中的对象,而不管理其他任何东西。
注意:本主题中的步骤不能使用声明性配置执行。
7.2 保护您的网关安装
在较高级别上,保护 Kong Gateway 管理是一个两步过程:
- 打开 RBAC。
- 为隔离管理创建一个工作区和一个管理员。
在入门指南中,你已经作为内置的超级管理员kong_admin与你的环境交互。这个kong_admin用户的密码是在安装过程中使用KONG_PASSWORD环境变量“播种”的。启用RBAC之后,您将需要使用适当的凭据对Kong Manager和Kong Gateway Admin API进行身份验证。
在下面的部分中,您将需要kong_admin帐户的密码来登录到Kong Gateway,并且需要配置kong_admin_uri以避免出现CORS错误。
开启 RBAC 要启用RBAC,您将需要首次安装Kong Gateway并运行迁移时使用的初始KONG_PASSWORD。这也是超级管理员的默认密码,一旦RBAC打开,这将是必需的。
基于 UNIX 的系统或 Windows:
在本指南之外,您可能希望根据您的安装以不同方式修改这些设置。您可以在此处阅读有关这些设置的更多信息:Kong Manager 的基本身份验证。
7.3 创建工作区
创建一个名为 SecureWorkspace 的新工作区,用kong_admin 帐户密码代替:
代码语言:javascript复制curl -X POST http://<admin-hostname>:8001/workspaces
-H Kong-Admin-Token:<super-user-token>
--data 'name=SecureWorkspace'
注意:无论字母大小写,每个工作区名称都应该是唯一的。例如,将一个工作区命名为“Payments”和另一个“payments”将创建两个看起来相同的不同工作区。
警告:
授予对默认工作区的访问权限可以访问组织中的所有工作区。 不要给工作区命名与 Kong Manager 中的任何这些主要路由相同的名称:
Admins | APIs | Certificates | Consumers |
Plugins | Portal | Routes | Services |
SNIs | Upstreams | Vitals | PermalinkStep |
如果您无法使用kong_admin的令牌登录,并且您知道凭据是正确的,那么您的 Kong 网关配置可能有问题。仔细检查设置,或者,如果问题的原因仍然不清楚,请与您的 Kong Konnect 客户团队和 Kong 支持人员一起寻求帮助。
7.4 创建管理员
接下来,为 SecureWorkspace 创建管理员,授予他们仅管理该工作区的权限。
注意:以下方法引用/users端点并创建一个 Admin API 用户,该用户不会通过 Kong Manager 可见(或可管理)。如果您想稍后通过 Kong Manager 管理管理员,请改为在/admins端点下创建它。
创建一个以secureworkspaceadminRBAC 令牌 命名的新用户secureadmintoken:
代码语言:javascript复制curl -X POST http://<admin-hostname>:8001/SecureWorkspace/rbac/users
-H Kong-Admin-Token:<super-user-token>
--data 'name=secureworkspaceadmin'
--data 'user_token=secureadmintoken'
在工作区中创建一个空白角色并将其命名为admin:
代码语言:javascript复制curl -X POST http://<admin-hostname>:8001/SecureWorkspace/rbac/roles
-H Kong-Admin-Token:<super-user-token>
--data 'name=admin'
授予admin角色权限以在工作区中的所有端点上执行所有操作:
代码语言:javascript复制curl -X POST http://<admin-hostname>:8001/SecureWorkspace/rbac/roles/admin/endpoints/
-H Kong-Admin-Token:<super-user-token>
--data 'endpoint=*'
--data 'workspace=SecureWorkspace'
--data 'actions=*'
将admin角色授予secureworkspaceadmin:
代码语言:javascript复制curl -X POST http://<admin-hostname>:8001/SecureWorkspace/rbac/users/secureworkspaceadmin/roles/
-H Kong-Admin-Token:<super-user-token>
--data 'role=admin'
验证新管理员:
尝试default使用secureworkspaceadmin的用户令牌访问工作区。 使用卷曲:
然后,尝试访问相同的端点,但这次是在SecureWorkspace. 使用卷曲:
就是这样!您现在正在使用 RBAC 控制对 Kong Gateway 管理的访问。
7.5 参考:将 decK 与 RBAC 和工作区一起使用
RBAC 启用 RBAC 后,kong-admin-token每次使用 decK 时都必须在标头中传递:
代码语言:javascript复制deck sync --headers "kong-admin-token:mytoken"
注意:您不应使用具有 decK 超级管理员权限的 RBAC 令牌。始终将范围缩小到您需要授予 decK 的确切权限。
工作区 当您有多个工作区时,decK 会为每个工作区创建一个文件。按如下方式导出它们:
代码语言:javascript复制deck dump --all-workspaces
或者,仅导出一个工作区的配置:
代码语言:javascript复制deck dump --workspace SecureWorkspace
您可以在任何 decK 命令中使用这些标志来更新和导出您的配置。
7.6 总结和后续步骤
在本主题中,您:
- 启用 RBAC。
- 创建了一个名为 的工作区SecureWorkspace。
- 创建了一个名为 adminsecureworkspaceadmin并授予他们管理SecureWorkspace.
8. 发布、定位和使用服务
此功能仅适用于 Kong Konnect 订阅。
https://docs.konghq.com/getting-started-guide/2.4.x/dev-portal/
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/153202.html原文链接:https://javaforall.cn