用API網關把API管起來

最開始只是想找個API網關防止API被惡意請求,找了一圈發現基於Nginx的OpenResty(Lua語言)擴展模塊Orange挺好(也找了Kong,可是感受複雜了點沒用),還偷懶用Vagrant結合Docker來快速搭建環境,基於別人的Dockerfile把整個實驗跑通了,以爲還不錯。想着好像CoreOS是專門爲Docker服務的,還買了一本《CoreOS實踐》花小半天時間看完了,CoreOS在集羣環境下確實很牛,可是個人環境仍是輕量級點,因此仍是基於CentOS來作,就這樣研究了兩天時間,與你們分享一下,歡迎留言拍磚或交流!html

問題

通常開發接口的時候各類語言都已經有很成熟的框架了,互聯網領域用得最多的應該是RESTfull+JSON的模式,可是小型項目對接口基於沒有安全方面、性能等的考慮, 以前寫過一篇直接經過JS抓取數據的《玩爽了!直接在Chrome裏抓取數據》,就算考慮的話實現起來也缺乏簡便的辦法,時間上也不必定容許。mysql

 

解決方案

隨着微服務的流行,須要有一個相似於API網關的中間件來作API的管理工做,也就是API的實現方面更多的考慮業務邏輯,安全、性能、監控能夠交由網關來作(以下圖所示,下圖根據Kong官方文檔修改),這樣既提升業務靈活性又不缺安全性。nginx

 

環境搭建

開頭已經說了環境會涉及到VirtualBox、Vagrant、Docker、Nginx、Lua、OpenRety、Orange,好在基本的坑都已經填完了。但你最好也有一些這方面的基礎,因爲實驗步驟冗長不免有些地方沒有記錄到或者省略。(本文全部步驟基於MacOS環境)git

Vagrant CentOS環境搭建

提早安裝VirtualBox、Vagrantgithub

vagrant init centos/7
vagrant up
vagrant ssh

編輯Vagrantfile,配置私有IPsql

config.vm.network "private_network", ip: "192.168.88.77"

 

安裝Docker引擎

sudo yum update
sudo tee /etc/yum.repos.d/docker.repo <<-'EOF' [dockerrepo] name=Docker Repository baseurl=https://yum.dockerproject.org/repo/main/centos/7/ enabled=1 gpgcheck=1 gpgkey=https://yum.dockerproject.org/gpg EOF sudo yum install docker-engine sudo systemctl enable docker.service sudo systemctl start docker sudo docker run --rm hello-world

 

 初始化和配置數據庫Docker

 這裏我作了docker volume,還有設置你的mysql root密碼,執行命令進入dockerdocker

sudo docker run --name platform-db -v /alidata/database:/var/lib/mysql/ -e MYSQL_ROOT_PASSWORD=your_root_password -p 3306:3306 mysql:5.7
sudo docker exec -it platform-db /bin/bash

 

 建立數據庫和用戶數據庫

CREATE DATABASE orange;
CREATE USER 'orange'@'%' IDENTIFIED BY 'orange';
GRANT ALL PRIVILEGES ON orange.* TO 'orange'@'%';

 

 執行數據庫初始化腳本 ,初始化Orange數據庫centos

初始化和配置Orange Docker

 直接使用我發佈的docker鏡像 cbcye/orange5api

sudo docker run -d --name orange \
    --link platform-db:orange-database \
    -p 7777:7777 \
    -p 8888:8888 \
    -p 9999:9999 \
    --security-opt seccomp:unconfined \
    cbcye/orange5

 

 編輯配置文件

sudo docker exec -it platform-db /bin/bash

vi /usr/local/orange/orange.conf #修改數據庫鏈接信息
vi /usr/local/orange/conf/nginx.conf  #配置upstream server,真實api server

 重啓orange

sudo docker stop orange 
sudo docker start orange

 

 

Orange Gateway控制檯

訪問http://192.168.88.77:9999/ 用戶名:admin 密碼:orange_admin

至此環境搭建成功

 

配置與測試

啓用並編輯API重寫

將真實API地址/api/appdata 經過/appdata的方式暴露給外部請求

啓用與配置限速規則

一分鐘只容許2次請求

使用Postman進行測試

當請求超過限制的話則會提示HTTP錯誤,而真實的API Server不須要作任何操做

 

 

總結

如開頭所說,API Gateway做爲微服務重要的中間件,對原有API Server不須要改動或者改動很小就能實現,通用的功能也很容易整合,基於Nginx的OpenResty開發的Orange性能也能獲得保障。所以頗有必要使用API Gateway把開放的接口管理起來。歡迎留言拍磚或交流!

 

附實用技巧

#查看docker日誌
sudo docker logs <container_name>

#查看全部docker
sudo docker ps --all

#刪除 docker
sudo docker rm orange

#進入docker控制檯(container名稱:platform-db)
sudo docker exec -it platform-db /bin/bash #Orange日誌位置
/usr/local/orange/logs/

 

最近我發現國內出現了一個能夠直接使用的API網關產品(小豹API網關),相比開源產品,對企業使用起來更加方便,功能看起來比Orange的管理、監控更增強大,看網站介紹能夠用於微服務網關、API服務治理平臺、OpenAPI的網關。

相關文章
相關標籤/搜索