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/