高性能分布式API网关Kong2

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
云原生 API 网关,700元额度,多规格可选
简介: 高性能分布式API网关Kong2

5 kong 部署

5.1 搭建网络

首先我们创建一个Docker自定义网络,以允许容器相互发现和通信。在下面的创建命令中kong-net是我们创建的Docker网络名称。xxxxxxxxxx docker network create kong-net

5.2 搭建数据库环境

Kong 目前使用Cassandra(Facebook开源的分布式的NoSQL数据库) 或者PostgreSql,你可以执行以下命令中的一个来选择你的Database。请注意定义网络 --network=kong-net

xxxxxxxxxx
docker run -d --name kong-database --network=kong-net -p 5432:5432 -v /tmp/data/kong:/var/lib/postgresql/data -e "POSTGRES_USER=kong" -e "POSTGRES_DB=kong" -e "POSTGRES_PASSWORD=kong" postgres:11.7

5.3 kong网关部署

5.3.1 初始化kong数据

使用docker run --rm来初始化数据库,该命令执行后会退出容器而保留内部的数据卷(volume)。

xxxxxxxxxx
docker run --rm --network=kong-net -e "KONG_DATABASE=postgres" -e "KONG_PG_HOST=kong-database" -e "KONG_PG_PASSWORD=kong" -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" kong:latest kong migrations bootstrap

这个命令我们还是要注意的,一定要跟你声明的网络,数据库类型、host名称一致。同时注意Kong的版本号,本文是在Kong 1.4.x 版本下完成的。

出现如下信息说明数据初始化成功


5.3.2 启动Kong容器

完成初始化数据库后,我们就可以启动一个连接到数据库容器的Kong容器,请务必保证你的数据库容器启动状态,同时检查所有的环境参数 -e 是否是你定义的环境

xxxxxxxxxx
docker run -d --name kong \
--network=kong-net \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-database" \
-e "KONG_PG_PASSWORD=kong" \
-e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
-e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
-e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
-e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
-e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
-e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \
-p 8000:8000 \
-p 8443:8443 \
-p 8001:8001 \
-p 8444:8444 \
kong:latest

5.3.3 验证

通过服务器执行curl访问尝试服务是否已经启动

xxxxxxxxxx
curl http://localhost:8001/status

出现如下信息说明服务已经启动

6 Kong配置

6.1 nginx模板

我们来看一个典型 Nginx 的配置对应在 Kong 上是怎么样的,下面是一个典型的 Nginx 配置

xxxxxxxxxx
upstream passportUpstream {
    server 192.168.64.1:9001 weight=10;
    server 192.168.64.1:9002 weight=10;
}
server {
    listen 80;
    location /hello {
        proxy_pass http://passportUpstream;
    }
}

6.2 kong配置案例

下面我们开看看其对应 Kong 中的配置

xxxxxxxxxx
# 配置 upstream 
curl -X POST http://localhost:8001/upstreams --data "name=passportUpstream" 
# 配置 target 
curl -X POST http://localhost:8001/upstreams/passportUpstream/targets  --data "target=172.16.44.47:9001" --data "weight=10" 
# 配置 service 
curl -X POST http://localhost:8001/services --data "name=hello" --data "host=passportUpstream" 
# 配置 route 
curl -X POST http://localhost:8001/routes \
--data "paths[]=/hello" \
--data "service.id=2fa18352-2aed-449d-9707-8cbfadba3972"

这一切配置都是通过其 Http Restful API 来动态实现的,无需我们再手动的 reload Nginx.conf

6.3 测试验证

可以通过如下URL进行测试

xxxxxxxxxx
http://192.168.245.145:8000/hello/index

6.4 Kong关键术语

在上述的配置中涉及到了几个概念: Upstream、Target、Service、Route 等概念,它们是 Kong 的几个核心概念,也是我们在使用 Kong API 时经常打交道的,下面我们就其几个核心概念做一下简单的说明。

6.4.1 Upstream

Upstream 对象表示虚拟主机名,可用于通过多个服务(目标)对传入请求进行负载均衡。例如:service.v1.xyz 为 Service 对象命名的上游 Host 是 service.v1.xyz 对此服务的请求将代理到上游定义的目标。

6.4.2 Target

目标 IP地址/主机名,其端口表示后端服务的实例。每个上游都可以有多个 Target,并且可以动态添加 Target。

由于上游维护 Target 的更改历史记录,因此无法删除或者修改 Target。要禁用目标,请发布一个新的 Targer weight=0,或者使用 DELETE 来完成相同的操作

6.4.3 Service

顾名思义,服务实体是每个上游服务的抽象,服务的示例是数据转换微服务,计费API等。

服务的主要属性是它的 URL(其中,Kong 应该代理流量),其可以被设置为单个JSON串或通过指定其 protocol, host,port 和path。

服务与路由相关联(服务可以有许多与之关联的路由),路由是 Kong 的入口点,并定义匹配客户端请求的规则。一旦匹配路由,Kong 就会将请求代理到其关联的服务。


6.4.4 Route

路由实体定义规则以匹配客户端的请求。每个 Route 与一个 Service 相关联,一个服务可能有多个与之关联的路由,与给定路由匹配的每个请求都将代理到其关联的 Service 上。可以配置的字段有:


  • hosts
  • paths
  • methods

Service 和 Route 的组合(以及它们之间的关注点分离)提供了一种强大的路由机制,通过它可以在 Kong 中定义细粒度的入口点,从而使基础架构路由到不同上游服务。

6.4.5 Consumer

Consumer 对象表示服务的使用者或者用户,你可以依靠 Kong 作为主数据库存储,也可以将使用者列表与数据库映射,以保持Kong 与现有的主数据存储之间的一致性。


6.4.6 Plugin

插件实体表示将在 HTTP请求/响应生命周期 期间执行的插件配置。它是为在 Kong 后面运行的服务添加功能的,例如身份验证或速率限制。

将插件配置添加到服务时,客户端向该服务发出的每个请求都将运行所述插件。如果某个特定消费者需要将插件调整为不同的值,你可以通过创建一个单独的插件实例,通过 service 和 consumer 字段指定服务和消费者。

7 kongAPI操作

7.1 配置网关

7.1.1 配置服务

xxxxxxxxxx
# 添加服务
curl -i -X POST http://192.168.64.181:8001/services/ -d 'name=test-service' -d 'url=http://116.62.213.90/1.html'

url 参数是一个简化参数,用于一次性添加 protocol,host,port 和 path。

7.1.2 添加路由

xxxxxxxxxx
# 添加service 的路由
curl -i -X POST http://192.168.64.181:8001/routes/ -d 'methods=GET' -d 'paths=/service' -d 'service.id=65c11356-e86d-431e-a76a-aa7c3acd9aeb'

7.1.3 访问测试

xxxxxxxxxx
# 通过如下URL访问
http://192.168.64.181:8000/service?a=123

7.2 配置负载均衡

7.2.1 配置 upstream 和 target

创建一个名称 load 的 upstream

xxxxxxxxxx
curl -X POST http://192.168.64.181:8001/upstreams --data "name=load"

添加3000 端口的负载

xxxxxxxxxx
curl -X POST http://192.168.64.181:8001/upstreams/load/targets --data "target=192.168.64.1:9001" --data "weight=10"
curl -X POST http://192.168.64.181:8001/upstreams/load/targets --data "target=192.168.64.1:9002" --data "weight=10"

如上的配置对应了 Nginx 的配置

xxxxxxxxxx
upstream load {
    server 192.168.64.181:9001 weight=10;
    server 192.168.64.181:9002 weight=10;
}

7.2.2 配置service

host 的值便对应了 upstream 的名称,配置成功后会返回生成的 service 的 id

xxxxxxxxxx
curl -X POST http://192.168.64.181:8001/services --data "name=load-service" --data "host=load"

7.2.3 配置路由信息

这里的service.id 就是上面添加service

xxxxxxxxxx
curl -X POST http://192.168.64.181:8001/routes --data "paths[]=/load" --data "service.id=3a6b839b-00c1-49b7-b271-8024a12d19be"

7.2.4 访问测试

http://192.168.64.181:8000/load/index

8 安装Kong 管理UI

Kong 企业版提供了管理UI,开源版本是没有的。但是有很多的开源的管理 UI ,其中比较好用的是Konga。项目地址:https://github.com/pantsel/konga

8.1 初始化konga数据

使用docker run --rm来初始化数据库,该命令执行后会退出容器而保留内部的数据卷(volume)。

xxxxxxxxxx
docker run --name konga --rm \
--network=kong-net \
pantsel/konga -c prepare -a postgres -u postgresql://kong:kong@kong-database:5432/kong

执行后出现如下界面说明执行成功

8.2 启动konga

xxxxxxxxxx
docker run -p 1337:1337 -d \
--network=kong-net \
-e "DB_ADAPTER=postgres" \
-e "DB_HOST=kong-database" \
-e "DB_USER=kong" \
-e "DB_PASSWORD=kong" \
-e "DB_DATABASE=kong" \
-e "KONGA_HOOK_TIMEOUT=120000" \
-e "DB_PG_SCHEMA=public" \
-e "NODE_ENV=production" \
--name konga \
pantsel/konga

8.3 验证

通过浏览器请求 http://IP:1337 检查是否能够访问,如果能够访问说明已经启动成功

8.4 连接kong网关

在这个界面添加一个用户 登录就可以看到如下页面


点击Connections 来填加kong的信息

添加kong名称以及API地址就可以管理kong了

添加后点击’active’激活按钮就可以激活kong网关

然后就会出现如下界面管理可以通过菜单操作管理kong

8.5 限流插件

限流的场景:服务提供的能力是有限的。为了防止大量的请求将服务拖垮,可以通过网关对服务的请求做限流。例如:某个服务1s只能处理100个请求,超过限流阈值的请求丢弃。

8.5.1 路由配置限流

为/load的路由添加限流插件

设置限流为每分钟2个

8.5.2 测试验证

多次访问 http://192.168.64.150:8000/load 发现已经被限流了

8.5.3 配置属性如下

属性 说明 是否必须 默认 示例
consumer 设置消费之,当时用身份认证时能够识别出消费者 所有消费者
second 限制每秒最多有几个请求 2
minute 限制每分钟最多有几个请求 10
hour 限制每小时最多有几个请求 100
day 限制每天最多有几个请求 100
year 限制每年最多有几个请求 100
limit by 统计限额的标准,consumer, credential, ip, service,如果无法确定,将以IP为主 consumer consumer
policy cluster:将计数器保存在数据库里,local:将计数器保存在本地,redsi:将计数器保存在redis里面 cluster cluster
fault tolerant 第三方数据存储遇到问题时是否会代理请求,如果为YES,在数据库恢复正常前,限流将会禁用,如果为 NO,将会报500错误 YES YES
redis host 当 policy 为 redis 时设置
redis port 当 policy 为 redis 时设置 6379
redis password 当 policy 为 redis 时设置
redis timeout 当 policy 为 redis 时设置 2000
redis database 当 policy 为 redis 时设置 0
hide client headers 隐藏客户端响应头 NO NO


目录
相关文章
|
1月前
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
43 5
|
1月前
|
SQL 缓存 测试技术
构建高性能RESTful API:最佳实践与避坑指南###
—— 本文深入探讨了构建高性能RESTful API的关键技术要点,从设计原则、状态码使用、版本控制到安全性考虑,旨在为开发者提供一套全面的最佳实践框架。通过避免常见的设计陷阱,本文将指导你如何优化API性能,提升用户体验,确保系统的稳定性和可扩展性。 ###
61 12
|
1月前
|
监控 安全 API
拥抱开源:下一代API管理工具Kong的崛起
【10月更文挑战第27天】在微服务架构和API经济的推动下,API管理成为软件开发的关键环节。Kong作为开源的API管理平台,凭借其灵活性和强大功能,受到开发者的青睐。本文探讨了Kong的核心特性、使用技巧及其在企业中的应用,帮助读者更好地理解和利用这一工具。
|
1月前
|
监控 算法 网络协议
|
2月前
|
中间件 Go API
使用Go语言构建高性能RESTful API
在现代软件开发中,RESTful API因其简洁和高效而成为构建网络服务的首选。Go语言以其并发处理能力和高性能著称,是开发RESTful API的理想选择。本文将介绍如何使用Go语言构建RESTful API,包括基础的路由设置、中间件的使用、数据验证、错误处理以及性能优化。通过实际代码示例,我们将展示Go语言在API开发中的强大功能和灵活性。
|
3月前
|
自然语言处理 搜索推荐 数据库
高性能分布式搜索引擎Elasticsearch详解
高性能分布式搜索引擎Elasticsearch详解
97 4
高性能分布式搜索引擎Elasticsearch详解
|
3月前
|
Go API 开发者
深入探讨:使用Go语言构建高性能RESTful API服务
在本文中,我们将探索Go语言在构建高效、可靠的RESTful API服务中的独特优势。通过实际案例分析,我们将展示Go如何通过其并发模型、简洁的语法和内置的http包,成为现代后端服务开发的有力工具。
|
2月前
|
消息中间件 缓存 API
构建高性能RESTful API的策略与实践
构建高性能RESTful API的策略与实践
42 0
|
3月前
|
前端开发 关系型数据库 MySQL
ThingsGateway:一款基于.NET8开源的跨平台高性能边缘采集网关
ThingsGateway:一款基于.NET8开源的跨平台高性能边缘采集网关
119 2
|
3月前
|
运维 监控 Kubernetes
高效应对突增流量:构建弹性高性能的SMS网关策略
本篇内容来自于ArchSummit全球架构师峰会演讲实录。
177 1

热门文章

最新文章