Gitlib Gitlib
首页
  • 分类
  • 标签
  • 归档
  • Golang开发实践万字总结
  • MySQL核心知识汇总
  • Redis实践总结
  • MQ实践万字总结
  • Docker数据持久化总结
  • Docker网络模式深度解读
  • 常用游戏反外挂技术总结
  • 读书笔记
  • 心情杂货
  • 行业杂谈
  • 友情链接
关于我
GitHub (opens new window)

Ravior

以梦为马,莫负韶华
首页
  • 分类
  • 标签
  • 归档
  • Golang开发实践万字总结
  • MySQL核心知识汇总
  • Redis实践总结
  • MQ实践万字总结
  • Docker数据持久化总结
  • Docker网络模式深度解读
  • 常用游戏反外挂技术总结
  • 读书笔记
  • 心情杂货
  • 行业杂谈
  • 友情链接
关于我
GitHub (opens new window)
  • 基础架构

  • MQ

  • 微服务

    • Zookeeper

    • 网关

      • Kong API网关使用入门
        • 介绍
        • 安装部署
          • 创建Docker网络
          • 安装启动postgresSQL
          • 导入数据
          • 安装启动Kong
          • 安装Kong Admin-UI
        • Kong配置
          • 添加服务
          • 为服务添加路由
          • 通过Kong转发请求
          • 添加插件
          • 添加Consumer
          • 创建Consumer
          • 为Consumer添加证书
          • 验证Consumer凭证
        • 参考文档
      • Openresty实现API网关
    • 微服务设计思想和目标
    • 服务降级、熔断和限流
  • 分布式

  • 高并发

  • 大数据

  • 容器化

  • 架构设计
  • 微服务
  • 网关
Ravior
2018-02-11
目录

Kong API网关使用入门

# 介绍

Kong (opens new window)是一个可扩展的开源API网关, 基于OpenResty(lua-nginx-module)开发, 底层使用Apache Cassandra或PostgreSQL数据库,运行在任何RESTful API的前面,并通过插件扩展,开发者可以方便的添加已定义的插件,甚至可以自己开发插件并使用,来达到代理、负载均衡、健康检查、日志、登录等功能。

kong

Kong主要有三个组件:

  • Kong Server :基于nginx的服务器,用来接收API请求。
  • Cassandra/PostgreSQL :用来存储数据。
  • Kong dashboard:官方推荐UI管理工具,当然,也可以使用 restfull 方式 管理admin api

# 安装部署

Kong官方提供了各平台/系统的安装文档 (opens new window),推荐用Docker来进行安装部署。

# 创建Docker网络

Kong Server依赖Cassandra/PostgreSQL数据库,便于容器之间通信,先创建一个docker网络。

docker network create kong-net
1

# 安装启动postgresSQL

docker run -d --name kong-database \
               --network=kong-net \
               -p 5432:5432 \
               -e "POSTGRES_USER=kong" \
               -e "POSTGRES_DB=kong" \
               postgres:9.6
1
2
3
4
5
6

# 导入数据

docker run --rm \
     --network=kong-net \
     -e "KONG_DATABASE=postgres" \
     -e "KONG_PG_HOST=kong-database" \
     -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
     kong:latest kong migrations bootstrap
1
2
3
4
5
6

# 安装启动Kong

docker run -d --name kong \
     --network=kong-net \
     -e "KONG_DATABASE=postgres" \
     -e "KONG_PG_HOST=kong-database" \
     -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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Kong默认监听下面端口:

  • 8000:监听来自客户端的HTTP流量,转发到你的upstream服务上
  • 8443:监听HTTPS的流量,功能跟8000一样。可以通过配置文件禁止
  • 8001:Kong的HTTP监听的api管理接口
  • 8444:Kong的HTTPS监听的API管理接口

# 安装Kong Admin-UI

Kong暴露了一个RESTful管理Api在8001端口上,Kong的配置,包括添加Service和Route,都是通过这个Api发送请求。市面上有很多基于RESTful管理API后台项目,官方的Kong dashboard在我本地安装之后,无法正常使用,推荐一个纯前端的管理后台:Kong-admin-ui (opens new window)

docker run -d --name kong-admin-ui -p 8899:80 pocketdigi/kong-admin-ui:0.4.0
1

kong

安装完成之后,运行docker ps看一下当前运行的容器:

CONTAINER ID        IMAGE                            COMMAND                  CREATED             STATUS              PORTS                                                                NAMES
47968f8067bd        pocketdigi/kong-admin-ui:0.3.2   "nginx -g 'daemon of…"   43 seconds ago      Up 43 seconds       0.0.0.0:8899->80/tcp                                                 kong-admin-ui
c8096b5374f5        kong:latest                      "/docker-entrypoint.…"   10 minutes ago      Up 10 minutes       0.0.0.0:8000-8001->8000-8001/tcp, 0.0.0.0:8443-8444->8443-8444/tcp   kong
bf526e28d65a        postgres:9.6                     "docker-entrypoint.s…"   30 minutes ago      Up 30 minutes       0.0.0.0:5432->5432/tcp 
1
2
3
4

# Kong配置

安装完成各项服务之后,我们就可以通过RESTful管理Api配置服务/路由/插件,因为可视化操作相对直观,这里推荐使用管理后台进行。

# 添加服务

RESTful接口

curl -i -X POST \
  --url http://localhost:8001/services/ \
  --data 'name=example-service' \
  --data 'url=http://mockbin.org'
1
2
3
4

返回数据格式:

HTTP/1.1 201 Created
Content-Type: application/json
Connection: keep-alive

{
   "host":"mockbin.org",
   "created_at":1519130509,
   "connect_timeout":60000,
   "id":"92956672-f5ea-4e9a-b096-667bf55bc40c",
   "protocol":"http",
   "name":"example-service",
   "read_timeout":60000,
   "port":80,
   "path":null,
   "updated_at":1519130509,
   "retries":5,
   "write_timeout":60000
}
Permalink
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

也可以通过管理后台添加:

kong

kong

# 为服务添加路由

添加为服务(API)配置之后,还需要给服务添加路由,让网关知道在什么情况下将请求转发给服务。

RESTful接口:

curl -i -X POST \
  --url http://localhost:8001/services/example-service/routes \
  --data 'hosts[]=example.com'
1
2
3

返回数据:

HTTP/1.1 201 Created
Content-Type: application/json
Connection: keep-alive

{
   "created_at":1519131139,
   "strip_path":true,
   "hosts":[
      "example.com"
   ],
   "preserve_host":false,
   "regex_priority":0,
   "updated_at":1519131139,
   "paths":null,
   "service":{
      "id":"79d7ee6e-9fc7-4b95-aa3b-61d2e17e7516"
   },
   "methods":null,
   "protocols":[
      "http",
      "https"
   ],
   "id":"f9ce2ed7-c06e-4e16-bd5d-3a82daef3f9d"
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

通过管理后台操作:

kong

# 通过Kong转发请求

配置完服务和路由之后,就可以通过Kong来转发请求了。

curl -i -X GET \
  --url http://localhost:8000/ \
  --header 'Host: example.com'
1
2
3

在上面请求中,因为配置了指定的host路由,Kong会转发请求到对应的服务。

# 添加插件

Kong 的插件机制是其高可扩展性的根源,Kong 可以很方便地为路由和服务提供各种插件,网关所需要的基本特性,Kong 都如数支持:

  • 云原生: 与平台无关,Kong可以从裸机运行到Kubernetes
  • 动态路由:Kong 的背后是 OpenResty+Lua,所以从 OpenResty 继承了动态路由的特性
  • 熔断
  • 健康检查
  • 日志: 可以记录通过 Kong 的 HTTP,TCP,UDP 请求和响应。
  • 鉴权: 权限控制,IP 黑白名单,同样是 OpenResty 的特性
  • SSL: Setup a Specific SSL Certificate for an underlying service or API.
  • 监控: Kong 提供了实时监控插件
  • 认证: 如数支持 HMAC, JWT, Basic, OAuth2.0 等常用协议
  • 限流
  • REST API: 通过 Rest API 进行配置管理,从繁琐的配置文件中解放
  • 可用性: 天然支持分布式
  • 高性能: 背靠非阻塞通信的 nginx,性能自不用说
  • 插件机制: 提供众多开箱即用的插件,且有易于扩展的自定义插件接口,用户可以使用 Lua 自行开发插件

关于Kong的插件可以看官方文档:https://docs.konghq.com/hub/ (opens new window)

RESTful接口:

curl -X POST http://localhost:8001/services/example-service/plugins \
    --data "name=rate-limiting"  \
    --data "config.second=5" \
    --data "config.hour=10000"
1
2
3
4

这样,我们就为example-service添加了一个rate-limiting插件,该插件会依据config配置限制example-service的请求频率,当超限是就会报错:

{
    "message": "API rate limit exceeded"
}
1
2
3

同样,我们也可以在管理后台操作。

kong

# 添加Consumer

Consumer可以理解为用户(消费者),用来标记某个用户或者某个服务。例如某个Service开启了key-auth插件,那么访问这个Service需要传入key,这个时候我们可以定义一个Consumer,给它添加一个key,这个时候通过这个key(当然key是唯一的)访问Service时,网关就可以判断是哪个Consumer发送的请求。

# 创建Consumer

curl -i -X POST \
  --url http://localhost:8001/consumers/ \
  --data "username=Jason"
1
2
3

# 为Consumer添加证书

curl -i -X POST \
  --url http://localhost:8001/consumers/Jason/key-auth/ \
  --data 'key=ENTER_KEY_HERE'
1
2
3

# 验证Consumer凭证

执行下面的命令,验证Consumer凭证

curl -i -X GET \
  --url http://localhost:8000 \
  --header "Host: example.com" \
  --header "apikey: ENTER_KEY_HERE"
1
2
3
4

# 参考文档

  • Kong中文文档 (opens new window)
#Nginx#Openresty#Kong
上次更新: 2022/12/01, 11:09:34
Zookeeper使用场景总结
Openresty实现API网关

← Zookeeper使用场景总结 Openresty实现API网关→

最近更新
01
常用游戏反外挂技术总结
11-27
02
Golang开发实践万字总结
11-11
03
Redis万字总结
10-30
更多文章>
Theme by Vdoing | Copyright © 2011-2022 Ravior | 粤ICP备17060229号-3 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式