apigateway-kong(一)简介及部署

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介:    最近搭建一个api-gateway服务,随着后端restful api不断增加, 权限控制,安全,负载均衡,请求分发,监控等都成了问题为什么使用API-Gateway  1. 方便客户端维护-- 每个请求方不用管理多个api url,统一访问api-gateway即可  2.

   最近搭建一个api-gateway服务,随着后端restful api不断增加, 权限控制,安全,负载均衡,请求分发,监控等都成了问题

为什么使用API-Gateway

  1. 方便客户端维护-- 每个请求方不用管理多个api url,统一访问api-gateway即可

  2. 接口重构时调用方不须了解接口本身等拆分和聚合

  3. 客户端无须关心接口协议

  4. 统一权限控制、接口请求访问日志统计

  5. 安全,是保护内部服务而设计的一道屏障

  5. 开源-最大好处

      当然也有一个很大的缺点,api-gw很可能成为性能瓶颈,因为所有的请求都经过这里,可以通过横向扩展和限流解决这个问题。

  在众多API GATEWAY框架中,Mashape开源的高性能高可用API网关和API服务管理层——KONG(基于NGINX)特点尤为突出,它可以通过插件扩展已有功能,这些插件(使用lua编写)在API请求响应循环的生命周期中被执行。于此同时,KONG本身提供包括HTTP基本认证、密钥认证、CORS、TCP、UDP、文件日志、API请求限流、请求转发及NGINX监控等基本功能。目前,Kong在Mashape管理了超过15,000个API,为200,000开发者提供了每月数十亿的请求支持。

  Kong是一款基于Nginx_Lua模块写的高可用,由于Kong是基于Nginx的,所以可以水平扩展多个Kong服务器,通过前置的负载均衡配置把请求均匀地分发到各个Server,来应对大批量的网络请求。

     

  

 

Kong主要有三个组件:

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

以下实践环境:

操作系统:macOS

kong版本:0.13.x

PostgreSQL:10.3

npm版本:5.6.0 ,  node : 6.0.0+ (用于部署kong-dashboard,也可以通过docker部署)

kong-dashboard:3.3.x

 

安装/部署kong

安装postgresql

简介

kong将其所有数据(如API,用户和插件)存储在Cassandra或PostgreSQL中。 属于同一集群的所有Kong节点必须连接到同一个数据库。

database:配置此节点来指定KONG使用哪个数据库(PostgreSQL或Cassandra)作为其数据存储。可选的数据库只有postgres和cassandra,默认为 postgres。

Postgres的设置:

    pg_host:Postgres的服务器的主机地址

    pg_port:Postgres的服务器的端口

    pg_user:Postgres用户名

    pg_password:Postgres的用户密码

    pg_database:要连接的数据库实例名,必须存在

    pg_ssl:是否启用与服务器的SSL连接

    pg_ssl_verify:如果启用了pg_ssl,则切换服务器证书验证。请参阅lua_ssl_trusted_certificate设置。

 安装postgresql

#安装

brew install postgresql 

#查看是否安装成功

#查看安装路径
MacBook-Pro:~$ which psql
/usr/local/bin/psql

#查看pg 版本
MacBook-Pro:~$ pg_ctl -V
pg_ctl (PostgreSQL) 10.3

#设置配置文件

vim /usr/local/var/postgres/postgresql.conf

#设置host和port,其他使用默认值
# - Connection Settings -

listen_addresses = 'localhost'          # what IP address(es) to listen on;
                                        # comma-separated list of addresses;
                                        # defaults to 'localhost'; use '*' for all
                                        # (change requires restart)
port = 5432                             # (change requires restart)
max_connections = 100                   # (change requires restart)
#superuser_reserved_connections = 3     # (change requires restart)

#启动pg数据库

pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start

#查看数据库访问日志

cat /usr/local/var/postgres/server.log

#查看数据库运行状态

pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log status 

#停止数据库服务

pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log stop -s -m fast

#查看数据库运行进程

ps -ef |grep postgres 或 ps auxwww | grep postgres 

数据库运行正常后,开始创建kong账号和数据库,可以通过pg命令创建db和user,也可以通过psql命令进入数据库后创建

# 命令行创建kong数据库和用户

#创建数据库用户-kong
createuser kong -P  

#创建数据库/密码-kong/kong
createdb kong -O kong -E UTF8 -e

然后就可以通过navicat图形化连接pg数据库kong

#也可以连接到数据库后创建数据库,但用户要先创建好

MacBook-Pro:~$ psql -h localhost -p 5432 -U kong -W kong
Password for user kong:
psql (10.3)
Type "help" for help.

kong=> select * from test;
 id | name
----+------
(0 rows)

到此,数据库就配置好了,然后安装kong,需要将postgresql的配置加入到kong配置中

其它

# 数据导出和导入,和mysql类似

#远程导出表结构和数据:
pg_dump -h REMOTE_IP kong -U kong -p 5432 -f kong.dump  
#远程导出表结构,不带数据
pg_dump -s -h REMOTE_IP kong -U kong -p 5432 -f kong.dump  
导入本地数据库:
psql -h localhost kong -U kong -p 5432 -f kong.dump 

# navicat图形化连接,此时数据表还没有,配置好kong.conf后执行初始化配置后会自动生成相关kong数据表

 

安装kong

安装

Mac版安装参考官网

#安装

$ brew tap kong/kong
$ brew install kong

#数据库准备

按照上述postgresql安装,已经准备好存储,现在需要执行kong migrations来初始化数据库表

$ kong migrations up

这里我没有指定配置文件,使用的都是kong默认的配置,也可以指定自定义配置文件

#kong.conf的路径,默认是/etc/kong/kong.conf
$ kong migrations up [-c /path/to/kong.conf]

也不知道为啥,官网说默认会在/etc/kong/下自动生成配置文件kong.conf,但我本机没有在这个目录生成,在这个目录下/usr/local/opt/kong,anyway,目前还没有影响

执行好后,数据库会生成很多表,这些是默认但kong数据表,后续可以自定义插件,重新migrations,会生成自定义表

最常用的是apis、ratelimiting_metrics表,也有自带的keyauth,oauth认证插件,后续篇章再做演示说明

#默认kong插件在如下目录,自定义插件后续加在这里

cd /usr/local/share/lua/5.1/kong/plugins/

#启动kong,这里没有用到nginx-kong.conf

$ kong start [-c /path/to/kong.conf]

#停止kong

$ kong stop
Kong stopped
$ kong start
Kong started
$

#使用kong

curl -i http://localhost:8001/

 

成功启动后访问:http://localhost:8001/ 会出现kong的admin-api json

 

默认情况下,KONG监听的端口为:

  · 8000:此端口是KONG用来监听来自客户端传入的HTTP请求,并将此请求转发到上有服务器;

  · 8443:此端口是KONG用来监听来自客户端传入的HTTP请求的。它跟8000端口的功能类似,但是它只是用来监听HTTP请求的,没有转发功能。可以通过修改配置文件来禁止它;

  · 8001:Admin API通过此端口,管理者可以对KONG的监听服务进行配置;

  · 8444:通过此端口,管理者可以对HTTP请求进行监控.

 

接口接入kong测试

# 原接口

访问上海天气预报的接口 :https://www.sojson.com/open/api/weather/json.shtml?city=%E4%B8%8A%E6%B5%B7

$ curl -i -X GET 'https://www.sojson.com/open/api/weather/json.shtml?city=%E4%B8%8A%E6%B5%B7'
HTTP/2 200
server: marco/2.2
date: Tue, 22 May 2018 04:26:20 GMT
content-type: application/json;charset=UTF-8
vary: Accept-Encoding
x-source: C/200
content-disposition: inline;filename=f.txt
cache-control: no-cache, no-store, must-revalidate
pragma: no-cache
expires: Sat, 03 Mar 1990 23:33:33 GMT
accept-ranges: bytes
x-request-id: ff9f2b7ad8dd595cb1690e2c5bab92cd
via: S.mix-sd-dst-036, T.37.-, V.mix-sd-dst-035, T.75.-, M.cun-he-tvs2-074

{"date":"20180522","message":"Success !","status":200,"city":"上海","count":1556,"data":{"shidu":"92%","pm25":22.0,"pm10":42.0,"quality":"","wendu":"19","ganmao":"各类人群可自由活动","yesterday":{"date":"21日星期一","sunrise":"04:56","high":"高温 22.0℃","low":"低温 19.0℃","sunset":"18:46","aqi":44.0,"fx":"东风","fl":"<3级","type":"小雨","notice":"雨虽小,注意保暖别感冒"},"forecast":[{"date":"22日星期二","sunrise":"04:55","high":"高温 25.0℃","low":"低温 18.0℃","sunset":"18:47","aqi":50.0,"fx":"东南风","fl":"3-4级","type":"中雨","notice":"记得随身携带雨伞哦"},{"date":"23日星期三","sunrise":"04:55","high":"高温 26.0℃","low":"低温 17.0℃","sunset":"18:47","aqi":65.0,"fx":"无持续风向","fl":"3-4级","type":"","notice":"愿你拥有比阳光明媚的心情"},{"date":"24日星期四","sunrise":"04:54","high":"高温 26.0℃","low":"低温 20.0℃","sunset":"18:48","aqi":82.0,"fx":"东南风","fl":"<3级","type":"多云","notice":"阴晴之间,谨防紫外线侵扰"},{"date":"25日星期五","sunrise":"04:54","high":"高温 29.0℃","low":"低温 23.0℃","sunset":"18:49","aqi":101.0,"fx":"东南风","fl":"<3级","type":"小雨","notice":"雨虽小,注意保暖别感冒"},{"date":"26日星期六","sunrise":"04:53","high":"高温 28.0℃","low":"低温 22.0℃","sunset":"18:49","aqi":118.0,"fx":"西风","fl":"<3级","type":"小雨","notice":"雨虽小,注意保暖别感冒"}]}}
$
$

#接口注册kong

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

name是全局唯一,后续对注册接口的插件修改都可以用到,host放在header里指定,upstream_url是转发的真实的上游接口

注册成功,则pg数据库的apis表会添加一条记录

#通过kong访问此天气接口

curl -i -X GET \
  --url http://localhost:8000?city=上海 \
  --header 'Host: www.sojson.com'

 

kong完美的实现了接口转发~

注意注册时,'hosts', 'uris' or 'methods'三个参数至少有一个必须指定

 

安装kong-dashboard

kong已经提供了非常友好的restful api,但还是看起来不直观,其实如果很闲的话可以自己根据这些kong API写个前端,不然就要使用懒人必备kong-dashboard,搭建起来非常简单.

作为nodejs常用开发者,npm包必不可少,使用npm全局安装kong-dashboard

# Install Kong Dashboard
npm install -g kong-dashboard

# Start Kong Dashboard
kong-dashboard start --kong-url http://kong:8001

# 使用自定义端口启动kong-dashboard
kong-dashboard start \
  --kong-url http://localhost:8001 \
  --port 8088
$ kong-dashboard start \
>   --kong-url http://localhost:8001 \
>   --port 8088
Connecting to Kong on http://localhost:8001 ...
Connected to Kong on http://localhost:8001.
Kong version is 0.13.1
Starting Kong Dashboard on port 8088
Kong Dashboard has started on port 8088

#启动好后访问 localhost:8088 进入kong-dashboard首页

kong还有一个比较知名的API管理的GUI -KONGA,下面也来简单部署一下

KONGA -ADMIN API GUI

kongA也是依赖nodejs和npm启动的

$ git clone https://github.com/pantsel/konga.git
$ cd konga
$ npm install

更改数据库配置

cp /config/local_example.js /config/local.js
#更改数据库连接配置
 connections: {
  host: 'localhost',
  port: 5432,
  schema: false,
  ssl: false,
  adapter: 'postgres',
  user: 'kong',
  password: 'kong',
  database: 'kong',
  identity: 'postgres'
  },

models: {
    connection: process.env.DB_ADAPTER || 'postgres'
}

启动

npm start

启动后访问: http://localhost:1338/

 

konga部署起来比kong-dashboard要复杂~

kong部署和安装到此为止,下面顺便介绍下kong命令行

 

KONG CLI

全局参数

即所有命令都可加下面都参数

--help   帮助命令

--v    开启详细信息模式

--vv 开启debug模式

命令行

kong check

检查kong.conf有效性

用法: kong check [conf]
[conf] (默认check  /etc/kong.conf or /etc/kong/kong.conf) 

kong prepare

准备kong的前置文件夹和子文件夹和文件---讲真,我不清楚这个命令的用处,反正我没用到过

用法: kong prepare [OPTIONS]

此命令可从nginx中启动kong代替kong start

示例: sudo kong prepare -p /usr/local/opt/kong -c /etc/kong/kong.conf && kong migrations up &&  nginx -p /usr/local/opt/kong -c nginx.conf


Options:
 -c,--conf    (optional string) configuration file
 -p,--prefix  (optional string) override prefix directory
 --nginx-conf (optional string) custom Nginx configuration template

kong health

检查kong 节点健康状况

Usage: kong health [OPTIONS]

Options:
  -p,--prefix (optional string) prefix at which Kong should be running
$ kong health
nginx.......running

Kong is healthy at /usr/local/opt/kong

kong migrations

管理kong数据库

用法: kong migrations COMMAND [OPTIONS]

可用的参数:
  list    #列出迁移的数据列表
  up     #执行所有丢失的迁移到最新版本,初始化即执行这个
  reset  #重置数据库,不可逆,执行完即删除kong数据表,亲测,谨慎操作 (irreversible).

Options:
  -c,--conf (optional string) configuration file

kong quit

从一个运行到kong节点中退出

用法: kong quit [OPTIONS]
此命令发送一个SIGQUIT信号给nginx,表示所有到请求都要结束在服务关闭前,如果指定的timeout时间到,则立即强制退出

Options:
  -p,--prefix  (optional string) prefix Kong is running at
  -t,--timeout (default 10) timeout before forced shutdown

kong reload

kong restart

kong start

Start Kong (Nginx and other configured services) in the configured
prefix directory.

用法: kong start [OPTIONS]
示例:kong start -c /etc/kong/kong.conf --nginx-conf=/etc/kong/nginx.conf --vv
Options:
  -c,--conf        (optional string)   kong.conf
  -p,--prefix      (optional string)   kong前置目录
  --nginx-conf     (optional string)  自定义nginx模版
  --run-migrations (optional boolean)  optionally run migrations on the DB

kong stop

停止kong服务

Usage: kong stop [OPTIONS]

Stop a running Kong node (Nginx and other configured services) in given
prefix directory.

This command sends a SIGTERM signal to Nginx.

Options:
  -p,--prefix (optional string) prefix Kong is running at

kong version

查看kong版本

$ kong version -a
Kong: 0.13.1
ngx_lua: 10011
nginx: 1013006
Lua: LuaJIT 2.1.0-beta3

 

reference:

https://sdk.cn/news/1596

http://www.cnblogs.com/SummerinShire/p/6386086.html

 

作者: zhoujie
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,不然我担心博客园找你算账
如果您觉得本文对你有帮助,请竖起您的大拇指右下角点推荐,也可以关注我
相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
5月前
|
Kubernetes 应用服务中间件 API
5 分钟了解 Kubernetes Ingress 和 Gateway API
5 分钟了解 Kubernetes Ingress 和 Gateway API
122 0
|
Linux API 数据安全/隐私保护
|
9月前
|
Ubuntu API 数据库
kong网关插件开发初探
kong插件开发初探
253 0
|
11月前
|
Kubernetes 网络协议 应用服务中间件
Kubernetes Gateway API 深入解读和落地指南
Gateway API 作为新一代的 Kubernetes 入口 API,有更广泛的应用场景、更强大的功能、以及更好的可靠性和扩展性。对于生产级的 Kubernetes 环境,Gateway API 是一个更好的选择。本篇文章将深入解读 Kubernetes Gateway API 的概念、特性和用法,帮助读者深入理解并实际应用 Kubernetes Gateway API,发挥其在 Kubernetes 网络流量管理中的优势。
kong gateway 授权插件配置
kong gateway 授权插件配置 auth
230 0
|
算法 API
kong gateway 插件使用
kong 插件使用, 其中限流插件是默认安装的
212 0
|
API 微服务
kong 网关配置指引
kong 网关配置指引
772 0
kong 网关配置指引
|
存储 监控 应用服务中间件
|
前端开发 关系型数据库 应用服务中间件
API Gateway Kong在Rainbond上的部署
Kong是一个可扩展的开源API平台(也称为API网关,API中间件或微服务服务网格)。Kong最初是由Kong Inc(以前称为Mashape)实现的,用于为其API Marketplace维护、管理和扩展超过15,000个微服务,这些微服务每月产生数十亿个请求。
1974 0
|
负载均衡 网络协议 API
Kong04- Kong 四大参考说明
Kong 的官方有很多详细的参考说明,比如配置文件、命令行、Admin API、代理、负载均衡,接下来我们简单看一下,都提供什么内容。 本文主要基于 Kong 1.3 版本进行描述,如有更新,请查看最新文档。
1441 0