八、springcloud之服務網關zuul
一、Zuul簡介
- zuul 是netflix開源的一個API Gateway 服務器, 本質上是一個web servlet應用。
- Zuul是Netflix出品的一個基於JVM路由和服務端的負載均衡器。
- Zuul 在雲平臺上提供動態路由,監控,彈性,安全等邊緣服務的框架。Zuul 相當於是設備和 Netflix 流應用的 Web 網站後端所有請求的前門。
- zuul的例子可以參考 netflix 在github上的 simple webapp,可以按照netflix 在github wiki 上文檔說明來進行使用。
- Spring Cloud Zuul路由是微服務架構的不可或缺的一部分,提供動態路由,監控,彈性,安全等的邊緣服務。
- Spring Cloud Zuu默認和Ribbon結合實現了負載均衡的功能。
二、zuul的工作原理
zuul的核心是一系列的filters, 其作用可以類比Servlet框架的Filter,或者AOP。
zuul把Request route到 用戶處理邏輯 的過程中,這些filter參與一些過濾處理,比如Authentication,Load Shedding等。
com.netflix.zuul.http.ZuulServlet是ZuulFilter鏈執行的入口,通過service方法,提取請求到RequestContext,然後通過調用ZuulRunner,依次按順序執行每種類型的Filter,完成整個Filter的生命周期,架構圖如下所示。
在zuul中, 整個請求的過程是這樣的,首先將請求給zuulservlet處理,zuulservlet中有一個zuulRunner對象,該對象中初始化了RequestContext:作為存儲整個請求的一些數據,並被所有的zuulfilter共享。zuulRunner中還有 FilterProcessor,FilterProcessor作為執行所有的zuulfilter的管理器。FilterProcessor從filterloader 中獲取zuulfilter,而zuulfilter是被filterFileManager所加載,並支持groovy熱加載,采用了輪詢的方式熱加載。有了這些filter之後,zuulservelet首先執行的Pre類型的過濾器
Zuul大部分功能都是通過過濾器來實現的。Zuul中定義了四種標準過濾器類型,這些過濾器類型對應於請求的典型生命周期。
(1) PRE:這種過濾器在請求被路由之前調用。我們可利用這種過濾器實現身份驗證、在集群中選擇請求的微服務、記錄調試信息等。
(2) ROUTING:這種過濾器將請求路由到微服務。這種過濾器用於構建發送給微服務的請求,並使用Apache HttpClient或Netfilx Ribbon請求微服務。
(3) POST:這種過濾器在路由到微服務以後執行。這種過濾器可用來為響應添加標準的HTTP Header、收集統計信息和指標、將響應從微服務發送給客戶端等。
(4) ERROR:在其他階段發生錯誤時執行該過濾器。
zuul的原理生命周期:https://www.cnblogs.com/lexiaofei/p/7080257.html
源碼解析:
https://blog.csdn.net/forezp/article/details/76211680(可以增加做日誌處理)
http://xujin.org/sc/sc-zuul-s2/
三、zuul入門使用
1、添加依賴
引入spring-cloud-starter-zuul
包
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> </dependency>
2、配置文件
應用名、服務端口等
spring.application.name=gateway-service-zuul
server.port=8888
#這裏的配置表示,訪問/it/** 直接重定向到http://www.baidu.com/**
zuul.routes.baidu.path=/it/**
zuul.routes.baidu.url=http://www.baidu.com/
3、啟動類
啟動類添加@EnableZuulProxy
,支持網關路由。
@SpringCloudApplication @EnableZuulProxy public class GatewayServiceZuulApplication { public static void main(String[] args) { SpringApplication.run(GatewayServiceZuulApplication.class, args); } }
註:這裏用了@SpringCloudApplication
註解,之前沒有提過,通過源碼我們看到,它整合了@SpringBootApplication
、@EnableDiscoveryClient
、@EnableCircuitBreaker
,主要目的還是簡化配置。
八、springcloud之服務網關zuul