微服务网关Kong实践

之前做PaaS平台使用过新浪基于OpenResty实现蓝绿部署和灰度发布的方案。这几天倒腾了一下大名鼎鼎的Kong,对其新版本中的概念抽象,以及环境搭建、plugin编程规则等内容大概记录一下。

Kong介绍

  • API网关是所有的客户端和消费端统一的接入点,它对消费者屏蔽了后端的微服务,并处理非业务功能。通常,网关也提供REST/HTTP的访问API,服务端通过API-GW注册和管理服务。
  • Kong是一个可扩展的开放源码的API中间件, 它在任何RESTful API的前面运行,通过插件扩展,它提供了超越核心平台的额外功能和服务。Kong是基于OpenResty(不要问我Openresty是不是基于Nginx),在其基础上做了一系列的抽象概念、提供了相应的Lua脚本编程框架和库;同时,它也提供了集群方案,是一个满足生产级的API网关解决方案。

部署实践

由于安装Openresty需要各种依赖,在MacBook上安装了很多次最后都放弃了;最后还是采用docker的方式来部署(不得不又膜拜一下docker,技术都是linux的老技术,重点是如何把这些技术组合成完美的产品。)

安装数据库

这里我们采用postgres数据库方案:

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

然后需要初始化数据库表结构:

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

安装Kong

运行Kong需要注意,指定proxy的端口号 KONG_PROXY_LISTEN 并暴露容器的端口出去。如果要使用自定义的lua plugin,还需要使用环境变量KONG_CUSTOM_PLUGINS指定插件的名称。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
docker run -d --name kong \
--link kong-database:kong-database \
-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" \
-e "KONG_PROXY_LISTEN=0.0.0.0:80" \
-e "KONG_PROXY_LISTEN_SSL=0.0.0.0:443" \
-p 80:80 \
-p 443:443 \
-p 8001:8001 \
-p 8444:8444 \
kong:latest

# 如果使用自定义plugin-xxx,需要指定
-e "KONG_CUSTOM_PLUGINS=plugin-xxx" \

至此,在本地访问管理端API: http://localhost:8001 应该能够返回数据了,说明kong已经开始工作了。

安装图形化管理界面

这里使用konga来管理,界面比较美观,只是暂时还没有中文版。

1
2
3
4
5
docker run -d -p 1337:1337 \
--link kong:kong \
--name konga \
-e "NODE_ENV=development" \
pantsel/konga

安装好后,我们登录上去,默认登录用户名密码为:

Admin login: admin
Password: adminadminadmin

将管理的kong地址设置为: http://kong:8001 即可开启Kong之旅了。

操作顺序依次为:

  • upstream
  • upstream’s target
  • service
  • service’s router