API網關


API網關

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

 

問題

 

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

 

 

 

解決方案

 

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

 

 

 

 

環境搭建

 

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

 

Vagrant CentOS環境搭建

 

提前安裝VirtualBox、Vagrant

 

vagrant init centos/7
vagrant up
vagrant ssh

 

編輯Vagrantfile,配置私有IP

 

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密碼,執行命令進入docker

 

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數據庫

 

初始化和配置Orange Docker

 

 直接使用我發布的docker鏡像 cbcye/orange5

 

復制代碼
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
復制代碼

 

 

 

 編輯配置文件

 

1
2
3
4
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

#Orange日志位置
/usr/local/orange/logs/
復制代碼

 

 


免責聲明!

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



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