1、简介
Kong是一个云原生、快速、可扩展的一个分布式微服务抽象层(API网关).
Kong是一个运行在Nginx中的Lua应用程序,由Lua - Nginx模块实现。Kong与OpenResty一起发布,而不是使用这个模块编译Nginx, OpenResty已经包含了lua- Nginx模块。OpenResty不是Nginx的分支,而是扩展其功能的一组模块。
1.1 特性
- 云原生:平台无关,kong可以从裸机迁移到kubernetes中.
- 动态负载均衡:跨多个上游服务的负载平衡流量.
- Hash-based负载均衡:使用一致的散列/粘性会话实现负载平衡.
- 熔断:智能的非健康上游服务检查.
- 健康检查:提供active和passive两种方式对上游服务进行监控.
- OAuth2.0:方便集成OAuth2.0的认证.
- 认证:支持HMAC, JWT, Basic等.
- 限流:基于许多变量阻塞和限制请求.
- 插件:通过添加插件的方式对Kong的功能进行扩展
更多个特性请查看GitHub上的说明,https://github.com/Kong/kong
1.2 安装
Kong可以通过Dockers、kubernetes、安装包、源码等方式进行安装,这里我们主要采用Docker进行安装配置。所以事先请自行安装Docker环境,具体可参照Docker官网说明:https://docs.docker.com/install/linux/docker-ce/centos/.
- 创建网络
在Docker中可以创建独立的网络,从而实现各个服务的隔离,相互之间互不影响.
docker network create kong-net
- 创建数据库
Kong提供了Cassandra和PostgreSQL两种类型的数据库支持,其主要用于存储services、routes、plugins等信息。这里采用PostgreSQL.
docker run -d --name kong-database \
--network=kong-net \
-p 5432:5432 \
-e "POSTGRES_USER=kong" \
-e "POSTGRES_DB=kong" \
postgres:9.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
- 启动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
- 访问
curl -i http://localhost:8001/
2、使用
Kong对外提供了两种端口,一种是Admin Api提供RestFul接口用于管理Services、routes、plugins等配置信息,一种是前端代理的接口。如上面配置的8001和8444、8000和8443分别对应Admin Api和Proxy Request使用的端口。
2.1 组件
- service:表示后端的服务
- route:定义路由规则,和后端服务的映射关系
- plugin:插件,如可以给后端的服务添加认证插件,只有携带有认证信息的consumer才能访问后端的服务
- consumer:标识使用后端服务的消费者,与使用您的服务的个人相关联,可以用于跟踪、访问管理等。
2.2 注册服务
这里使用Mockbin API进行测试,他是一个"echo"类型的公共站点,将返回和请求一致的响应。
- 添加服务
curl -i -X POST \
--url http://localhost:8001/services/ \
--data 'name=example-service' \ # 设置服务名称
--data 'url=http://mockbin.org' # 设置服务对应的url地址
- 添加路由
curl -i -X POST \
--url http://localhost:8001/services/example-service/routes \
--data 'hosts[]=example.com' # 配置按请求头信息进行转发
- 测试转发
curl -i -X GET \
--url http://localhost:8000/ \
--header 'Host: example.com'
2.3 添加插件
key-auth插件用于处理认证,表示只有携带的有正确的key的请求才会被代理到后端的service,否则将被kong拒绝。
- 添加插件
curl -i -X POST \
--url http://localhost:8001/services/example-service/plugins/ \
--data 'name=key-auth'
- 测试
curl -i -X GET \
--url http://localhost:8000/ \
--header 'Host: example.com'
报错提示:在请求中没有找到key。

2.4 添加consumer
- 添加consumer
curl -i -X POST \
--url http://localhost:8001/consumers/ \
--data "username=Jason" # consumer的名称
- 颁发key凭证
curl -i -X POST \
--url http://localhost:8001/consumers/Jason/key-auth/ \
--data 'key=ENTER_KEY_HERE' # 配置key的值
- 测试
curl -i -X GET \
--url http://localhost:8000 \
--header "Host: example.com" \
--header "apikey: ENTER_KEY_HERE"