服務網關
服務客戶端和被調用服務之間的中介,有了服務網關,服務客戶端永遠不會直接調用單個服務的url,而是將所有調用都放到服務網關之上。
作用:路由(靜態和動態)、驗證和授權、度量數據收集和日誌記錄
zuul
一個服務網關,非常容易通過spring cloud 註解 進行創建和使用。
zuul使用需要完成的3件事:
(1)建立一個zuul spring boot項目,並配置合適的maven依賴。
(2)使用spring cloud 註解 修飾這個spring boot項目,將其聲明爲zuul服務
(3)配置 zuul 以便 eureka 進行通信(可選)
依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
註解:
@EnableZuulProxy //加在啓動引導類上,使服務成爲一個Zuul服務器
@EnableZuulServer //該註解將創造一個zuul服務器,它不會加載任何zuul反向代理過濾器,也不會使用eureka進行服務發現
反向代理:
一箇中間服務器,它位於嘗試訪問資源的客戶端和資源本身之間。客戶端甚至不知道它正與代理之外的服務器進行通信。反向代理負責捕獲客戶端的請求,然後代表客戶端調用遠程資源。
zuul的核心是一個反向代理。
zuul路由映射機制:
通過(eureka)服務發現自動映射路由
無需配置,zuul根據服務ID自動路由請求(向eureka)(如果服務實例沒有在運行,zuul將不會公開該服務的路由)
通過(eureka)服務發現手動映射路由
可自定義路由映射,而不單純依賴eureka服務ID創建的自動路由(不管服務實例是否在運行,zuul仍會公開路由,如果調用不存的服務路由,則報500)
通過靜態URL手動映射路由
zuul可以路由那些不受eureka管理的服務
如何禁止zuul自動路由:
zuul:
ignored-services: 'organizationservice' // ignored-services參數可禁止自動路由,若要禁止所有自動路由,可將值設爲*
prefix: /api // 所有已定義的服務都將添加前綴/api
routes:
organizationservice: /organization/**
/api作用:api路由 和 內容路由 ??
靜態路由設置方法:
zuul:
routes:
xxxxxx: // zuul用於在內部識別服務的關鍵字
path: /xxxxxx/** // 靜態路由
url: http://ip:port // 已建立服務的靜態實例,將被直接調用,而不是通過eureka調用
zuul使用hystrix和ribbon,來幫助防止長時間運行的服務調用影響服務網關的性能,默認情況下,對於任何需要1s的時間(hystrix默認值)來處理請求的調用,zuul將終止報500.
參數:hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 2500 // 超時設置爲2.5s
如果需要爲特定服務設置hystrix超時,可以將需要被覆蓋超時的服務的eureka服務id 替換 上述參數中的 default
ribbon同樣有超時設置。ps:spring微服務實戰144頁
zuul 核心:過濾器 // 相當於servlet和aop
前置過濾器
在請求被髮送到目的地之前被調用 // 主要用於驗證請求合法性
後置過濾器
在請求發送到目的地,且響應回給客戶端後,被調用 // 主要用於記錄從目標服務返回的響應、處理錯誤、審覈敏感信息響應
路由過濾器
在發送給目的地前被攔截調用 // 可將服務在兩個新老版本間進行路由,能夠讓少量用戶體驗新功能
// 不會執行http重定向,而是會終止傳入的http請求,然後代表原始調用值調用路由
UserContextFilter 類是一個自定義的http servlet過濾器,它將關聯ID映射到UserContext類。
/* 點滴積累 */