1. 程式人生 > >八、springcloud之服務網關zuul

八、springcloud之服務網關zuul

均衡器 main ati string pri 不可 部分 框架 結合

一、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類型的過濾器

,再執行route類型的過濾器,最後執行的是post 類型的過濾器,如果在執行這些過濾器有錯誤的時候則會執行error類型的過濾器。執行完這些過濾器,最終將請求的結果返回給客戶端。 

  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