一、爲什麼要使用微服務網關
不同的微服務一般會有不同的網絡地址,而外部客戶端可能需要調用多個服務的接口才能完成一個業務需求。如:一個電影購票的手機APP,可能會調用多個微服務,才能完成一次購票的業務流程。如果讓客戶端直接與各個微服務通信,會有以下的問題:
1、客戶端會多次請求不同的微服務,增加了客戶端的複雜性;
2、存在跨域請求,在一定場景下處理相對複雜;
3、認證複雜,每個服務都需要獨立認證;
4、難以重構,隨着項目的迭代,可能需要重新劃分微服務,如果客戶端直接與微服務通信,那麼重構將會很難實施;
5、某些微服務可能使用了防火牆/瀏覽器不友好的協議,直接訪問會有一定的困難。
以上問題可藉助微服務網關解決,微服務網關是介於客戶端和服務端之間的中間層,所有的外部請求都會先經過微服務網關,然後由微服務網關請求各個微服務。
微服務網關封裝了應用程序的內部結構,客戶端只須跟網關交互,而無須直接調用特定微服務的接口,這樣,開發就可以得到簡化。不僅如此,使用微服務網關還有以下優點:
1、易於監控。可在微服務網關收集監控數據並將其推送到外部系統進行分析;
2、易於認證。可在微服務網關上進行認證,然後再將請求轉發到後端的微服務,而無須再每個微服務中進行認證;
3、減少了客戶端與各個微服務之間的交互次數。
二、Zuul簡介
Zuul是Netflix開源的微服務網關,它可以和Eureka、Ribbon、Hystrix等組件配合使用。
Zuul的核心是一系列的過濾器,這些過濾器可以完成以下功能:
1、身份認證與安全:識別每個資源的驗證要求,並拒絕那些與要求不符的請求;
2、審查與監控:在邊緣位置追蹤有意義的數據和統計結果,從而帶來精確的生產視圖;
3、動態路由:動態地將請求路由到不同的後端集羣;
4、壓力測試:逐漸增加指向集羣的流量,以瞭解性能;
5、負載分配:爲每一種負載類型分配對應容量,並棄用超出限定值的請求;
6、靜態響應處理:在邊緣位置直接建立部分響應,從而避免其轉發到內部集羣;
7、多區域彈性:跨域AWS Region進行請求路由。
Spring Cloud對Zuul進行了整合與增強。目前,Zuul使用的默認HTTP客戶端是Apache HTTP Client。
三、編寫一個Zuul微服務網關
1、添加依賴
<!-- zuul --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> </dependency>
2、在啓動類上添加@EnableZuulProxy註解,聲明一個Zuul代理,改代理使用Ribbon來定位註冊在Eureka Server中的微服務;同時,改代理還整合了hystrix,所有經過Zuul的請求都會在Hystrix命令中執行。
3、編寫application.yml
spring: profiles: active: - dev application: name: microservice-gateway-zuul eureka: client: service-url: defaultZone: http://liuy2:5010/eureka/ # 設置與Eureka Server交互的地址,查詢服務和註冊服務都需要依賴這個地址,多個用逗號分隔 instance: prefer-ip-address: true --- spring: profiles: active: dev server: port: 5016
這樣,一個簡單的微服務網關就編寫完成了。這裏僅是添加了Zuul的依賴,並將Zuul註冊到Eureka Server上。
四、測試
4.1、測試路由規則
1、依次啓動eureka-server(4010)、provide-user(4011)、hystrix-consumer-movie(5012)、microservice-gateway-zuul(5016)
2、訪問http://localhost:5016/hystrix-consumer-movie/user/1,請求會被轉發到http://localhost:5012/user/1
3、訪問http://localhost:5016/provide-user/1,請求會被轉發到http://localhost:4011/1
總結:
說明默認情況下,Zuul會代理所有註冊到Eureka Server的微服務,並且Zuul的路由規則如下:http://ZUUL_HOST:ZUUL_PORT/微服務在Eureka上的serviceId/**會被轉發到serviceId對應的微服務。
4.2、測試Hystrix容錯與監控
1、依次啓動eureka-server(4010)、provide-user(4011)、hystrix-consumer-movie(5012)、microservice-gateway-zuul(5016)、hystrix-dashboard(5013)
2、訪問http://localhost:5016/hystrix-consumer-movie/user/1,可以獲取正常用戶數據
3、關閉provide-user微服務,再訪問http://localhost:5016/hystrix-consumer-movie/user/1
4、訪問http://localhost:5013/hystrix.stream進入Hystrix Dashboard頁面,在URL欄輸入http://localhost:5016/hystrix.stream,隨意指定一個title,點擊monitor Stream按鈕。
總結:說明Zuul已經整合了Hystrix。