著做權歸做者全部,任何形式的轉載都請聯繫做者得到受權並註明出處。
Zuul網關和基本應用場景
API網關是如何演化出來的?
看下面這幅圖:java
- 單體應用:瀏覽器發起請求,請求直接打到單體應用所在的機器上,應用從數據庫查詢數據原路返回給瀏覽器,對於單體應用來講,它只有一個,不須要網關。
- 微服務:微服務的應用可能部署在不一樣機房,不一樣地區,不一樣域名下。此時客戶端(瀏覽器/手機/軟件工具)想要請求對應的服務,都須要知道機器的具體的IP或者域名URL,當微服務實例衆多時,這是難以記憶的。此時就有了網關,客戶端相關的請求直接發送到網關,由網關根據請求標識解析判斷出具體的微服務ip,再把請求轉發到微服務實例。這其中的記憶功能就所有交由網關來操做了。
API網關基本功能
網關究竟是幹嗎的?有什麼用呢?關於網關的功能請看下圖:數據庫
這裏重點介紹Netflix Zuul網關 主要是由於:
- 可動態發佈的過濾器機制
- 同時也被集成入Spring Cloud體系
zuul 在 Netflix的使用狀況(2017)瀏覽器
同時在國內也有不少優秀的應用案例,好比:
Zuul網關高級應用場景
紅綠部署
如圖右側, 有紅綠2個顏色的服務集羣,從中能夠看出綠色是v1版本,紅色是v2版本。能夠經過網關控制客戶端請求具體請求到紅色仍是綠色的服務實例。bash
開發者測試分支
同上邏輯相似,經過網關配置將請求轉發到test環境是服務實例。服務器
埋點測試
同上邏輯相似,經過網關配置將請求轉發到有埋點的環境服務實例。架構
壓力測試
同上邏輯,不影響生產服務實例狀況下,網關配置控制部分客戶端請求或擬造請求到壓力測試環境的服務實例。ide
調試路由
客戶端有多種不一樣的設備,經過網關配置,能夠將制定的設備請求路由轉發到指定環境的服務實例。微服務
金絲雀測試
粘性金絲雀
失敗注入測試
降級測試
相關測試概念參考
金絲雀發佈、滾動發佈、藍綠髮布到底有什麼差異?關鍵點是什麼?
跨區域的高可用
如圖所示:當請求打到US-West-2
機器是,該機器內的服務實例掛了,但網關能夠正常運行,能夠經過配置網關,在請求服務實例返回失敗的時候,主動再將請求轉發到其它服務所在的機器上的網關繼續處理,也就是zuul網關集羣實現高可用。工具
防爬防攻擊
健康檢查和屏蔽壞節點
Zuul網關架構剖析
Zuul網關架構
- Zuul Servlet:zuul的servlet容器
- Zuul Filter Runner:zuul執行filter的處理器
- Pre routing Filter:zuul請求的前置過濾器
- Routing Filter:zuul請求的路由放行過濾器
- Post routing Filter:zuul請求的後置過濾器
- Request Context:zuul servlet的上下文
- Filter Loader:filter加載器
- Filter File Manager:filter內容管理器
- Filter Directory:filter過濾器存放路徑
- Filter Publisher:發佈filter的處理類
- Filter Persister:持久化filter的處理類
- Filter Poller:輪詢Persister中的filter並將新filter推送至Filter Directory
請求處理生命週期
- http發送請求到zuul網關
- zuul網關首先通過pre filter;
- 驗證經過後進入routing filter,接着將請求轉發給遠程服務,遠程服務執行完返回結果,若是出錯,則執行error filter;
- 繼續往下執行post filter;
- 最後返回響應給http 客戶端。
過濾器關鍵概念
- 類型Type: 定義在路由流程中,過濾器被應用的階段
- 執行順序Execution Order: 在同一個Type中,定義過濾器執行的順序
- 條件Criteria: 過濾器被執行必須知足的條件
- 動做Action: 若是條件知足,過濾器中將被執行的動做
zuul中的過濾器類型
- PRE:在請求被路由到源服務器前要執行的過濾器
- ROUTING:處理將請求發送到源服務器的過濾器
- POST:在響應從源服務器返回時要被執行的過濾器
- 對響應增長HTTP頭
- 收集統計和度量
- 將響應以流的方式發送回客戶端
- ERROR:上述階段中出現錯誤要執行的過濾器
過濾器樣例Demo
import javax.servlet.http.HttpServletRequest;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
public class PreFilter extends ZuulFilter {
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 1;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
System.out.println("Request Method : " + request.getMethod() + " Request URL : " + request.getRequestURL().toString());
return null;
}
}
複製代碼
統一Filter管理界面
由於zuul有可動態發佈的過濾器機制,全部能夠有一個頁面來管理zuul網關的過濾器,使得網關的可定製性,可變性更強大。post