KONG基础使用

简介:

KONG是一个基于Nginx的API Gateway。提供了诸如身份认证,权限控制,流量控制,日志等一系列API相关的组件,可谓相当方便。
KONG项目首页
KONG入门
KONG的Github地址
KONG Admin API一览
KONG插件列表

安装

以Linux RedHat 6.2为例:
从此处下载对应二进制rpm包,按操作安装即可
KONG RedHat Release
注意如果yum出现无法获取metalink的错误,
sudo vi /etc/yum.repos.d/epel.repo
注释掉所有mirrorlist,取消所有baseurl的注释即可。

简介

KONG是一个API Gateway,顾名思义,就是API的出口。
内部系统的API可以随意编写,但如果要对外服务,就一定需要各种权限控制。

测试环境

首先,我们写一个Mock API,进行测试之用。

 
  1. import tornado.ioloop
  2. import tornado.web
  3. class MainHandler(tornado.web.RequestHandler):
  4. call_cnt = 0
  5. def get(self):
  6. MainHandler.call_cnt+= 1
  7. self.write("GET / %s"%MainHandler.call_cnt)
  8. def post(self):
  9. MainHandler.call_cnt+= 1
  10. self.write("POST / %s"%MainHandler.call_cnt)
  11. class TestHandler(tornado.web.RequestHandler):
  12. call_cnt = 0
  13. def get(self):
  14. TestHandler.call_cnt += 1
  15. self.write("GET /test %s"%TestHandler.call_cnt)
  16. def post(self):
  17. TestHandler.call_cnt += 1
  18. self.write("POST /test %s"%TestHandler.call_cnt)
  19. def make_app():
  20. return tornado.web.Application([
  21. (r"/", MainHandler),
  22. (r"/test", TestHandler)
  23. ])
  24. if __name__ == "__main__":
  25. app = make_app()
  26. app.listen(8812)
  27. tornado.ioloop.IOLoop.current().start()

这是一个用Tornado写的简易REST测试 API,用以下命令后台启动
nohup python test_api.py 1>/dev/null 2>log &;

 
  1. # 测试Endpoint:/
  2. curl -i -X GET http://localhost:8812/
  3. curl -i -X POST http://localhost:8812/
  4. curl -i -X DELETE http://localhost:8812/
  5. # 测试Endpoint:/test
  6. curl -i -X GET http://localhost:8812/test
  7. curl -i -X POST http://localhost:8812/test
  8. curl -i -X DELETE http://localhost:8812/test

现在我们已经有一个正常工作的REST API了。是时候使用KONG了。

KONG的使用基本和NGINX如出一辙。默认的工作目录是/usr/local/kong,默认的配置文件是/etc/kong/kong.yml。如果需要工作在1024以下的端口,则要求root权限。
KONG的启动命令很简单,就是kong start
但是启动之前需要编辑配置文件。
需要关注的主要是几个点:
发送匿名统计报告,(默认打开,一定要关闭)
后端数据库的配置,(默认Cassandra,建议Postgres)
内存缓存大小配置,(默认128M,建议1G)
出口端口(默认HTTP 8000,HTTPS 8443,建议直接改成80和443)
管理端口(默认8001,我改成8888比较吉利)
配置好之后,启动KONG即可。

配置

KONG的配置完全通过REST API完成,Admin端口在配置文件中可以配置,下面全部使用http://localhost:8888/作为Admin EndPoint
使用什么语言的HTTP库都可以完成这个工作,这里直接使用Linux自带的curl。

注册API

第一步,我们需要先注册我们的API
假设我们想把上面那个API挂载到/test路径下,
即用户访问http://localhost/test/ 时,会返回GET /
用户访问http://localhost/test/test 时,会返回GET /test

执行

 
  1. # 查看当前已经注册的API
  2. curl -X GET http://localhost:8888/apis/
  3. # 注册一个新的API
  4. curl -i -X POST http://localhost:8888/apis/ -d "name=testapi" -d "request_path=/test" -d "upstream_url=http://localhost:8812/" -d "strip_request_path=true"

这里注册URL的几个参数意思是,这个API注册的名字叫testapi。它被挂载在网关的/test路径下,上游转发到http://localhost:8812去处理,转发的时候把前面的/test前缀给去掉。

 
  1. {"upstream_url":"http:\/\/localhost:8812\/","request_path":"\/test","id":"a302c28c-eb8a-4e53-bac2-9acb68695f3b","created_at":1468379310000,"preserve_host":false,"strip_request_path":true,"name":"testapi"}

返回结果表明API创建的结果。一般会返回一个API的ID。
这就表明API注册完成,我们可以测试一下:

 
  1. curl -i -X GET http://localhost/test
  2. curl -i -X POST https://localhost/test/test --insecure

如同我们预期的一样返回正确的结果,说明API已经成功注册。

当然,仅仅把API注册了开放出去,其实也就是把多个API集成到一个EndPoint,实际意义并不大,下面我们来试一试高级一点的功能。

注册插件

KONG自带插件目前可以分为以下几类:
身份认证,安全,流量控制,分析监控,格式转换,日志。
KONG插件列表
有的API完全开放,不需要任何认证,有的API会涉及敏感数据,权限控制需要非常严格。有的API完全不在乎调用频次或者日志,有的则反过来。
值得高兴的是,KONG的插件独立作用于每一个API,不同的API可以使用完全不同的插件。提供了相当灵活的配置策略。

现在我们首先给这个测试API加上基本的权限验证。

 
  1. curl -X POST http://localhost:8888/apis/testapi/plugins -d "name=key-auth"
  2. # 这个时候再去调用这个API就会返回401 Unauthorized
  3. curl -i -X GET http://localhost/test

添加用户

朴素的API可能压根没有严格的用户概念,端口大开,随便哪个阿猫阿狗都能进来扫一扫看一看。这可不行。
KONG有一个consumer的概念,consumer是全局共用的。
比如某个API启用了key-auth,那么没有身份的访问者就无法调用这个API了。
需要首先创建一个Consumer,然后在key-auth插件中为这个consumer生成一个key。
然后就可以使用这个key来透过权限验证访问API了。

同理,如果另外一个API也开通了key-auth插件,那么这个consumer也是可以通过key-auth验证访问这个API的,如果要控制这种情况,就需要ACL插件。
(认证与权限乃是两个不同的事物)

首先我们创建一个名为test_user的consumer

 
  1. # 获取所有Consumer列表
  2. curl -X GET http://localhost:8888/consumers/
  3. # 创建一个新的Consumer
  4. curl -X POST http://localhost:8888/consumers/ -d "username=testuser"

然后,我们在key-auth插件中为它创建一个key

 
  1. curl -X POST http://localhost:8888/consumers/testuser/key-auth -d "key=testkey"

这次加上apikey首部进行验证,成功调用

 
  1. curl -i -X GET http://localhost/test --header "apikey: testkey"

删除用户

 
  1. curl -i -X DELETE http://localhost:8888/consumers/testuser

删除插件

 
  1. # 查询API拥有的插件ID
  2. curl -i -X GET http://localhost:8888/apis/testapi/plugins/
  3. # 根据插件ID删除插件。
  4. curl -i -X DELETE http://localhost:8888/apis/testapi/plugins/e49a2b2e-4c36-4c6a-bd1a-b5b065e63bb8

以上是基本的API,Consumer,Plugin的基本介绍。

ACL插件

 
  1. # 注册overseas_index API
  2. curl -X POST http://localhost:8888/apis/ -d "name=overseas_index" -d "upstream_url=http://10.182.20.128:8848/" -d "request_path=/stat/overseas" -d "strip_request_path=true"
  3. # 为海外版API注册key-auth插件
  4. curl -X POST http://localhost:8888/apis/overseas_index/plugins --data "name=key-auth"
  5. # 创建overseas_user 用户
  6. curl -X POST http://localhost:8888/consumers/ -d "username=overseas_test"
  7. # 为overseas_test创建权限验证
  8. curl -X POST http://localhost:8888/consumers/overseas_test/key-auth -d ""
  9. # 尝试查询海外版指标接口
  10. curl -X POST https://10.182.20.127/stat/overseas/realtime -d "app_id=53ace32656240b11c2071b1a" -d "date=2015-07-22" -H "apikey: 5e3b2a7a735744b39aeea9ebc2de1f01" --insecure
  11. # 给测试API
  12. curl -X POST https://10.182.20.128/test -d "app_id=53ace32656240b11c2071b1a" -d "date=2015-07-22" -H "apikey: 5e3b2a7a735744b39aeea9ebc2de1f01" --insecure

设置ACL插件

 
  1. # 给另外一个testapi加上权限验证插件,现在任何通过认证的用户都可以调用此API
  2. # 这不是我们所希望的,所以需要加入ACL控制
  3. curl -X POST http://localhost:8888/apis/testapi/plugins --data "name=key-auth"
  4. # 为用户overseas_test创建ACL群组:overseas_user
  5. curl -X POST http://localhost:8888/consumers/overseas_test/acls \
  6. --data "group=overseas_user"
  7. # 为用户overseas_test创建ACL群组:overseas_user
  8. curl -X POST http://localhost:8888/consumers/overseas_test/acls \
  9. --data "group=overseas_user"
目录
打赏
0
0
0
1
690
分享
相关文章
Nginx、Kong、Apisix、Gateway网关比较
Nginx、Kong、Apisix、Gateway网关比较
2217 1
Nginx、Kong、Apisix、Gateway网关比较
Kong05- Kong 的健康检查和监控
您可以让 Kong 代理的 API 使用 ring-balancer , 通过添加包含一个或多个目标实体的upstream 实体来配置,每个目标指向不同的IP地址(或主机名)和端口。ring-balancer 将在不同的target之间平衡负载,并基于 uptream 配置对目标执行健康检查,使它们成为健康或不健康的,无论它们是否响应,ring-balancer 将只把流量路由到健康的target。
2906 0
政采云业务网关实践:使用 Higress 统一替代 APISIX/Kong/Istio Ingress
政采云基础架构团队技术专家朱海峰介绍了业务网关项目的背景和解决方案。
180 17
深入理解 Nginx 与 Kong 的配置与实践
在微服务架构中,Nginx 用于配置负载均衡,如示例所示,定义上游`pay-service`包含不同权重的服务节点。Kong API 网关则通过service和route进行服务管理和路由,与Nginx的upstream和location类似。通过Kong的命令行接口,可以创建upstream、target、service和route,实现对后端服务的负载均衡和请求管理。Nginx和Kong协同工作,提供高效、灵活的API管理和流量控制。
284 1
深入理解 Nginx 与 Kong 的配置与实践
Docker 安装 KONG 带你玩转 API 网关
**摘要:** 在微服务架构中,API网关Kong作为流行开源选择,提供身份验证、安全和流量控制等功能。通过Docker部署Kong简单高效。步骤包括:创建Docker网络,部署PostgreSQL数据库,初始化Kong数据库,启动Kong容器,并检查运行状态。此外,安装Konga管理界面便于直观管理Kong。使用Docker命令行,逐步设置环境变量和网络连接,即可完成安装。当不再需要时,可清理相关容器和网络。Kong结合Konga,为API管理提供强大且用户友好的解决方案。
509 1
Traefik Middleware 插件实践
话说,作为一款开源的边缘路由器,Traefik 或多或少算是一款比较牛逼的新生代组件,其不仅可以作为接入层组件,实现流量转发等相关功能,同时也可以支撑网关层的相关功能,尤其是 2.x 版本中的自定义中间件功能。
495 0
kong gateway 插件使用
kong 插件使用, 其中限流插件是默认安装的
370 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等