zoukankan      html  css  js  c++  java
  • apigateway-kong(二)admin-api(结合实例比官网还详细)

    部署好kong之后,则需要将我们自己的接口加入到kong中管理,kong提供了比较全面的restful api,每个版本会有所不同,下面的记录基于kong v0.13.x

    kong的8001端口是resful admin api,服务、路由、配置都是通过这个端口进行管理,所以部署好之后页面可以直接访问localhost:8001

    下面针对每个模块的API进行简介,每个对象模块对应数据库中的一张存储表。

    Information Routes

    获取kong节点的通用详细信息

    管理API的请求日志路径

    /usr/local/opt/kong/logs
    .
    ├── access.log
    ├── admin_access.log #admin-api请求日志
    └── error.log

    查询节点信息

    Example

    curl  http://localhost:8001

    Endpoint

    GET /

    Response

    {
        "plugins": {
            "enabled_in_cluster": [],
            "available_on_server": {
                "response-transformer": true,
                "correlation-id": true,
                "statsd": true,
                "jwt": true,
                "cors": true,
                "basic-auth": true,
                "key-auth": true,
                "ldap-auth": true,
                "http-log": true,
                "oauth2": true,
                "hmac-auth": true,
                "acl": true,
                "datadog": true,
                "tcp-log": true,
                "ip-restriction": true,
                "request-transformer": true,
                "file-log": true,
                "bot-detection": true,
                "loggly": true,
                "request-size-limiting": true,
                "syslog": true,
                "udp-log": true,
                "response-ratelimiting": true,
                "aws-lambda": true,
                "runscope": true,
                "rate-limiting": true,
                "request-termination": true
            }
        },
        "tagline": "Welcome to kong",
        "configuration": {
            "error_default_type": "text/plain",
            "admin_listen": [
                "0.0.0.0:8001"
            ],
            "proxy_access_log": "logs/access.log",
            "trusted_ips": {},
            "prefix": "/usr/local/opt/kong",
            "nginx_conf": "/usr/local/opt/kong/nginx.conf",
            "cassandra_username": "kong",
            "admin_ssl_cert_csr_default": "/usr/local/opt/kong/ssl/admin-kong-default.csr",
            "dns_resolver": {},
            "pg_user": "kong",
            "mem_cache_size": "128m",
            "server_tokens": true,
            "custom_plugins": {},
            "pg_host": "127.0.0.1",
            "nginx_acc_logs": "/usr/local/opt/kong/logs/access.log",
            "proxy_listen": [
                "0.0.0.0:8000"
            ],
            "client_ssl_cert_default": "/usr/local/opt/kong/ssl/kong-default.crt",
            "ssl_cert_key_default": "/usr/local/opt/kong/ssl/kong-default.key",
            "db_update_frequency": 5,
            "db_update_propagation": 0,
            "nginx_err_logs": "/usr/local/opt/kong/logs/error.log",
            "cassandra_port": 9042,
            "dns_order": [
                "LAST",
                "SRV",
                "A",
                "CNAME"
            ],
            "dns_error_ttl": 1,
            "cassandra_lb_policy": "RoundRobin",
            "nginx_optimizations": true,
            "database": "postgres",
            "pg_database": "kong",
            "nginx_worker_processes": "auto",
            "lua_package_cpath": "",
            "lua_package_path": "./?.lua;./?/init.lua;",
            "nginx_pid": "/usr/local/opt/kong/pids/nginx.pid",
            "upstream_keepalive": 60,
            "admin_access_log": "logs/admin_access.log",
            "client_ssl_cert_csr_default": "/usr/local/opt/kong/ssl/kong-default.csr",
            "proxy_listeners": [{
                "ssl": false,
                "ip": "0.0.0.0",
                "proxy_protocol": false,
                "port": 8000,
                "http2": false,
                "listener": "0.0.0.0:8000"
            }],
            "proxy_ssl_enabled": false,
            "lua_socket_pool_size": 30,
            "plugins": {
                "response-transformer": true,
                "correlation-id": true,
                "statsd": true,
                "jwt": true,
                "cors": true,
                "basic-auth": true,
                "key-auth": true,
                "ldap-auth": true,
                "http-log": true,
                "request-termination": true,
                "hmac-auth": true,
                "rate-limiting": true,
                "datadog": true,
                "tcp-log": true,
                "runscope": true,
                "aws-lambda": true,
                "response-ratelimiting": true,
                "acl": true,
                "loggly": true,
                "syslog": true,
                "request-size-limiting": true,
                "udp-log": true,
                "file-log": true,
                "request-transformer": true,
                "bot-detection": true,
                "ip-restriction": true,
                "oauth2": true
            },
            "lua_ssl_verify_depth": 1,
            "cassandra_consistency": "ONE",
            "client_max_body_size": "0",
            "admin_error_log": "logs/error.log",
            "admin_ssl_cert_default": "/usr/local/opt/kong/ssl/admin-kong-default.crt",
            "dns_not_found_ttl": 30,
            "pg_ssl": false,
            "admin_ssl_enabled": false,
            "cassandra_ssl": false,
            "cassandra_repl_strategy": "SimpleStrategy",
            "latency_tokens": true,
            "dns_stale_ttl": 4,
            "cassandra_repl_factor": 1,
            "cassandra_data_centers": [
                "dc1:2",
                "dc2:3"
            ],
            "kong_env": "/usr/local/opt/kong/.kong_env",
            "cassandra_schema_consensus_timeout": 10000,
            "dns_hostsfile": "/etc/hosts",
            "log_level": "notice",
            "admin_ssl_cert_key_default": "/usr/local/opt/kong/ssl/admin-kong-default.key",
            "real_ip_header": "X-Real-IP",
            "db_cache_ttl": 3600,
            "cassandra_timeout": 5000,
            "cassandra_ssl_verify": false,
            "dns_no_sync": false,
            "cassandra_contact_points": [
                "127.0.0.1"
            ],
            "real_ip_recursive": "off",
            "proxy_error_log": "logs/error.log",
            "client_ssl_cert_key_default": "/usr/local/opt/kong/ssl/kong-default.key",
            "nginx_daemon": "on",
            "anonymous_reports": true,
            "ssl_cipher_suite": "modern",
            "nginx_kong_conf": "/usr/local/opt/kong/nginx-kong.conf",
            "pg_port": 5432,
            "pg_ssl_verify": false,
            "client_body_buffer_size": "8k",
            "nginx_admin_acc_logs": "/usr/local/opt/kong/logs/admin_access.log",
            "ssl_cert_csr_default": "/usr/local/opt/kong/ssl/kong-default.csr",
            "admin_listeners": [{
                "ssl": false,
                "ip": "0.0.0.0",
                "proxy_protocol": false,
                "port": 8001,
                "http2": false,
                "listener": "0.0.0.0:8001"
            }],
            "cassandra_keyspace": "kong",
            "ssl_cert_default": "/usr/local/opt/kong/ssl/kong-default.crt",
            "client_ssl": false,
            "ssl_ciphers": "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256"
        },
        "version": "0.13.1",
        "node_id": "e9ca18fb-a82c-4730-83a1-621ceadc3c38",
        "lua_version": "LuaJIT 2.1.0-beta3",
        "prng_seeds": {
            "pid: 752": 149231181689,
            "pid: 751": 159113818774,
            "pid: 750": 702104292191,
            "pid: 753": 191164118531
        },
        "timers": {
            "pending": 5,
            "running": 0
        },
        "hostname": "jeandeMacBook-Pro.local"
    }
    View Code

    部分返回字段含义:

    node_id : 正在运行的kong节点的uuid,当kong启动时随机生成,每次kong重启时这个uuid都会变

    availabel_on_server : kong节点上安装的plugins的名称

    enabled_in_cluster : kong节点中启用的插件,即在数据库中生成了对应存储表

    查询节点状态

    Example

    curl  http://localhost:8001/status

    Endpoint

    GET /status

    Response

    {
        "database": {
            "reachable": true
        },
        "server": {
            "connections_writing": 1,
            "total_requests": 29,
            "connections_handled": 32,
            "connections_accepted": 32,
            "connections_reading": 0,
            "connections_active": 3,
            "connections_waiting": 2
        }
    }

    total_requests : 客户端请求总数

    connections_active : 包括等待连接的活动客户端连接的当前数量

    connections_accepted : 接受的客户端连接的总数

    connections_handled : 处理连接的总数。一般来说,除非达到一定的资源限制,否则参数值与接受值相同

    connections_reading : 当前Kong正在读取请求头的连接数

    connections_writing :   NGINX将响应写入客户端的连接的当前数量

    connections_waiting : 等待请求的空闲客户端连接的当前数量

    reachable : 反映数据库连接状态的布尔值。注意,此标志不反映数据库本身的健康状况。

    API Object

          kong v0.13.x之前的版本是通过这个接口来管理用户接入的API,但是v0.13.x版本之后,官方不建议使用API来管理用户接口,而是用Service和Route模块来替代,管理的更精细。

    KONG API模块管理的是接入kong的上游API,每个接入的api必须至少指定hosts/uris/methods其中一个参数,kong将会代理所有指定upstream url的请求。

    新增一个接入的API

    Example

    curl -i -X POST 
      --url  http://localhost:8001/apis/ 
      --data 'name=weather-api' 
      --data 'hosts=www.sojson.com' 
      --data 'uris=/weather' 
      --data 'upstream_url=https://www.sojson.com/open/api/weather/json.shtml'

    Endpoint

    POST  /apis/

    Request Body

    属性 约束 描述
    name required 接入的API名称
    hosts semi-optional 逗号分割的接入API的域名列表
    uris semi-optional 逗号分割的接入API的前缀path,即指定uri用户通过kong刚问要加上这个path
    methods semi-optional 逗号分割的接入API的HTTP method,如get /post/ put/delete/..
    upstream_url required 代理的上游API Server
    strip_uri optional,default:true 当匹配到uris前缀时,去掉请求的upstream_url中匹配的uris;即uris是挂载在kong的路径下,不是上游接口的path
    preserve_host optional,default:false Kong默认将上游请求的Host头设置为从API的upstream_url中提取的主机名,当通过hosts来匹配API时,确保hosts能转发到上游服务
    retries optional,default:5 代理失败时重试的次数
    upstream_connect_timeout optional,default:60000ms 建立与上游连接的超时时间(ms)
    upstream_send_timeout optional,default:60000ms 在发送请求到上游服务的两个连续写入操作之间的超时时间(ms)
    upstream_read_timeout optional,default:60000ms 在发送请求到上游服务的两个连续读取操作之间的超时时间(ms)
    https_only optional,default:false 如果希望仅通过HTTPS转发API(默认8443端口),则启用
    http_if_terminated optional,default:false 仅在https限流时才考虑设置X-Forwarded-Proto头部

     Response

    HTTP/1.1 201 Created
    Date: Sat, 26 May 2018 07:54:34 GMT
    Content-Type: application/json; charset=utf-8
    Transfer-Encoding: chunked
    Connection: keep-alive
    Access-Control-Allow-Origin: *
    Server: kong/0.13.1
    
    {
        "created_at": 1527350074050,
        "strip_uri": true,
        "id": "c347a69e-d81e-402b-87b0-c8cf25a771e5",
        "hosts": ["www.sojson.com"],
        "name": "weather-api",
        "uris": ["/weather"],
        "http_if_terminated": false,
        "preserve_host": false,
        "upstream_url": "https://www.sojson.com/open/api/weather/json.shtml",
        "upstream_connect_timeout": 60000,
        "upstream_send_timeout": 60000,
        "upstream_read_timeout": 60000,
        "retries": 5,
        "https_only": false
    }

      上面接口到意思是:这个API注册的名字叫weather-api。它被挂载在网关的/weather路径下,上游转发到http://localhost:8000去处理,转发的时候把前面的/weather前缀给去掉。

    注意uris必须加slash /,默认是/   strip_uri到作用也很明显,就是在代理下面划分虚拟路径便于管理

      新增好API后则可以通过kong代理来访问代理的服务

    # 原接口
    curl https://www.sojson.com/open/api/weather/json.shtml?city=上海
    
    #通过kong代理访问
    curl -i -X GET 
       --header 'host:www.sojson.com' 
       --url  http://localhost:8000/weather?city=上海

    根据name或id获取一个API

    Example

      curl -i -X GET 
      --url  http://localhost:8001/apis/weather-api 
    或
      curl -i -X GET 
      --url  http://localhost:8001/apis/c347a69e-d81e-402b-87b0-c8cf25a771e5

    Endpoint

    GET /apis/{name or id}

    Request Params

    属性 约束 描述
    name or id required 接入API到唯一标识符,name或者id

    Response

    HTTP/1.1 200 OK
    Date: Sat, 26 May 2018 08:18:43 GMT
    Content-Type: application/json; charset=utf-8
    Transfer-Encoding: chunked
    Connection: keep-alive
    Access-Control-Allow-Origin: *
    Server: kong/0.13.1
    
    {
        "created_at": 1527350074050,
        "strip_uri": true,
        "id": "c347a69e-d81e-402b-87b0-c8cf25a771e5",
        "hosts": ["www.sojson.com"],
        "name": "weather-api",
        "uris": ["/weather"],
        "http_if_terminated": false,
        "preserve_host": false,
        "upstream_url": "https://www.sojson.com/open/api/weather/json.shtml",
        "upstream_connect_timeout": 60000,
        "upstream_send_timeout": 60000,
        "upstream_read_timeout": 60000,
        "retries": 5,
        "https_only": false
    }

    查询所有接入到API列表

    Example

    curl -i -X GET   --url  http://localhost:8001/apis/

    Endpoint

    GET /apis/

    Request Querystring

    属性 约束 描述
    id optional 同post描述
    name optional
    upstream_url optional
    retries optional
    size optional limit,查询的记录条数
    offset optional cursor位置,用于分页

    Response

    HTTP/1.1 200 OK
    Date: Sat, 26 May 2018 08:25:33 GMT
    Content-Type: application/json; charset=utf-8
    Transfer-Encoding: chunked
    Connection: keep-alive
    Access-Control-Allow-Origin: *
    Server: kong/0.13.1
    
    {
        "total": 1,
        "data": [{
            "created_at": 1527350717171,
            "strip_uri": true,
            "id": "b93fcbe7-5dba-4888-bf8c-f4c8f798b53a",
            "hosts": ["www.sojson.com"],
            "name": "weather-api",
            "http_if_terminated": false,
            "https_only": false,
            "retries": 5,
            "uris": ["/weather"],
            "preserve_host": false,
            "upstream_connect_timeout": 60000,
            "upstream_read_timeout": 60000,
            "upstream_send_timeout": 60000,
            "upstream_url": "https://www.sojson.com/open/api/weather/json.shtml"
        }]
    }

    根据name或id更新一个API

    Example

     curl -i -X PATCH 
      --url  http://localhost:8001/apis/weather-api 
      --data 'name=weather-api-1' 
      --data 'retries=6'
    或
      curl -i -X PATCH 
      --url  'http://localhost:8001/apis/b93fcbe7-5dba-4888-bf8c-f4c8f798b53a' 
      --data 'name=weather-api-1' 
      --data 'retries=6'

    Endpoint

    PATCH /apis/{name or id}

    Request Param

    同GET /apis/{name or id}

    Request Body

    同POST /apis/

    Response

    同GET /apis/{name or id},返回的是更新后的数据

    更新或新增一个API

    Example

    #更新一个存在的API
    curl -i -X PUT 
      --url  http://localhost:8001/apis/ 
      --data 'id=b93fcbe7-5dba-4888-bf8c-f4c8f798b53a' 
      --data 'hosts=www.sojson.com' 
      --data 'uris=/weather' 
      --data 'upstream_url=https://www.sojson.com/open/api/weather/json.shtml'
    
    #更新一个不存在的API
    curl -i -X PUT 
      --url  http://localhost:8001/apis/ 
      --data 'name=test' 
      --data 'hosts=www.sojson.com' 
      --data 'uris=/weather' 
      --data 'upstream_url=https://www.sojson.com/open/api/weather/json.shtml'
    
    #新增
      curl -i -X PUT 
      --url  http://localhost:8001/apis/ 
      --data 'hosts=www.sojson.com' 
      --data 'upstream_url=https://www.sojson.com/open/api/weather/json.shtml'

    PUT接口的含义是:

    如果request body中包含已有的API的主键(name or id),则会根据name or id 执行更新操作,同PATCH /apis/{name or id};

    如果指定了name or id但是没有查询到该记录,则返回404 NOT FOUND;

    如果没有指定主键,则会新增一个API,同POST /apis/。

    Endpoint

    PUT /apis/

    Request Body

    同 POST /apis/

    Response

    HTTP 201 Created or HTTP 200 OK
    返回数据同POST or PATCH reponses

    根据name或id删除一个API

    Example

      curl -i -X DELETE 
      --url  http://localhost:8001/apis/weather-api 
    或
      curl -i -X DELETE 
      --url  http://localhost:8001/apis/b93fcbe7-5dba-4888-bf8c-f4c8f798b53a

    Endpoint

    DELETE /apis/{name or id}

    Request Param

    同 GET /apis/{name or id}

    Response

    HTTP/1.1 204 No Content
    Date: Sat, 26 May 2018 08:52:15 GMT
    Connection: keep-alive
    Access-Control-Allow-Origin: *
    Server: kong/0.13.1

     Service Object

    服务是上游服务中的每一个抽象,服务的主要属性是url,它可以被设置为单个字符串或单独指定它的 protocol、host、port and path。服务与路由相关(一个服务可以关联多个路由),路由是Kong中的入口点,并定义与客户端请求匹配的规则。一旦路由匹配,Kong将请求委托给其关联的服务。

    新增一个Service

    Example

      curl -i -X POST 
      --url  http://localhost:8001/services/ 
      --data 'name=service-stock' 
      --data 'url=http://hq.sinajs.cn'
    或
      curl -i -X POST 
      --url  http://localhost:8001/services/ 
      --data 'name=service-stock' 
      --data 'protocal=http'  
      --data 'host=hq.sinajs.cn' 
      --data 'port=80'

    Endpoint

    POST /services/

    Request Body

    属性 约束 描述
    name optional 服务名称
    protocol required,default:http 用于与上游接口通信的协议。是http或https
    host  required 上游服务的host
    port required,default:80 上游服务的端口
    path optional,default:null 请求上游服务器使用的路径,默认为空
    retries optional,default:5 代理失败时重试的次数
    connect_timeout optional,default:60000ms 建立与上游服务器连接的超时时间(ms)
    write_timeout optional,default:60000ms 在向上游服务器发送请求的两个连续写入操作之间的超时时间(ms)
    read_timeout optional,default:60000ms 在向上游服务器发送请求的两个连续读取操作之间的超时时间(ms)
    url shorthand-attribute 一次性设置protocol、host、port和path的缩写。此属性是只读的(管理API不会返回“URL”)

    注:可用url来代替同时指定protocal/host/port/path,但url不会出现在返回字段中。

    Response

    HTTP/1.1 201 Created
    Date: Sat, 26 May 2018 16:44:39 GMT
    Content-Type: application/json; charset=utf-8
    Transfer-Encoding: chunked
    Connection: keep-alive
    Access-Control-Allow-Origin: *
    Server: kong/0.13.1
    
    {
        "host": "hq.sinajs.cn",
        "created_at": 1527324279,
        "connect_timeout": 60000,
        "id": "9ec3c166-f29a-4b04-a33e-c17ac42a3429",
        "protocol": "http",
        "name": "service-stock",
        "read_timeout": 60000,
        "port": 80,
        "path": null,
        "updated_at": 1527324279,
        "retries": 5,
        "write_timeout": 60000
    }

    根据name或id查询一个Service

    Example

    curl -i -X GET 
      --url  http://localhost:8001/services/service-stock 

    Endpoint

    GET /services/{name or id}

    Request Param

    属性 约束 描述
    name or id  required 服务的唯一标识符

    Response

    HTTP/1.1 200 OK
    Date: Sat, 26 May 2018 16:50:41 GMT
    Content-Type: application/json; charset=utf-8
    Transfer-Encoding: chunked
    Connection: keep-alive
    Access-Control-Allow-Origin: *
    Server: kong/0.13.1
    
    {
        "host": "hq.sinajs.cn",
        "created_at": 1527324279,
        "connect_timeout": 60000,
        "id": "9ec3c166-f29a-4b04-a33e-c17ac42a3429",
        "protocol": "http",
        "name": "service-stock",
        "read_timeout": 60000,
        "port": 80,
        "path": null,
        "updated_at": 1527324279,
        "retries": 5,
        "write_timeout": 60000
    }

    根据route_id获取一个服务

    Example

     curl -i -X GET 
      --url  http://localhost:8001/routes/{ROUTE_ID}/service 

    Endpoint

    GET /routes/{route id}/service

    Request Param

    属性 约束 描述
    route id required 属于要检索的服务的路由的唯一标识符

    Response

    同 GET/services/{name or id}返回结果

    查询所有服务列表

    Example

    curl -i -X GET 
      --url  http://localhost:8001/services/ 

    Endpoint

    GET /services/

    Request QueryString

    属性 约束 描述
    offset optional 分页的游标。offset是定义列表中某个位置的对象标识符
    size optional,default :100, max:1000 每页返回的记录数量

    Response

    HTTP/1.1 200 OK
    Date: Sat, 26 May 2018 17:05:39 GMT
    Content-Type: application/json; charset=utf-8
    Transfer-Encoding: chunked
    Connection: keep-alive
    Access-Control-Allow-Origin: *
    Server: kong/0.13.1
    
    {
        "next": "http://localhost:8001/services?offset=6378122c-a0a1-438d-a5c6-efabae9fb969",
        "data": [{
            "host": "hq.sinajs.cn",
            "created_at": 1527324279,
            "connect_timeout": 60000,
            "id": "9ec3c166-f29a-4b04-a33e-c17ac42a3429",
            "protocol": "http",
            "name": "service-stock",
            "read_timeout": 60000,
            "port": 80,
            "path": null,
            "updated_at": 1527324279,
            "retries": 5,
            "write_timeout": 60000
        }]
    }

    根据name或id更新服务

    Example

     curl -i -X PATCH 
      --url  http://localhost:8001/services/service-stock 
      --data 'name=service-stock-1' 
      --data 'retries=6'
    或
      curl -i -X PATCH 
      --url  'http://localhost:8001/apis/9ec3c166-f29a-4b04-a33e-c17ac42a3429' 
      --data 'name=service-stock-1' 
      --data 'retries=6'

    Endpoint

    PATCH /services/{name or id}

    Request Param

    name or id

    Requst Body

    同POST /services/  Request Body

    Response

    同 PATCH /apis/{name or id} 返回结构

    根据route_id更新服务

    Endpoint

    PATCH /routes/{route id}/service

    其它同PATCH /services/{name or id}

    根据name或id删除服务

    Endpoint

    DELETE /services/{name or id}

    Route Object

      路由定义匹配客户端请求的规则,每个路由与服务相关联,并且一个服务可关联多个路由。匹配给定路由的每个请求将被代理到与其关联的服务。路由和服务的组合和分离提供了一种强大的路由机制,通过它可以在Kong定义细粒度的入口点,从而访问基础设施的不同上游服务。 

    新增一个路由

    Example

      curl -i -X POST 
      --url  http://localhost:8001/routes/ 
      --data 'protocols[]=http&protocols[]=https' 
      --data 'hosts[]=hq.sinajs.cn' 
      --data 'service.id=9ec3c166-f29a-4b04-a33e-c17ac42a3429'

    Endpoint

    POST /routes/

    Request Body

    属性 约束 描述
    protocols required,default:["http", "https"] 此路由应允许的协议列表。 当设置为[ HTTPS ]时,HTTP请求将被请求升级到HTTPS。使用form-encoded,符号是protocols[]=http&protocols[]=https。 使用数组
    methods semi-optional 与此路由匹配的HTTP方法列表。例如["GET", "POST"]。必须设置hosts、paths或methods中的至少一个。使用form-encode,符号是methods[]=GET和methods[]=OPTIONS。使用数组。
    hosts semi-optional 与此路由匹配的域名列表。例如:example.com。使用form-encode,符号是hosts[]= Foo.com和hosts[]= BAR.com。使用数组
    paths semi-optional 与此路由匹配的路径列表。例如:/my-path。使用form-encode,符号是paths[]=/foo&paths[]=/bar。使用数组。
    strip_path optional,default:true 当通过路径之一匹配路由时,从上游请求URL中去除匹配的前缀。
    preserve_host optional,default:false 当通过主机域名中的一个匹配路由时,在上游请求报头中使用请求主机头。默认情况下设置为false,上游主机头将设置为服务的主机。
    service required 此路由关联的服务。这是路由代理流量的地方。使用form-encode,符号是service.id=<service_id>。使用JSON则是"service":{"id":"<service_id>"}

     Response

    HTTP/1.1 201 Created
    Date: Sun, 27 May 2018 07:29:32 GMT
    Content-Type: application/json; charset=utf-8
    Transfer-Encoding: chunked
    Connection: keep-alive
    Access-Control-Allow-Origin: *
    Server: kong/0.13.1
    
    {
        "created_at": 1527377372,
        "strip_path": true,
        "hosts": ["hq.sinajs.cn"],
        "preserve_host": false,
        "regex_priority": 0,
        "updated_at": 1527377372,
        "paths": null,
        "service": {
            "id": "9ec3c166-f29a-4b04-a33e-c17ac42a3429"
        },
        "methods": null,
        "protocols": ["http", "https"],
        "id": "9e9ff7b8-776f-4e65-ad2b-ed977e3fe4ea"
    }

    这里添加了一个路由,也关联了服务,则可以通过kong 代理来访问原服务-获取股票信息

    #原接口
    curl http://hq.sinajs.cn/list=sh601006
    
    #通过kong代理访问
    curl 127.0.0.1:8000/list=sh601006 --header 'host:hq.sinajs.cn'

    返回的结果都是

    var hq_str_sh601006="大秦铁路,8.440,8.440,8.380,8.460,8.350,8.390,8.400,29185760,245088749.000,1900,8.390,126300,8.380,72700,8.370,119700,8.360,332000,8.350,116278,8.400,104796,8.410,126800,8.420,128500,8.430,148100,8.440,2018-05-25,15:00:00,00";

    根据route_id查询路由

    Example

    curl -i -X GET 
      --url  http://localhost:8001/routes/9e9ff7b8-776f-4e65-ad2b-ed977e3fe4ea

    Endpoint

    GET /routes/{id}

    Request Param

    属性 约束 描述
    id required 路由的唯一标识符

    Response

    返回同 GET /service/{id}返回结构

    查询所有路由列表

    Example

    curl -i -X GET   --url  http://localhost:8001/routes/

    EndPoint

    GET /routes

    Request QueryString

    属性 约束 描述
    offset optional 用于分页的游标。偏移量是定义列表中某个位置的对象标识符。
    size optional,default: 100, max:1000 每页返回数量的限制

    Response

    HTTP/1.1 200 OK
    Date: Sun, 27 May 2018 07:57:50 GMT
    Content-Type: application/json; charset=utf-8
    Transfer-Encoding: chunked
    Connection: keep-alive
    Access-Control-Allow-Origin: *
    Server: kong/0.13.1
    
    {
        "next": null,
        "data": [{
            "created_at": 1527378066,
            "strip_path": true,
            "hosts": ["hq.sinajs.cn"],
            "preserve_host": false,
            "regex_priority": 0,
            "updated_at": 1527378066,
            "paths": null,
            "service": {
                "id": "9ec3c166-f29a-4b04-a33e-c17ac42a3429"
            },
            "methods": null,
            "protocols": ["http", "https"],
            "id": "9e9ff7b8-776f-4e65-ad2b-ed977e3fe4ea"
        }]
    }

    查询一个服务关联的所有路由

    Example

    curl -i -X GET 
      --url  http://localhost:8001/services/9ec3c166-f29a-4b04-a33e-c17ac42a3429/routes

    Endpoint

    GET /services/{service name or id}/routes

    Request QueryString Param

    属性 约束 描述
    service name or id required 路由关联的服务的唯一ID或name

    Response

    结构同 GET /routes

    根据route_id更新指定路由

    EndPoint

    PATCH /routes/{id}

    Request Param

    同 GET /routes/{id}

    Request Body

    同 POST /routes

    根据route_id删除路由

    Endpoint

    DELETE /routes/{id}

    其它同前面

    Consumer Object

      消费对象表示服务的消费者或用户。可以依赖Kong作为主要数据存储,也可以将用户自己管理的列表映射到该数据库consumer表,以保持Kong与现有主数据存储的一致性。权限控制也会依赖这个表。

    创建一个消费者

    Example

      curl -i -X POST 
      --url  http://localhost:8001/consumers/ 
      --data 'username=zhou' 
      --data 'custom_id=000150' 

    Endpoint

    POST /consumers/

    Requst Body

    属性 约束 描述
    username semi-optional 消费者的唯一用户名,和custom_id至少有一个必须指定
    custom_id semi-optional 用户存储的唯一id, 用来和现有数据库中的用户一一映射,若需要权限管理,必须将此字段或用户名与请求一起发送。

     Response

    HTTP/1.1 201 Created
    Date: Sun, 27 May 2018 08:31:20 GMT
    Content-Type: application/json; charset=utf-8
    Transfer-Encoding: chunked
    Connection: keep-alive
    Access-Control-Allow-Origin: *
    Server: kong/0.13.1
    
    {
        "custom_id": "000150",
        "created_at": 1527409880000,
        "username": "zhou",
        "id": "a1866101-c718-421d-ace3-911042661eca"
    }

    查询消费者列表

    Example

     curl -i -X GET 
      --url  http://localhost:8001/consumers/zhou
      或
      curl -i -X GET 
      --url  http://localhost:8001/consumers/a1866101-c718-421d-ace3-911042661eca

    Endpoint

    GET /consumers/{username or id}

    查询所有消费者

    Endpoint

    GET  /consumers/

    Request QueryString

    属性 约束 描述
    id optional  
    custom_id optional  
    username optional  
    size optional,default:100 每页返回数量
    offset optional 用于分页的游标。偏移量是定义列表中某个位置的对象标识符

    Response

    HTTP/1.1 200 OK
    Date: Sun, 27 May 2018 08:39:40 GMT
    Content-Type: application/json; charset=utf-8
    Transfer-Encoding: chunked
    Connection: keep-alive
    Access-Control-Allow-Origin: *
    Server: kong/0.13.1
    
    {
        "total": 1,
        "data": [{
            "custom_id": "000150",
            "created_at": 1527409880000,
            "username": "zhou",
            "id": "a1866101-c718-421d-ace3-911042661eca"
        }]
    }

    更新指定消费者

    Endpoint

    PATCH /consumers/{username or id}

    Request Param

    属性 约束 描述
    username or id  required  

    Request Body

    属性 约束 描述
    username semi-optional 同POST body说明
    custome_id semi-optional

    更新或创建消费者

    Endpoint

    PUT /consumers/

    Request Body

    同上 Request Body

    其它说明 同 PUT /services/

    Response

    HTTP 201 Created or HTTP 200 OK

    删除指定消费者

    Endpoint

    DELETE /consumers/{username or id}

    Plugin Object

      插件表示将在HTTP请求/响应生命周期期间执行的插件配置。可以将功能添加到kong后面运行的服务,例如身份验证或速率限制。可以通过访问插件库找到更多关于安装的信息和每个插件所需的值。当向服务添加插件配置时,客户端对该服务所做的每一个请求都将运行添加的插件。如果插件需要针对特定的消费者调整到不同的值,可以通过指定consumer_id值来实现,如:

    {
        "id": "4d924084-1adb-40a5-c042-63b19db421d1",
        "service_id": "5fd1z584-1adb-40a5-c042-63b19db49x21",
        "consumer_id": "a3dX2dh2-1adb-40a5-c042-63b19dbx83hF4",
        "name": "rate-limiting",
        "config": {
            "minute": 20,
            "hour": 500
        },
        "enabled": true,
        "created_at": 1422386534
    }

      一个插件对于一个请求只运行一次,但是它将运行的配置取决于它所配置的插件实体。可以为各种实体,实体组合,甚至全局配置插件。例如,当希望以某种方式为大多数请求配置插件,但与已认证的请求行为略有不同时,这很有用。因此,当插件应用于具有不同配置的不同实体时,存在运行插件的优先顺序。经验法则是:一个插件对于配置的实体更具体更详细,其优先级越高。

    当多次配置插件时,优先级的完整顺序是:
    1、在以下组合上配置插件:a Route, a Service, and a Consumer。 (消费者意味着请求必须被认证)。
    2、在Route和Consumer组合上配置的插件。 (消费者意味着请求必须被认证)。
    3、插件配置在Service和Consumer的组合上。 (消费者意味着请求必须被认证)。
    4、插件配置在Route和Service的组合上。
    5、在Consumer上配置的插件。 (消费者意味着请求必须被认证)。
    6、在Route上配置的插件。
    7、在Service上配置的插件。
    8、插件配置为全局运行。

    示例:如果rate-limiting插件应用两次(具有不同的配置):对于Service(插件配置A)和Consumer(插件配置B),则认证此消费者的请求将运行插件配置B并忽略A.但是,不验证此Consumer的请求将回退运行Plugin config A.请注意,如果禁用了配置B(其启用标志设置为false),则配置A将应用于会以其他方式匹配配置B的请求。

    新增一个插件

    可以通过五种不同的方式添加插件:

    • 对于每个Service/Route and Consumer,不要设置consumer_id并同时设置service_id或route_id。
    • 对于每个Service/Route和特定的Consumer,只设置consumer_id。
    • 针对每个Consumer和特定Service,只设置service_id(警告:一些插件只允许设置他们的route_id)
    • 针对每个 Consumer和特定Route,只设置route_id(警告:一些插件只允许设置他们的service_id)
    • 针对特定的Service/Route/Consumer,同时设置service_id / route_id和consumer_id。

    请注意,并非所有插件都允许指定consumer_id

    Example

      curl -i -X POST 
      --url  http://localhost:8001/plugins/ 
      --data 'name=rate-limiting' 
      --data 'config.minute=20&config.hour=500' 
      --data 'consumer_id=a1866101-c718-421d-ace3-911042661eca'

    Endpoint

    POST /plugins/

    Request Body

    属性 约束 描述
    name required 将要添加的插件的名称。目前该插件必须分别安装在每个Kong实例中
    consumer_id optional 消费者的唯一标识符,用于在传入请求上覆盖此特定消费者的现有设置
    config.{property} required 插件的配置属性
    enabled requred,default:true 插件是否被启用

    Response

    HTTP/1.1 201 Created
    Date: Sun, 27 May 2018 09:20:37 GMT
    Content-Type: application/json; charset=utf-8
    Transfer-Encoding: chunked
    Connection: keep-alive
    Access-Control-Allow-Origin: *
    Server: kong/0.13.1
    
    {
        "created_at": 1527412838000,
        "config": {
            "minute": 20,
            "policy": "cluster",
            "redis_timeout": 2000,
            "hide_client_headers": false,
            "hour": 500,
            "limit_by": "consumer",
            "redis_port": 6379,
            "redis_database": 0,
            "fault_tolerant": true
        },
        "id": "d688bd43-e43b-4e24-a0dc-c2d482bc1a01",
        "name": "rate-limiting",
        "enabled": true,
        "consumer_id": "a1866101-c718-421d-ace3-911042661eca"
    }

    查询指定插件

    Endpoint

    GET /plugins/{id}

    Request Param

    属性 约束 描述
    id required 插件的唯一标识符

    查询所有插件列表

    Endpoint

    GET /plugins/

    Request Querystring

    属性 约束 描述
    id optional 同POST Body
    name
    service_id
    route_id
    consumer_id
    size
    offset

       

    更新指定插件

    Endpoint

    PATCH /plugins/{plugin id}

    Request Param

    同 GET /plugins/{id}

    Request Body

    同POST /plugins/ Request Body

    更新或创建插件

    Endpoint

    PUT /plugins/

    Request Body

    同 POST /plugins/ Request Body

    其它说明同 PUT /services

    删除指定插件

    Endpoint

    DELETE  /plugins/{plugin_id}

    其它同DELETE /services/{service_id}

    查询kong节点已安装的插件

    Example

    curl -i -X GET   --url  http://localhost:8001/plugins/enabled

    Endpoint

    GET /plugins/enabled

    Response

    {
        "enabled_plugins": [
            "jwt",
            "acl",
            "cors",
            "oauth2",
            "tcp-log",
            "udp-log",
            "file-log",
            "http-log",
            "key-auth",
            "hmac-auth",
            "basic-auth",
            "ip-restriction",
            "request-transformer",
            "response-transformer",
            "request-size-limiting",
            "rate-limiting",
            "response-ratelimiting",
            "aws-lambda",
            "bot-detection",
            "correlation-id",
            "datadog",
            "galileo",
            "ldap-auth",
            "loggly",
            "runscope",
            "statsd",
            "syslog"
        ]
    }
    View Code

    查询插件schema

    检索插件定义的schema,这对了解插件接受哪些字段非常有用,并且可以用于构建Kong插件系统的第三方集成

    Example

     curl -i -X GET 
       --url  http://localhost:8001/plugins/schema/key-auth

    Endpoint

    GET /plugins/schema/{plugin name}

    Response

    {
        "no_consumer": true,
        "fields": {
            "key_in_body": {
                "default": false,
                "type": "boolean"
            },
            "key_names": {
                "type": "array",
                "default": "function",
                "func": "function",
                "required": true
            },
            "anonymous": {
                "default": "",
                "func": "function",
                "type": "string"
            },
            "hide_credentials": {
                "default": false,
                "type": "boolean"
            },
            "run_on_preflight": {
                "default": true,
                "type": "boolean"
            }
        }
    }

    Certificate Object

      证书表示SSL证书的公用证书/私钥对,这些对象由Kong用来处理加密请求的SSL / TLS。证书可以(可选的)与SNI对象相关联以将证书/密钥对与一个或多个主机名相关联查询插件配置的schema。这对了解插件接受哪些字段非常有用,并且可以用于构建Kong插件系统的第三方集成。

    新增证书

    Endpoint

    POST /certificates/

    Request Body

    属性       约束             描述
    cert required

    PEM编码的SSL密钥对的公共证书

    key required SSL密钥对的PEM编码私钥
    snis optional 与此证书关联的一个或多个主机名作为SNI。这是一个糖参数,它将在引擎盖下创建一个SNI对象,并将其与此证书关联方便管理

    Response

    {
        "id": "21b69eab-09d9-40f9-a55e-c4ee47fada68",
        "cert": "-----BEGIN CERTIFICATE-----...",
        "key": "-----BEGIN RSA PRIVATE KEY-----...",
        "snis": [
            "example.com"
        ],
        "created_at": 1485521710265
    }

    查询指定证书

    Endpoint

    GET /certificates/{sni_name or id}

    Request Param

    属性          约束            描述
    sni or id required 与此证书关联的唯一标识符或SNI名称

    查询所有证书列表

    Endpoint

    GET /certificates/

    更新指定证书

    Endpoint

    PATCH  /certificates/{sni or id}

    Request Param

    同GET /certificates/{sni or id}

    Request Body

    同POST /certificates/

    更新或创建证书

    Endpoint

    PUT /certificates/

    Request Body

    同 POST /certificates/

    其它说明同 PUT /servies/

    删除指定证书

    Endpoint

    DELETE  /certificates/{sni or id}

    同其它DELETE 操作说明

    SNI Objects

      SNI对象(Server Name Indication)表示主机名与证书的多对一映射。也就是说,证书对象可以有许多与之关联的主机名;当Kong收到SSL请求时,它使用Client Hello中的SNI字段根据与证书关联的SNI查找证书对象。

    新增SNI

    Endpoit

    POST /snis/

    Request Body

    属性                       约束          描述
    name required 与给定证书关联的SNI名称
    ssl_certificate_id required 与SNI主机名关联的证书的id(UUID)

    Response

    {
        "name": "example.com",
        "ssl_certificate_id": "21b69eab-09d9-40f9-a55e-c4ee47fada68",
        "created_at": 1485521710265
    }

    查询指定SNI

    Endpoint

    GET  /snis/{name}

    Request Param

    属性 约束 描述
    name required sni 名称

    查询所有SNIs

    Endpoint

    GET  /snis/

    更新指定SNI

    Endpoint

    PATCH /snis/{name}

    更新或创建SNI

    Endpoint

    PUT /snis/

    Request Body

    同 POST /snis/

    删除指定SNI

    Endpoint

    DELETE /snis/{name}

    Upstream Objects

      上游对象表示一个虚拟主机名,可用于负载平衡多个services(targets)上的传入请求。例如,对于主机名为service.v1.xyz的Service对象,上游名为service.v1.xyz。此服务的请求将代理上游定义的目标。

      上游还包括一个健康检查器,该检查器能够根据其能力或无法为请求提供服务来启用和禁用target。运行状况检查程序的配置存储在upstream中,并适用于其所有target

     新增一个上游

     Endpoint

    POST /upstreams/

    Request Body

    Target Object

      target是具有识别后端服务实例的端口的IP地址/主机名。每个upstream可以有很多target,并且可以动态添加target。即时更改即时生效。由于upstream保留了target更改的历史记录,因此target无法删除或修改。要禁用目标,使用weight=0发布新target,或者使用DELETE便捷方法来完成相同的操作。 当前的目标对象定义是最新的created_at

    新增一个目标

    Endpoint

    POST /upstreams/{name or id}/targets

    Request Param

    属性 约束 描述
    name or id required 要添加目标的upstream的唯一标识符或名称

    Request Body

    属性         约束                        描述
    target required 目标地址(ip或主机名)和端口。如果省略,则端口默认为8000.如果主机名解析为SRV记录,端口值将被dns记录的值覆盖。
    weight optional,default:100 此目标在上游负载均衡器中的权重(0-1000,默认为100)。如果主机名解析为SRV记录,则权重值将被来自dns记录的值覆盖

    Response

    {
        "id": "4661f55e-95c2-4011-8fd6-c5c56df1c9db",
        "target": "1.2.3.4:80",
        "weight": 15,
        "upstream_id": "ee3310c1-6789-40ac-9386-f79c0cb58432",
        "created_at": 1485523507446
    }

    列出当前在上游负载平衡轮上处于活动状态的所有目标

    注意:此接口在0.12.0版本中已从更改属于上游的所有目标更改为仅当前激活的目标。返回整个目标历史记录的端点已移至[列出所有目标](#list-all-targets)

    Endpoint

    GET /upstreams/{name or id}/targets

    Request Param

    同 上 

    Request QueryString

    属性 约束 描述
    id optional  
    target  
    weight  
    size 每页显示数量
    offset 用于分页的游标。偏移量是定义列表中某个位置的对象标识符

    列出上游的所有目标

      列出上游的所有目标,可以返回同一目标的多个目标对象,显示特定目标的更改历史记录。具有最新created_at的目标对象是当前定义

      注意:此接口只适用于Kong v0.12.0+

    Endpoint

    GET /upstreams/{name or id}/targets/all/

    删除指定目标

      在负载平衡器中禁用目标。在引擎盖下,这个方法为给定的目标定义创建一个新的条目,权重为0

      注意:该接口仅适用于Kong v0.10.1+

    Endpoint

    DELETE /upstreams/{upstream name or id}/targets/{target or id}

    Request Param

    属性 约束 描述
    upstream name or id required 上游唯一标识符
    target or id required 目标唯一标识符

    设置目标为健康

      将负载平衡器中目标的当前健康状况设置为整个Kong群集中的“健康”状态。
    此接口可用于手动重新启用之前由上游运行状况检查程序禁用的目标,上游只向健康节点转发请求,所以这个调用告诉Kong再次开始使用这个目标。这会重置在Kong节点的所有workers中运行的健康检查器的健康计数器,并且广播全集群消息,以便将“健康”状态传播到整个Kong群集。

    Endpoint

    POST /upstreams/{upstream name or id}/targets/{target or id}/healthy

    Request Param

    同上

    Response

    HTTP 204 No Content

    设置目标为不健康

      将整个Kong群集中负载均衡器中目标的当前运行状况设置为“不健康”。
    此接口可用于手动禁用目标并使其停止响应请求。上行仅向健康节点转发请求,因此该呼叫告诉Kong开始在环平衡器算法中跳过此目标。该调用重置在Kong节点的所有工作人员中运行的运行状况检查器的运行状况计数器,并广播全集群消息,以便将“不健康”状态传播到整个Kong群集。

    Active health checks继续执行不健康的目标。请注意,如果启用了运行状况检查并且探针检测到目标实际上是健康的,它将自动重新启用它。要从环平衡器中永久移除目标,您应该删除目标。

    Endpoint

    POST /upstreams/{upstream name or id}/targets/{target or id}/unhealthy

    其它同上

    reference:

    https://m.aliyun.com/yunqi/articles/63180

    https://getkong.org/docs/0.13.x/admin-api/

    https://www.jianshu.com/p/5400bf1aceda

  • 相关阅读:
    数据结构_线性结构
    多线程01_基础
    操作系统05_文件管理
    解析静态内部类的使用目的与限制(转)
    mysql去除重复记录案例
    mysql 索引使用策略及优化
    mysql 索引数据结构及原理
    mysql 索引的简单使用
    当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法
    14 线程间协作的两种方式:wait、notify、notifyAll和Condition
  • 原文地址:https://www.cnblogs.com/zhoujie/p/kong2.html
Copyright © 2011-2022 走看看