apigateway-kong(一)簡介及部署


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM