最近搭建一个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

#安装

  1. brew install postgresql

#查看是否安装成功

  1. #查看安装路径
  2. MacBook-Pro:~$ which psql
  3. /usr/local/bin/psql
  4.  
  5. #查看pg 版本
  6. MacBook-Pro:~$ pg_ctl -V
  7. pg_ctl (PostgreSQL) 10.3

#设置配置文件

  1. vim /usr/local/var/postgres/postgresql.conf
  2.  
  3. #设置host和port,其他使用默认值
  4. # - Connection Settings -
  5.  
  6. listen_addresses = 'localhost' # what IP address(es) to listen on;
  7. # comma-separated list of addresses;
  8. # defaults to 'localhost'; use '*' for all
  9. # (change requires restart)
  10. port = # (change requires restart)
  11. max_connections = # (change requires restart)
  12. #superuser_reserved_connections = # (change requires restart)

#启动pg数据库

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

#查看数据库访问日志

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

#查看数据库运行状态

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

#停止数据库服务

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

#查看数据库运行进程

  1. ps -ef |grep postgres ps auxwww | grep postgres

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

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

  1. #创建数据库用户-kong
  2. createuser kong -P
  3.  
  4. #创建数据库/密码-kong/kong
  5. createdb kong -O kong -E UTF8 -e

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

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

  1. MacBook-Pro:~$ psql -h localhost -p -U kong -W kong
  2. Password for user kong:
  3. psql (10.3)
  4. Type "help" for help.
  5.  
  6. kong=> select * from test;
  7. id | name
  8. ----+------
  9. ( rows)

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

其它

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

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

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

安装kong

安装

Mac版安装参考官网

#安装

  1. $ brew tap kong/kong
  2. $ brew install kong

#数据库准备

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

  1. $ kong migrations up

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

  1. #kong.conf的路径,默认是/etc/kong/kong.conf
  2. $ 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插件在如下目录,自定义插件后续加在这里

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

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

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

#停止kong

  1. $ kong stop
  2. Kong stopped
  3. $ kong start
  4. Kong started
  5. $

#使用kong

  1. 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

  1. $ curl -i -X GET 'https://www.sojson.com/open/api/weather/json.shtml?city=%E4%B8%8A%E6%B5%B7'
  2. HTTP/
  3. server: marco/2.2
  4. date: Tue, May :: GMT
  5. content-type: application/json;charset=UTF-
  6. vary: Accept-Encoding
  7. x-source: C/
  8. content-disposition: inline;filename=f.txt
  9. cache-control: no-cache, no-store, must-revalidate
  10. pragma: no-cache
  11. expires: Sat, Mar :: GMT
  12. accept-ranges: bytes
  13. x-request-id: ff9f2b7ad8dd595cb1690e2c5bab92cd
  14. via: S.mix-sd-dst-, T..-, V.mix-sd-dst-, T..-, M.cun-he-tvs2-
  15.  
  16. {"date":"","message":"Success !","status":,"city":"上海","count":,"data":{"shidu":"92%","pm25":22.0,"pm10":42.0,"quality":"优","wendu":"","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":"雨虽小,注意保暖别感冒"}]}}
  17. $
  18. $

#接口注册kong

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

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

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

#通过kong访问此天气接口

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

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

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

安装kong-dashboard

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

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

  1. # Install Kong Dashboard
  2. npm install -g kong-dashboard
  3.  
  4. # Start Kong Dashboard
  5. kong-dashboard start --kong-url http://kong:8001
  6.  
  7. # 使用自定义端口启动kong-dashboard
  8. kong-dashboard start \
  9. --kong-url http://localhost:8001 \
  10. --port
  1. $ kong-dashboard start \
  2. > --kong-url http://localhost:8001 \
  3. > --port
  4. Connecting to Kong on http://localhost:8001 ...
  5. Connected to Kong on http://localhost:8001.
  6. Kong version is 0.13.
  7. Starting Kong Dashboard on port
  8. Kong Dashboard has started on port

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

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

KONGA -ADMIN API GUI

kongA也是依赖nodejs和npm启动的

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

更改数据库配置

  1. cp /config/local_example.js /config/local.js
  2. #更改数据库连接配置
  3. connections: {
  4. host: 'localhost',
  5. port: ,
  6. schema: false,
  7. ssl: false,
  8. adapter: 'postgres',
  9. user: 'kong',
  10. password: 'kong',
  11. database: 'kong',
  12. identity: 'postgres'
  13. },
  14.  
  15. models: {
  16. connection: process.env.DB_ADAPTER || 'postgres'
  17. }

启动

  1. npm start

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

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

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

KONG CLI

全局参数

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

--help   帮助命令

--v    开启详细信息模式

--vv 开启debug模式

命令行

kong check

检查kong.conf有效性

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

kong prepare

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

  1. 用法: kong prepare [OPTIONS]
  2.  
  3. 此命令可从nginx中启动kong代替kong start
  4.  
  5. 示例: 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
  6.  
  7. Options:
  8. -c,--conf (optional string) configuration file
  9. -p,--prefix (optional string) override prefix directory
  10. --nginx-conf (optional string) custom Nginx configuration template

kong health

检查kong 节点健康状况

  1. Usage: kong health [OPTIONS]
  2.  
  3. Options:
  4. -p,--prefix (optional string) prefix at which Kong should be running
  1. $ kong health
  2. nginx.......running
  3.  
  4. Kong is healthy at /usr/local/opt/kong

kong migrations

管理kong数据库

  1. 用法: kong migrations COMMAND [OPTIONS]
  2.  
  3. 可用的参数:
  4. list #列出迁移的数据列表
  5. up #执行所有丢失的迁移到最新版本,初始化即执行这个
  6. reset #重置数据库,不可逆,执行完即删除kong数据表,亲测,谨慎操作 (irreversible).
  7.  
  8. Options:
  9. -c,--conf (optional string) configuration file

kong quit

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

  1. 用法: kong quit [OPTIONS]
  2. 此命令发送一个SIGQUIT信号给nginx,表示所有到请求都要结束在服务关闭前,如果指定的timeout时间到,则立即强制退出
  3.  
  4. Options:
  5. -p,--prefix (optional string) prefix Kong is running at
  6. -t,--timeout (default ) timeout before forced shutdown

kong reload

kong restart

kong start

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

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

kong stop

停止kong服务

  1. Usage: kong stop [OPTIONS]
  2.  
  3. Stop a running Kong node (Nginx and other configured services) in given
  4. prefix directory.
  5.  
  6. This command sends a SIGTERM signal to Nginx.
  7.  
  8. Options:
  9. -p,--prefix (optional string) prefix Kong is running at

kong version

查看kong版本

  1. $ kong version -a
  2. Kong: 0.13.
  3. ngx_lua:
  4. nginx:
  5. Lua: LuaJIT 2.1.-beta3

reference:

https://sdk.cn/news/1596

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

apigateway-kong(一)简介及部署的更多相关文章

  1. 深入详解美团点评CAT跨语言服务监控(一) CAT简介与部署

    前言: CAT是一个实时和接近全量的监控系统,它侧重于对Java应用的监控,除了与点评RPC组件融合的很好之外,他将会能与Spring.MyBatis.Dubbo 等框架以及Log4j 等结合,支持P ...

  2. API网关之Kong网关简介

    1. Kong简介 那么,Kong是一个什么东东呢?它是一个开源的API网关,或者你可以认为它是一个针对API的一个管理工具.你可以在那些上游service之上,额外去实现一些功能.Kong是开源的, ...

  3. LAMP简介与部署

    lamp简介 lamp,是由Linux+Apache+Mysql/MariaDB+Php/Perl/Python的一组动态网站或者服务器的开源软件,除Linux外其它各部件本身都是各自独立的程序,但是 ...

  4. dubbo + zookeeper 简介和部署

    Dubbo简介: Dubbo 是阿里巴巴公司开源(以前不开源)的一个高性能优秀的服务框架, 使得应用可通过高性能的 RPC 实现服务的输入和输出功能, 可以和spring框架无缝集成. 那么这里, 啥 ...

  5. Shark简介、部署及编译小结

    http://blog.csdn.net/pelick/article/details/11964291 Shark简介 Shark即Hive on Spark,本质上是通过Hive的HQL解析,把H ...

  6. Hadoop入门第五篇:Hive简介以及部署

    标签(空格分隔): Hadoop Hive hwi 1.Hive简介   之前我一直在Maxcompute上进行大数据开发,所以对数仓这块还算比较了解,在接受Hive的时候基本上没什么大的障碍.所以, ...

  7. 【原创】Airflow 简介&如何部署一个健壮的 apache-airflow 调度系统

    声明 本文摘录了很多前辈的文章,原文如下: https://www.jianshu.com/p/2ecef979c606 Airflow 简介 Airflow是一个可编程,调度和监控的工作流平台,基于 ...

  8. Docker 容器简介与部署

    关于Docker容器技术 参考文献:<docker 从入门到精通> Docker容器简介 Docker的构想是要实现 "Build,Ship and Run Any App,An ...

  9. 01 . 分布式存储之FastDFS简介及部署

    分布式存储简介 现代的互联网已经进入大数据时代,每天都有数以万计的数据产生,这些数据的规模轻轻松松地可以达到几P的级别,传统的的单机存储早已捉襟见肘,根本无法满足大数据对存储系统的要求.这时,各种分布 ...

随机推荐

  1. web报表工具FineReport常用函数的用法总结(数学和三角函数)

    最后一次抛砖引玉了,至此finereport所有的常见函数就分享完了,期待能对大家有些许帮助. ABS ABS(number):返回指定数字的绝对值.绝对值是指没有正负符号的数值. Number:需要 ...

  2. LeetCode之旅(17)-Ugly Number

    题目: Write a program to check whether a given number is an ugly number. Ugly numbers are positive num ...

  3. 演进之美,越来越美:三分钟看尽 iOS 1 ~ iOS 8 的进化史

    演进之美,越来越美:三分钟看尽 iOS 1 ~ iOS 8 的进化史 原文出处: 少数派 9 月 18 日苹果就将推出 iOS 8 正式版了,从 2007 年发布第一代 iPhone 时搭载在 iPh ...

  4. springboot2 webflux 响应式编程学习路径

    springboot2 已经发布,其中最亮眼的非webflux响应式编程莫属了!响应式的weblfux可以支持高吞吐量,意味着使用相同的资源可以处理更加多的请求,毫无疑问将会成为未来技术的趋势,是必学 ...

  5. Day6_time模块

    TIME模块: print(time.time()) #指的是从1970年到现在的秒数 print(time.strftime('%Y-%m-%d %X'))  #指定特定的格式输出时间 print( ...

  6. Linux 命令行输入

    这几天刚刚接触到Linux,在windows上安装的VMWare虚拟机,Centos7.安装什么都是贾爷和办公室的同事帮忙搞定的. 在虚拟机界面,按快捷键Ctrl+Alt+Enter,可以全屏显示Li ...

  7. JavaScript引用类型-Object类型

    创建Object的方式有两种: 第一种:使用new操作符后跟Object操作函数. var person = new Object(); person.name = "wang"; ...

  8. 学习了解CyclicBarrier

    CyclicBarrier我的理解就是一个线程等待器,用途就是将注册了这个barrier的线程卡在同一个位置,直到注册这个barrier的所有线程都完成之后,继续执行.下面是一个学习过程中采用的示例, ...

  9. 从javascript发展说到vue

    Vue是基于javascript的一套MVVC前端框架,在介绍vue之前有必要先大体介绍下javascript产生背景及发展的历史痕迹.前端MVVC模式等,以便于大家更好的理解为什么会有vue/rea ...

  10. 分布式消息队列XXL-MQ

    <分布式消息队列XXL-MQ>     一.简介 1.1 概述 XXL-MQ是一款轻量级分布式消息队列,支持串行.并行和广播等多种消息模型.现已开放源代码,开箱即用. 支持三种消息模式: ...