Fizz 網關簡介
Fizz Gateway 是一個基於 Java開發的微服務網關,能夠實現熱服務編排、自動授權選擇、線上服務腳本編碼、在線測試、高性能路由、API審覈管理等目的,擁有強大的自定義插件系統可以自行擴展,並且提供友好的圖形化配置界面,能夠快速幫助企業進行API服務治理、減少中間層膠水代碼以及降低編碼投入、提高 API 服務的穩定性和安全性。
整體架構
Fizz網關的核心處理流程如上圖, 收到客戶端的請求後會經過一系列內置或自定義的過濾器,接着網關會自動判斷當前請求的接口是否是服務編排接口,如果是服務編排接口就根據配置文件創建一個pipeline,在服務編排的pipeline裏可以實現接口的串聯或並聯調用,可以對輸入和輸出的內容做數據轉換,字段映射,腳本處理等操作;如果不是服務編排接口則直接反向代理到後端服務,最後把響應結果返回給客戶端。
主要功能特性
- 集羣管理:Fizz網關節點是無狀態的,配置信息自動同步,支持節點水平拓展和多集羣部署。
- 服務編排:支持熱服務編排能力,支持前後端編碼,隨時隨地更新API。
- 負載均衡:支持round-robin負載均衡。
- 服務發現:支持從Eureka註冊中心發現後端服務器。
- 配置中心:支持接入apollo配置中心。
- HTTP反向代理:隱藏真實後端服務,支持 Rest API反向代理。
- 訪問策略:支持不同策略訪問不同的API、配置不同的鑑權等。
- IP黑白名單:支持配置IP黑白名單。
- 自定義插件:強大的插件機制支持自由擴展。
- 可擴展:簡單易用的插件機制方便擴展功能。
- 高性能:性能在衆多網關之中表現優異。
- 版本控制:支持操作的發佈和多次回滾。
- 管理後臺:通過管理後臺界面對網關集羣進行各項配置。
Fizz網關支持以上功能特性,跟其它網關不同的是,Fizz更加關注是的API的管理、二次開發和開發速度的提升,所以提供強大的插件機制支持自由擴展,提供熱服務編排能力,通過服務編排可以通過在線配置的方式快速生成一個新的接口。
安裝使用
安裝依賴
安裝以下依賴軟件:
- Redis 2.8或以上版本
- MySQL 5.7或以上版本
- Apollo配置中心 (可選)
- Eureka服務註冊中心
安裝MySQL
- 操作系統 CentOS 6.5
- MySQL 5.7.30
- 下載MySQL
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.30-1.el6.x86_64.rpm-bundle.tar
- 解壓
tar -xvf mysql-5.7.30-1.el6.x86_64.rpm-bundle.tar
- 安裝
sudo yum install mysql-community-{server,client,common,libs}-*
- 啓動
sudo service mysqld start
啓動成功會顯示以下信息:
[root@localhost ~]# sudo service mysqld start
Initializing MySQL database: [ OK ]
Starting mysqld: [ OK ]
- 初始密碼
sudo grep 'temporary password' /var/log/mysqld.log
- 使用初始密碼登錄
mysql -uroot -p
- 修改密碼
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!';
- 退出登錄
quit
安裝Redis 6.0.8
- 下載解壓並編譯
$ wget http://download.redis.io/releases/redis-6.0.8.tar.gz
$ tar xzf redis-6.0.8.tar.gz
$ cd redis-6.0.8
$ make
- 啓動redis
運行編譯後的文件:
$ src/redis-server
- 客戶端連接
$ src/redis-cli
redis> set foo bar
OK
redis> get foo
"bar"
安裝Apollo配置中心
說明: apollo是可選組件,如果不使用apollo可使用本地配置文件(application.yml), 如果不使用apollo可跳過此步驟。
安裝Eureka服務註冊中心
環境要求:
- JDK 1.8 或以上版本
- Tomcat 6.0.10 或以上版本 (如使用spring cloud已內置)
- 安裝JDK 1.8
1)下載JDK,如: jdk-8u192-linux-x64.tar.gz
tar -zxvf jdk-8u192-linux-x64.tar.gz
mv jdk1.8.0_192 /usr/local/
2)設置JDK環境變量,將下面內容追回到/etc/profile文件後面
JAVA_HOME=/usr/local/jdk/jdk1.8.0_192
JRE_HOME=$JAVA_HOME/jre
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
CLASSPATH=:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib/dt.jar
export JAVA_HOME JRE_HOME PATH CLASSPATH
3)執行以下命令全環境變量生效:
source /etc/profile
4)查看是否安裝成功
java -version
- 安裝eureka
1)使用IDE創建一個spring boot項目,如:sc-eureka-server
pom.xml:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
在啓動類上添加@EnableEurekaServer註解來啓用Euerka註冊中心功能:
@SpringBootApplication
@EnableEurekaServer
public class ScEurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(ScEurekaServerApplication.class, args);
}
}
application.properties配置文件:
spring.application.name=sc-eureka-server
server.port=8761
eureka.instance.hostname=localhost
eureka.client.registerWithEureka=false
eureka.client.fetchRegistry=false
eureka.server.enableSelfPreservation=false
2) maven構建並運行sc-eureka-server應用, 啓動後訪問地址http://localhost:8761/可以看到Eureka註冊中心的界面
3)把target/sc-eureka-server-1.0.0.jar傳到linux服務器上運行. (僅以單機部署爲例)
nohub java -jar sc-eureka-server-1.0.0.jar &
4)eureka客戶端的註冊地址爲:http://localhost:8761/eureka/ (替換localhost爲服務器的IP)
eureka.client.serviceUrl.defaultZone = http://localhost:8761/eureka/
安裝Fizz
管理後臺
從github的releases(https://github.com/wehotel/fizz-gateway-community/releases)下載 fizz-manager-professional 和 fizz-admin-professional 的安裝包
- 管理後臺服務端(fizz-manager-professional)
- 首次安裝執行
fizz-manager-professional-1.0.0-mysql.sql
數據庫腳本 - 將
application-prod.yml
、boot.sh
、fizz-manager-professional-1.0.0.jar
拷貝到/data/webapps/fizz-manager-professional
目錄下 - 修改
application-prod.yml
文件,將相關配置修改成部署環境的配置 - 修改
boot.sh
文件,將RUN_CMD
變量值修改成部署環境的JAVA實際路徑 - 執行
chmod +x boot.sh
命令給boot.sh
增加執行權限 - 執行
./boot.sh start
命令啓動服務,支持 start/stop/restart/status命令 - 服務啓動後訪問 http://IP:8000/fizz-manager (將IP替換成服務部署機器IP地址),使用超級管理員賬戶
admin
密碼Aa123!
登錄
- 管理後臺前端(fizz-admin-professional)
zip資源包解壓後,取文件夾【fizzAdmin】放置於服務器靜態數據存放目錄 如:/home/data/
nginx配置
server {
listen 9000;
server_name localhost:9000;
location / {
root /home/data/fizzAdmin;
}
location ^~ /api {
rewrite ^/api/(.*) /$1 break;
proxy_pass http://127.0.0.1:8000;
}
}
# 注:root中地址需與資源包存放目錄路徑一致
# 注:http://127.0.0.1:8000 爲管理後臺(fizz-manager-professional)的訪問地址
訪問地址
【資源部署服務器IP + 端口號】如:http://127.0.0.1:9000/
(端口號與nginx配置端口號一致)
fizz-gateway-community社區版
說明:如果使用apollo配置中心,可把application.yml文件內容遷到配置中心(apollo上應用名爲:fizz-gateway);使用不使用apollo可去掉下面啓動命令裏的apollo參數。
腳本啓動:
- 下載fizz-gateway-community的最新代碼,修改application.yml配置文件裏eureka、redis的配置,使用maven構建好並把構建好的fizz-gateway-community-1.0.0.jar和boot.sh放同一目錄
- 修改boot.sh腳本的apollo連接,JVM內存配置,
- 執行
./boot.sh start
命令啓動服務,支持 start/stop/restart/status命令
IDE啓動:
- 本地clone倉庫上的最新代碼
- 將項目fizz-gateway導入IDE
- 導入完成後設置項目啓動配置及修改application.yml配置文件裏eureka、redis的配置,在VM選項中加入
-Denv=dev -Dapollo.meta=http://localhost:66
(Apollo配置中心地址)
jar啓動:
- 本地clone倉庫上的最新代碼,修改application.yml配置文件裏eureka、redis的配置
- 在項目根目錄fizz-gateway-community下執行Maven命令
mvn clean package -DskipTests=true
打包 - 進入target目錄,使用命令
java -jar -Denv=DEV -Dapollo.meta=http://localhost:66 fizz-gateway-community-1.0.0.jar
啓動服務
網關訪問地址格式:
http://127.0.0.1:8600/proxy/[服務名]/[API Path]
服務編排
服務編排配置例子
假如我們已經有積分和優惠券兩個內部公共的微服務,現在我們要開發一個會員資產信息接口返回積分數和優惠券張數(積分服務和優惠券服務已分別有查詢積分數和券數量的接口),下面我們通過服務編排的方式實現這個會員資產接口
已有的積分和優惠券接口:
- 查詢會員積分接口
- 接口URL:http://points-service/points/getMebPoints
- 請求方法:GET
- 入參: 會員ID(memberId)
- 返回結果:{"code": 0, "msg": "ok", "data": {"points":12000}}
- 查詢會員優惠券數量接口
- 接口URL:http://coupon-service/coupon/getCouponCount
- 請求方法:GET
- 入參: 會員ID(memberId)
- 返回結果:{"code": 0, "msg": "ok", "data": {"count":3}}
我們要配置的會員資產信息接口:
請求方法:GET
入參: 會員ID(memberId)
返回結果:{"code": 0, "msg": "ok", "data": {"points": 12000, "coupons":3}}
新增一個服務
登錄管理後臺,打開服務編排->服務管理菜單,點擊新增按鈕新建一個服務:member-assets,這個服務可以理解爲我們平時的微服務。建好服務後就可以在這個服務下創建服務編排接口啦
新增服務編排接口
配置基礎信息
打開服務編排->接口列表菜單,點擊新增新建一個接口,在新增頁面裏選擇服務 member-assets, 填寫接口名稱,URL等必填信息
- 接口名稱:會員資產信息
- 方法:GET
- 路徑:/assets/getAssetsInfo
配置輸入
會員資產信息接口只需要一個會員ID的參數,我們只需配置一個Query參數
{
"type": "object",
"properties": {
"memberId": {
"type": "integer",
"title": "會員ID"
}
},
"required": [
"memberId"
]
}
配置步驟
因爲積分和優惠券之間沒有依賴關係,可以併發請求。只需配置一個step併發調用這兩個接口,每調用一個接口對應一個request
配置request1來調用會員積分接口
請求方法:選GET
默認URL:http://points-service/points/getMebPoints (因爲服務已註冊到eureka通過服務名調用即可,各個環境的URL都一樣,只需配置默認URL,各個環境的URL留空)
-
配置入參:因爲是GET請求只需配置Query參數,會員積分接口的入參(會員ID)要引用會員資產信息接口的入參(會員ID),可以通過引用值來實現
- 字段(即會員積分接口入參名):memberId
- 類型:選擇引用值
- 數據類型:number, 因爲會員資產信息接口和會員積分接口的入參都是memberId而且都是int類型,所以也可以不指定。如果會員資產信息接口的memberId是字段串類型,則須選number,這樣系統會自動做類型強轉
- 值:input.request.params.memberId (填寫引用的路徑即可,路徑規範可點問號icon查看或查看官方使用文檔)
配置響應:因爲接口返回的結果簡單不需要做字段映射或數據轉換,所以不配置。
配置request2來調用會員優惠券數量接口
- 請求方法:選GET
- 默認URL:http://coupon-service/coupon/getCouponCount (因爲服務已註冊到eureka通過服務名調用即可,各個環境的URL都一樣,只需配置默認URL,各個環境的URL留空)
- 配置入參:因爲是GET請求只需配置Query參數,會員優惠券數量接口的入參(會員ID)要引用會員資產信息接口的入參(會員ID),可以通過引用值來實現
- 字段(即會員積分接口入參名):memberId
- 類型:選擇引用值
- 數據類型:number, 因爲會員資產信息接口和會員優惠券數量接口的入參都是memberId而且都是int類型,所以也可以不指定。如果會員資產信息接口的memberId是字段串類型,則須選number,這樣系統會自動做類型強轉
- 值:input.request.params.memberId (填寫引用的路徑即可,路徑規範可點問號icon查看或查看官方使用文檔)
- 配置響應:因爲接口返回的結果簡單不需要做字段映射或數據轉換,所以不配置。
配置步驟結果留空即可,對於有多步驟的複雜接口
配置輸出
輸出指的是會員資產信息接口的響應,我們要配置以下格式的響應報文
{
"code": 0,
"msg": "ok",
"data": {
"points": 12000,
"coupons": 3
}
}
- 配置小知識
- 響應體和請求體的字段支持多級的寫法,如: data.points
- 字段映射,如:data.coupons 取的是step1裏request2的響應body裏的data.count的值,這樣配置就自動完成了coupons到count的字段映射
- 當類型爲固定值時數據類型爲必填,因爲要明確告訴程序後面填寫的值是什麼類型
配置路由
會員資產信息接口配置好後,還需要配置路由才能通過網關來訪問(前提:配置好的接口需要發佈到網關,目前會員資產信息接口仍是未發佈狀態),路由不僅可以用來反向代理服務編排的接口,也可以反向代理其它微服務的接口,更多路由的功能可參考官方文檔。
配置步驟說明:
- 在路由管理裏新增路由
- 網關分組:選擇默認分組 (一個大網關集羣可以根據需要分成不同分組,一般情況下只用默認分組就足夠了,關於分組的用法可查看官方使用文檔)
- 服務:填寫服務名 member-assets
- 訪問:允許
- 其它可選項不配置,這樣整個服務都允許通過網關來訪問了。也可以根據需要按接口路徑來配置只暴露部分接口,同時也可指定此路由只能由指定的應用(調用方appid)來訪問
- 插件:可以爲路由添加各種插件,如:會員登錄態校驗等。此例子只做簡單的演示就不配置了
測試
接口配置好後可以在發佈前通過測試功能來驗收是否正確, 點擊編輯接口,在編輯頁面的右上角點擊測試按鈕進到測試頁面,一個類似postman的測試工具,填寫參數進行測試
發佈
Fizz提供了一套發佈申請審覈流程來保證接口的安全,只把權限分配給有需要的人員。在開發環境爲了方便我使用超級管理員賬號進行發佈申請和審覈。步驟如下:
- 在發佈申請-我的申請頁面或服務編排的接口列表頁面,點擊"發佈|下線申請"
- 添加要發佈的接口,選擇會員資產信息接口
- 填寫標題、類型和申請原因等
- 選擇審覈人選擇超級管理員,提交申請
- 在待審覈列表裏審覈上一次提交的申請單
- 審覈通過後在我的申請頁面查看申請單詳情,點擊發布即可
- 發佈後可以通過網關來訪問接口,如: http://127.0.0.1:8600/proxy/member-assets/assets/getAssetsInfo?memberId={填寫會員ID}
結束
通過一個簡單的例子體驗了Fizz網關的服務編排和路由功能,服務編排功能可以取代很多數據聚合類型的接口,這類型接口的業務邏輯少一般只按需聚合頁面所需的數據和做簡單的數據轉換,通過可視化界面簡單配置一下即可完成以前要花一兩天才能開發完的接口,節省了開發時間和機器成本。