最近部門要開發一個簡單的APP,部分數據是現有項目已經存在的,為了方便維護,希望只提供一個交互的入口,並且協議的規則不變。
基於這個需求,有兩套解決方案:
1.用代碼將現有的api封裝一層,對請求數據和返回數據不做任何改變,只是中轉,然后和新的數據接口一起部署在一個項目里;
2.用IIS進行請求轉發,調用現有接口回應請求,剩余部分開發新的api,部署在一個項目里,用URL Rewrite進行過濾分發。
第一個方案很傳統,沒什么好評價的,這里主要講一下第二種方案的實現,第二個方案的好處是可以節省時間成本,需要依賴IIS插件(Application Request Routing + URL Rewrite)。
先下載ARR 和 URL Rewrite 進行安裝,使用過程中發現ARR對IIS的“目錄瀏覽”功能有依賴(未驗證,如果無法使用,可以查看一下是否安裝了“目錄瀏覽”功能):
http://www.iis.net/downloads/microsoft/application-request-routing#additionalDownloads
http://www.iis.net/downloads/microsoft/url-rewrite#additionalDownloads
安裝好插件,重新打開IIS
雙擊IIS根目錄
雙擊Application Request Routing Cache
雙擊右邊的 Server Proxy Settings
勾上 Enable proxy
取消勾選“Reverse rewrite host in response headers”,否則所有的響應內容的host都會被重寫為當前站點域名,簡單來講,最直接的影響就是對外部站點的重定向都會失敗,所以這里取消勾選。
點擊“應用”后,新建一個站點,用來接受請求做轉發
雙擊站點,雙擊 URL Rewrite -> Add Rules(新建規則) -> Blank rule(空白規則)
Name:填寫你的規則名稱
Match URL 是匹配Requested URL的規則
http://www.test.com?name=michael&age=30
host: www.test.com
requested url: ?name=michael&age=30
query string: name=michael&age=30
Requested URL 選擇 Matches the Pattern (匹配符合規則的url)
Using 選擇 Regular Expressions (使用正則表達式來匹配)
Pattern 里填寫 ^(.*) 這里不對正則表達式做講解,有需要的可以自己了解。
勾選 Ignore case 忽略大小寫
展開 Conditions 條件篩選
Logical grouping 選擇 Match Any
Match All 是列表中所有規則都要匹配才符合(與)
Match Any 是列表中有一個規則匹配就算符合(或)
track capture group across conditions 跟蹤捕獲組,這個功能跟正則有關,這里不需要不勾選,可以查詢關鍵詞 capture group 自行了解詳情
點擊 Add 添加條件
Condition input 填寫 {HTTP_HOST} ,HTTP_HOST 代表請求頭里的host,就是上面例子里的 www.test.com 部分, 更多可過濾條件查詢 Server Variables 自行了解
Check if input string 選擇 Matches the Pattern
Pattern 填寫 ^arrtest.com$ ,這里的意思是如果host是 arrtest.com 則匹配通過,例:http://arrtest.com?asdf=1234
如果這里填寫的是 ^www.arrtest.com$ ,則匹配 http://www.arrtest.com?asdf=1234
勾選 Ignore case 忽略大小寫
雙擊展開 Action 部分
Action type 選擇 Rewrite 重寫轉發
Rewrite URL 里填寫 https://cn.bing.com/{R:1} 轉發目標地址, {R:1} 代表 Match URL 部分匹配到的 Request URL
勾選 Append query string 追加查詢字符串
到此配置結束,保存這個規則,在瀏覽器訪問 http://arrtest.com/search?q=測試 就等同於訪問 https://cn.bing.com/search?q=測試
為了防止該站點下的其他接口被這個規則無腦轉發,我們需要新增一個轉發條件
現有的需要轉發的 API 格式如下 http://arrtest.com?PROTOID=123456
其他接口是沒有 PROTOID 這個關鍵詞的,並且 PROTOID 后面的value都是數字,那么這里就用這個關鍵詞來過濾需要轉發的請求
再回到剛剛的 Conditions 部分,點 Add 新增條件
Condition input 填寫 {QUERY_STRING}
Check if input string 選擇 Matches the Pattern
Pattern 填寫 PROTOID=\d+ 這個規則的意思是,匹配查詢字符串為 PROTOID 開頭參數值為數字的請求(例:http://arrtest.com/?PROTOID=456789)
勾選 Ignore case 忽略大小寫
確定保存,修改 匹配邏輯為 Match All (與),列表內所有的規則都匹配,請求才會通過
現在只有 QueryString 為 PROTOID 開頭參數值為數字的請求才會被轉發了
例子:http://arrtest.com/search?PROTOID=4564&q=測試 => http://cn.bing.com/search?PROTOID=4564&q=測試
http://arrtest.com/search?q=測試&PROTOID=4564 則不會被轉發
至此請求轉發的功能就實現了,除此之外,強大的 ARR + URL Rewrite 還可以實現高可用負載均衡。