[云框架]KONG API Gateway v1.5 -框架說明、快速部署、插件開發

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。

當前版本采用KONGv0.12.3

當我們決定對應用進行微服務改造時,應用客戶端如何與微服務交互的問題也隨之而來,畢竟服務數量的增加會直接導致部署授權、負載均衡、通信管理、分析和改變的難度增加。

面對以上問題,API GATEWAY是一個不錯的解決方案,其所提供的訪問限制、安全、流量控制、分析監控、日志、請求轉發、合成和協議轉換功能,可以解放開發者去把精力集中在具體邏輯的代碼,而不是把時間花費在考慮如何解決應用和其他微服務鏈接的問題上。

在眾多API GATEWAY框架中,Mashape開源的高性能高可用API網關和API服務管理層——KONG(基于NGINX)特點尤為突出,它可以通過插件擴展已有功能,這些插件(使用lua編寫)在API請求響應循環的生命周期中被執行。于此同時,KONG本身提供包括HTTP基本認證、密鑰認證、CORS、TCP、UDP、文件日志、API請求限流、請求轉發及NGINX監控等基本功能。目前,Kong在Mashape管理了超過15,000個API,為200,000開發者提供了每月數十億的請求支持。

本篇云框架將結合數據查詢服務實例介紹KONG API GATEWAY及其最佳實踐方法。

相關云框架:[云框架]基于Spring Cloud的微服務架構-用戶指南

?

快速部署

一鍵部署

一鍵部署至好雨云幫

本地部署

  1. 準備Docker環境

  2. 克隆倉庫

    git clone https://github.com/cloudframeworks-apigateway/user-guide-apigateway
    
  3. 基于docker-compose運行命令 (docker-compose.yml)

    docker-compose -f docker-compose.yml up -d
    
  4. 訪問路徑

    http://本機IP:8000?- kong url

    http://本機IP:8001?- kong admin url

    https://本機IP:8443?- kong https url

    http://本機IP:8081?- kong dashboard ui

    https://本機IP:8080/api/persons?- user api url

    https://本機IP:8080/api/newinfos?- newinfo api url

查看分步快速部署

框架說明-業務

數據查詢應用,顧名思義提供簡單的數據查詢服務,應用對外提供兩個端口:

  • user:處理敏感數據,如限制訪問

  • newinfo:普通數據,對所有人開放

對比以上兩個端口,我們可以相對清楚的理解KONG及其插件的效果和配置方法。

本例數據查詢應用業務架構比較簡明,如下圖所示:

框架說明-組件

本例使用KONG本身實現ROUTING,并添加了OAuth 2.0(AUTHENTICATION實現)、IP Restriction(SECURITY實現)、Rate Limiting(TRAFFIC CONTROL實現)、File(LOGGING實現)等4個插件。(查看更多官方插件)

以下管理配置通過命令行實現。KONG也可以通過UI管理界面進行管理和配置,方法請參考KONG DASHBOARD。

?

?

  • newinfo端口僅通過KONG實現與user端口的路由,其他插件未使用

    • KONG代理方式包括:1)應用通過攜帶HOST頭部路由到對應的API應用;2)通過不同的uri路由到API應用

    • 以上兩種方式均為基于Openresty動態增加upstream以及對upstream的DNS resolver來實現

    • 客戶端將先請求KONG服務器,并被代理到最終的API應用,而插件在API響應循環的生命周期中被執行

  • user端口信息敏感,限制訪問用戶;newinfo端口信息不敏感,無需限制訪問用戶(AUTHENTICATION實現)

  • user端口控制訪問地址,僅規定IP可訪問;newinfo端口無此限制(SECURITY實現)

  • user端口控制訪問頻率,newinfo端口可無限制訪問(TRAFFIC CONTROL實現)

  • user端口可獲取每次訪問日志(LOGGING實現)

KONG基本使用

注冊API

使用Kong代理API,首先需要把API注冊到Kong,并通過返回數據查看注冊是否成功,如:

curl -i -X POST \--url http://127.0.0.1:8001/apis/ \--data 'name=personapi' \--data 'hosts=personapi' \--data 'upstream_url=https://本機IP:8080/api/persons' ? ? ? ?  # 本機IP通過ifconfig查看

添加用戶

API可能沒有用戶概念,會出現隨意調用的情況。為此Kong提供了一種consumer對象(全局共用),如某API啟用了key-auth,沒有身份的訪問者將無法調用該API,

命令如下:

  1. 創建一個consumer

    curl -X POST \--data "username=oauthadmin" \--data "custom_id=personapi" \http://127.0.0.1:8001/consumers/ 
    
  2. 在key-auth插件中為此consumer生成key

    curl -X POST \http://127.0.0.1:8001/consumers/oauthadmin/key-auth \
    

此時即可使用key來通過權限驗證訪問API了,需要注意的是:

  • 若另一API也開通了key-auth插件,那么這個consumer也是可以通過key-auth驗證訪問這個API的,想要控制這種情況,需借助Kong的ACL插件

  • 對于Kong來講,認證與權限是兩個不同的概念

API添加插件

目前,Kong默認提供了31種插件,插件獨立作用于每一個API,不同的API可以使用完全不同的插件。

這是一種非常科學的設計,因為在實際情況中很可能會出現有的API完全開放,不需要任何認證,有的API會涉及敏感數據,權限控制需要非常嚴格;有的API完全不在乎調用頻次或者日志,有的API則嚴格限制調用頻次或者日志等類似情況。

命令如下:

  1. 添加插件:

    curl -i -X POST \--url http://127.0.0.1:8001/apis/personapi/plugins/ \--data 'name=key-auth'
    
  2. 訪問驗證:

    curl -H 'Host: personapi' -H 'TT: {KEY}' http://127.0.0.1:8000
    
    curl -H 'Host: personapi' http://127.0.0.1:8000/
    

ROUTING實現

user端口和newinfo端口之間實現路由,需先將服務注冊到Kong,外部訪問將統一走api gateway代理。

命令如下:

  1. 注冊user api

    curl -i -X POST \--url http://127.0.0.1:8001/apis/ \--data 'name=personapi' \--data 'hosts=personapi' \--data 'upstream_url=https://本機IP:8080/api/persons'
    
  2. 注冊newinfo api

    curl -i -X POST \--url http://127.0.0.1:8001/apis/ \--data 'name=newinfoapi' \--data 'hosts=newinfoapi' \--data 'upstream_url=https://本機IP:8080/api/newinfos'
    
  3. 注冊成功后即可通過Kong代理訪問

    • 用戶信息(user端口)

      命令:

      curl -H 'Host: personapi' http://127.0.0.1:8000
      

      返回:

      [{"pid":1,"name":"lucien","age":30},{"pid":2,"name":"Joe","age":28},{"pid":3,"name":"smith","age":32},{"pid":4,"name":"Tod","age":56},{"pid":5,"name":"linken","age":34},{"pid":6,"name":"truple","age":23},{"pid":7,"name":"tdt","age":20}
      ]
    • 新聞信息(newinfo端口)

      命令:

      curl -H 'Host: newinfoapi' http://127.0.0.1:8000
      

      返回:

      [{"nid":1,"title":"一路一代代","content":"what happending...."},{"nid":2,"title":"雪中悍刀行","content":"人生三不朽,立功立德立言"}
      ]

此時,可以將用戶信息、新聞通知對外訪問控制限制為只有Kong可以訪問,外部請求全部通過Kong進行代理。

AUTHENTICATION實現

通過OAuth 2.0 Authentication插件實現user端口的用戶訪問限制,

  1. 注冊Oauth2插件,詳情參見配置說明

    curl -X POST \--data 'name=oauth2' \--data 'config.enable_password_grant=true' \--data 'config.provision_key=qwe1238amsdh23' \http://127.0.0.1:8001/apis/personapi/plugins
    
  2. 添加Consumer及Consumer對應的credentials

    curl -X POST \--data "username=oauthadmin" \--data "custom_id=personapi" \http://127.0.0.1:8001/consumers/ 
    
    curl -X POST \--data "name=oauthadmin" \--data "client_id=personapi" \--data "redirect_uri=https://本機IP:8080/api/persons" \http://127.0.0.1:8001/consumers/oauthadmin/oauth2
    
  3. 申請accesstoken并訪問

    命令:

    curl -k -H 'Host: personapi' \--data "client_id=5bee1b6679e5463599d7ce64b14c2795" \--data "client_secret=54f2a058f30f46e8b5ccc8d6788eb081" \--data "provision_key=qwe1238amsdh23" \--data "authenticated_userid=b48bf407-c2b7-41a9-8e0f-43eead2fc60f" \--data "grant_type=password" \https://127.0.0.1:8443/oauth2/token
    

    返回:

    {"refresh_token":"e87d871957eb4717bb0002054ae8c9a3","token_type":"bearer","access_token":"bad2a7ee579e4389880ae29b3610c639","expires_in":7200
    }
  4. 訪問

    • 使用token訪問user api

      命令:

      curl -H 'Host: personapi' \-H 'Authorization: bearer bad2a7ee579e4389880ae29b3610c639' \http://127.0.0.1:8000
      

      返回:

      [{"pid":1,"name":"lucien","age":30},{"pid":2,"name":"Joe","age":28},{"pid":3,"name":"smith","age":32},{"pid":4,"name":"Tod","age":56},{"pid":5,"name":"linken","age":34},{"pid":6,"name":"truple","age":23},{"pid":7,"name":"tdt","age":20}
      ]
    • 不使用token訪問user api

      命令:

      curl -H 'Host: personapi' http://127.0.0.1:8000
      

      返回:

      {"error_description":"The access token is missing","error":"invalid_request"
      }
      

newinfo端口由于數據不敏感,無需特殊配置。

SECURITY實現

通過添加IP Restriction插件,實現對user端口的訪問限制,即僅規定IP可訪問。

  1. 為user端口添加IP Restriction插件擴展,并設置白名單(只有名單內的IP可以訪問API)

    curl -X POST \--data 'name=ip-restriction' \--data 'config.whitelist=172.17.0.1' \http://127.0.0.1:8001/apis/personapi/plugins 
    
  2. 訪問效果:

    • 白名單內IP訪問:

      命令:

      curl -H 'Host: personapi' http://127.0.0.1:8000
      

      返回:

      [{"pid":1,"name":"lucien","age":30},{"pid":2,"name":"Joe","age":28},{"pid":3,"name":"smith","age":32},{"pid":4,"name":"Tod","age":56},{"pid":5,"name":"linken","age":34},{"pid":6,"name":"truple","age":23},{"pid":7,"name":"tdt","age":20}
      ]
    • 其他IP訪問:

      命令:

      curl -H 'Host: personapi' http://172.17.0.1:8000
      

      返回:

      {"message":"Your IP address is not allowed"
      }

newinfo端口無需配置此插件。

TRAFFIC CONTROL實現

user端口通過Rate Limiting插件控制用戶訪問頻率,避免無限制訪問。

  1. 為user端口添加Rate Limiting插件擴展(此處設置1分鐘內只能訪問1次)

    curl -X POST \--data 'name=rate-limiting' \--data 'config.minute=1' \http://127.0.0.1:8001/apis/personapi/plugins 
    
  2. 訪問效果:

    • 正常訪問展示:

      命令:

      curl -H 'Host: personapi' http://127.0.0.1:8000
      

      返回:

      [{"pid":1,"name":"lucien","age":30},{"pid":2,"name":"Joe","age":28},{"pid":3,"name":"smith","age":32},{"pid":4,"name":"Tod","age":56},{"pid":5,"name":"linken","age":34},{"pid":6,"name":"truple","age":23},{"pid":7,"name":"tdt","age":20}
      ]
    • 超出次數的訪問展示:

      命令:

      curl -H 'Host: personapi' http://127.0.0.1:8000
      

      返回:

      {"message":"API rate limit exceeded"
      }

newinfo端口無需配置此插件。

LOGGING實現

user端口通過File-log插件實現對于每次訪問日志的獲取,需要注意為日志文件寫權限,日志格式參考Log Format。

  1. 為user端口添加File-log插件,并設置為日志文件路徑設為:/tmp/file.log

    curl -X POST \--data 'name=file-log' \--data 'config.path=/tmp/file.log' \http://127.0.0.1:8001/apis/personapi/plugins 
    
  2. 添加日志插件后,每次訪問都會被記錄

newinfo端口無需配置此插件。

KONG插件開發

  1. git clone Kong到本地

    git clone git@github.com:Mashape/kong.git
    
  2. 創建自定義插件目錄

    cd ${KONG_DIR}
    cd kong
    mkdir custom_plugins
    
  3. 新增插件

    cd ${KONG_DIR}
    cd kong
    mkdir custom_plugins
    cd custom_plugins
    mkdir xxx
    
  4. 編輯插件的schema.lua、handler.lua, 根據實際情況完成插件邏輯(lua教程)

  5. 修改${KONG_DIR}/templates/kong_defaults.lua,配置custom_plugins=xxx

  6. 執行luaracks make安裝插件到本地進行測試

  7. 制作kong鏡像,并快速部署

KONG插件開發示例:log2zmq

KONG插件開發示例:accesslimiting

?

?

轉自: https://github.com/cloudframeworks-apigateway/user-guide-apigateway#KONG%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/449443.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449443.shtml
英文地址,請注明出處:http://en.pswp.cn/news/449443.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

真格量化-主力跟買策略

#!/usr/bin/env python # coding:utf-8 from PoboAPI import * import datetime import time import numpy as np import pandas as pd #日線級別 #開始時間,用于初始化一些參數 def OnStart(context):print("I\m starting...")#設定一個全局變量品種,本策略交易50E…

頂級投資者的21條箴言(組圖)

每天你都會聽見五花八門的投資建議,告訴你應該買入還是賣出。如果這讓你感到無所適從,不妨靜下心來,聽聽歷史上最成功的投資者的建議。 我們搜集了21位頂尖大牛的投資箴言,以饗讀者。 1、George Soros:好的投資總是無…

python 游戲 —— 漢諾塔(Hanoita)

一、漢諾塔問題 1. 問題來源 問題源于印度的一個古老傳說,大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。并且規定,在小圓…

Base62x比Base64的編碼速度更快嗎?

現在幾乎所有企事業單位、政府機構、軍工系統等的IT生產系統都會用到Base64編碼,從RSA安全密鑰到管理信息系統登錄入口回跳,目前越來越多的IT系統研發者開始使用 Base62x 替換 Base64. -Base62x 提供了一種無符號輸出的Base64的編碼方案,在許…

對Docker常用命令的整理

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 查看docker版本信息、 #docker version #docker -v #docker info image鏡像操作命令 #docker search image_name //檢索image #docker p…

再說千遍萬遍,都不如這四句話管用,不服不行!

一、健康是最大的利益    人有時候,真不知要謀求什么?往往把最值得維護和珍貴的東西忽視了,卻不知揀了芝麻丟了西瓜。   現在好多人都在透支健康,燃燒生命,經常借口工作忙、應酬多,不注意生活方式&…

error: failed to push some refs to 'https://gitee.com/xxx/xxx'

一開始以為是本地版本和線上的差異 果斷先直接pull 之后 還是不對,哎 不瞎搞了 搜... 獲得消息: git pull --rebase origin master 原來如此:是缺失了文件 轉載于:https://www.cnblogs.com/G921123/p/10605956.html

真格量化-歷史波動率

#!/usr/bin/env python # coding:utf-8 from PoboAPI import * import datetime import time import numpy as np #日線級別 #開始時間,用于初始化一些參數 def OnStart(context):print("I\m starting...")#設定一個全局變量品種,本策略交易50ETF期權g.code = "…

DevOps團隊結構類型匯總:總有一款適合你

前言 組織中任何DevOps工作的主要目標都是改進客戶和業務的價值交付,而不是降低成本、提升自動化或者通過配置管理驅動一切;這意味著,為了實現有效的Dev和Ops協同,不同的組織可能需要不同的團隊結構。 概述 具體哪種DevOps團隊結構…

magic

轉載于:https://www.cnblogs.com/P201821430028/p/10611080.html

真格量化-bs套利

#!/usr/bin/env python # coding:utf-8 from PoboAPI import * import datetime import time import numpy as np from copy import *#開始時間,用于初始化一些參數 def OnStart(context) :context.myacc = None#登錄交易賬號if context.accounts["回測期權"].Login…

人生歷練必備的十個心態(圖)

成功源自心態,如果為自己鑲嵌上雄心、信心、決心、愛心、專心、誠心、耐心、恒心、虛心、靜心這十顆心,不斷打造自己的心態,你就一定會取得人生的成功! 第一個:雄心 你應該讓自己試著從人生的地平線上躍起。 第二個&#xf…

【docker】常用docker命令,及一些坑

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 查看容器的root用戶密碼 docker logs <容器名orID> 2>&1 | grep ^User: | tail -n1因為docker容器啟動時的root用戶的密碼…

kubernetes系列10—存儲卷詳解

kubernetes系列10—存儲卷詳解 1、認識存儲卷 1.1 背景 默認情況下容器中的磁盤文件是非持久化的&#xff0c;容器中的磁盤的生命周期是短暫的&#xff0c;這就帶來了一系列的問題&#xff1a;第一&#xff0c;當一個容器損壞之后&#xff0c;kubelet 會重啟這個容器&#xff0…

真格量化-隱含波動率計算

#!/usr/bin/env python # coding:utf-8 from PoboAPI import * import datetime import time import numpy as np from copy import *#開始時間,用于初始化一些參數 def OnStart(context) :context.myacc = None#登錄交易賬號if context.accounts["回測期權"].Login…

Vue 后臺管理

這里是結合vue和element快速成型的一個demo 里面展示了基本的后臺管理界面的大體結構和element的基本操作 GitHub的地址&#xff1a;https://github.com/wwwming/adminDemo 轉載于:https://www.cnblogs.com/wangming1002/p/10613014.html

生活竅門 這樣用錢就會富足

當我終于從惡劣處境中解脫之后&#xff0c;我想買棟房子&#xff0c;然而父親卻絲毫不為我感到興奮。他說&#xff1a;“在盡一項新的支付義務前&#xff0c;你應該多投資。”那個時候&#xff0c;許多人相信自己的房子是一種投資。我的父親問我&#xff1a;“如果你買了一棟房…

如何在Kubernetes集群動態使用 NAS 持久卷

1. 介紹&#xff1a; 本文介紹的動態生成NAS存儲卷的方案&#xff1a;在一個已有文件系統上&#xff0c;自動生成一個目錄&#xff0c;這個目錄定義為目標存儲卷&#xff1b; 鏡像地址&#xff1a;registry.cn-hangzhou.aliyuncs.com/acs/alicloud-nas-controller:v1.11.5.4-43…

Linux查看MySQL版本的四種方法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1 在終端下執行 mysql -V 2 在help中查找 mysql --help |grep Distrib 3 在mysql 里查看 select version() 4 在mysql 里查看 status…

行業指數動量策略+akshare

以周為單位&#xff0c;獲取本周最強的5只行業指數&#xff0c;進行均值購買。 數據源采用akshare。 導入包 import akshare as ak import pandas as pd import numpy as np import matplotlib 日線換為周線 #日線換為周線數據 def transferToWeekLine(df):data1dfstock_da…