出于管理的目的,kong 内置了一套 RESTful Admin Api , 主要有 服务、路由、消费者、证书、上游服务,本文讲述 Admin Api 的基本情况并详细讲述 服务、路由、消费者。后续的博文将讲述证书、上游服务。之后会搭建一套系统用于创建APP、用户注册、登录等。
如果你还不知道 kong 是什么,可以参考 我之前写的博客 并安装它,本文默认你已经安装了 kong ,下面我们进入主题,分别从 Admin Api 概况、服务、路由、消费者四个方面来讲述。
Admin Api 概况
如果让你开发一套网关,那么你会开发出那些功能呢?我说下我的想法,首先,我的网关会进行统一授权登录,那么,如果用户就是不登录呢?那也简单,可以用默认的匿名账号登录,另外,用户用这个匿名账号的过程中产生的数据还可以在其注册后合并到注册账户里,因为很多时候,无论开发什么产品基本都会涉及登录、注册、绑定、激活、找回密码等等,其次,我的网关可以保护我的API,这个很好理解,既然需要登录,那么自然需要保护API,其次还可以限制频率等等。你会发现,你需要的不是一套网关系统而是一套具有完整用户注册、登录、找回密码、激活等的系统。
kong 提供的 Admin Api 接受两种格式的数据,即 application/x-www-form-urlencoded 以及 application/json 前者你的参数在 body 里以 key=value&key2=value2 的形式传递,后者你的 body 是json,我自然推荐你使用后者,下面我们进入第二个主题,用 Admin Api 管理 服务。
创建、更新、获取和删除 服务
kong 提供的 Admin Api 一般都包括 创建、获取、列出、更新、更新或创建、删除 等操作,下面,我们看看针对 service 的操作吧。
- 创建服务:请求路径 /services 请求方式 post,参数如下:
{ "name": "service name", "protocol": "http or https", "host": "host of upstream server", "port": "port of upstream server default 80", "path": "path of upstream server, empty by default", "retries": "retries times if failure to proxy, 5 by default", "connect_timeout": "60000 by default, one minute", "write_timeout": "60000 by default", "read_timeout": "60000 by default", "url": "set protocol、host、path at once, write only, never return this value" }
这里,name 为可选的,但建议你填写它。protocol、host、port 或者 url 你需要提供其中一个,其他保持默认可以的,比如:
{ "name": "oauth2-ssyer", "connect_timeout": 10000, "write_timeout": 10000, "read_timeout": 10000, "url": "http://127.0.0.1:3000/" }
- 服务详情:/services/{name or id} get 或 /routes/{route id}/service get
- 列出服务:/services/ get 参数 offset、size
- 更新服务:/services/{name or id} patch 或 /routes/{route id}/service patch 参数同 创建服务。
- 更新或添加服务:/services/{name or id} put 参数同 创建服务
- 删除服务:/services/{name or id} delete
创建、更新、获取和删除 路由
- 创建路由:/routes/ post 参数:
{ "protocols": "http or https,[http, https] by default", "methods": "get、post等", "hosts": "host array", "paths": "匹配的前缀,只有该前缀的请求才会代理", "strip_path": "true or false,如果填写了 paths,则代理的时候删除 path 部分后作为代理url", "preserve_host": "当为true 时将使用客户端请求的headers里的Host作为上游的Host,默认为false", "service": "与之关联的service的id" }
这里,protocols、methods、hosts、path均接收一个数组,而 strip_path、preserve_host 为boolean类型,最后的service其实是一个对象。如果用表单,你提交的可能如下:
protocols[]=http&protocols[]=https&methods[]=GET&methods[]=OPTIONS&service.id=xxx
至于 hosts、path 参数可以参考methods,如果用json,则如下:
{ "protocols": [ "http", "https" ], "methods": [ "GET", "POST" ], "hosts": [ "service1.com", "service2.com" ], "paths": [ "path/one", "path/two" ], "strip_path": true, "preserve_host": false, "service": { "id": "xxx" } }
这里,可以仅指定 protocols、host、service
- 获取路由详情 /routes/{id} get
- 列出所有路由 /routes get 参数 offset、size
- 列出与某个service关联的路由 /services/{service name or id}/routes get
- 更新路由 /routes/{id} patch 参数同 1
- 更新或创建一个路由 /routes/{id} put 参数同1
- 删除路由 /routes/{id} delete
创建、获取、更新和删除消费者
- 创建消费者 /consumers/ post,参数:username、custom_id,两者必须指定一者,我的建议是指定username
- 获取详情 /consumers/{username or id} get
- 列出 /consumers/ get 参数 custom_id 可选
- 更新 /consumers/{username or id} patch
- 更新或创建 /consumers/{username or id} put 参数同 1
- 删除 /consumers/{username or id} delete
上面可能仅仅是简单的罗列,但是也能熟识下kong的admin api,由于遵从 RESTful风格,所以大家似曾相识。我之后再补充其余的 admin api,这部分主要参考:https://docs.konghq.com/0.14.x/admin-api/