天天看點

SpringCloud Zuul路由網關的使用介紹

Zuul概述

Zuul

包含的對請求的路由和過濾兩個主要功能。

其中路由功能負責将外部請求轉發到具體的微服務執行個體上,是實作外部通路統一入口的基礎,而過濾功能則負責對請求的處理過程進行幹預,是實作請求校驗、服務聚合等功能的基礎。

Zuul

Eureka

整合,将

zuul

自身注冊為

Eureka

服務治理下的應用,同時從

Eureka

中擷取其他微服務的消息,也就i是說以後通路微服務都要通過

Zuul

跳轉後獲得。

Zuul

最終也是要注冊進

Eureka

的。

Zuul

主要提供:代理、路由、過濾三大功能。

Zuul的實作

通過上面的概述,我們可以了解到Zuul最終還是會注冊到Eureka中,是以,zuul的本質也可以看作一個eureka的服務

建立一個項目

1)引入依賴

<dependencies>
        <!-- 引入公用實體類依賴,引入api -->
        <dependency>
            <groupId>com.sc</groupId>
            <artifactId>springcloud-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!-- spring boot web啟動器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- Eureka依賴 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>
        <!-- Ribbon依賴 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>

        <!-- Hystrix依賴 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>

        <!-- Hystrix Dashboard依賴 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>

        <!-- 監控資訊 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <!-- Zuul依賴 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zuul</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>

        <!-- 熱部署依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
    </dependencies>
           

2)編寫配置檔案

server:
  port: 6527

spring:
  application:
    name: zuul

#Eureka 配置
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7003/eureka/
  instance:
    instance-id: zuul6527
    prefer-ip-address: false #false 隐藏服務的位址資訊,true顯示IP位址

#路由網關配置
zuul:
  routes: #配置微服務的通路别名
    mydept.serviceId: peo_user
    mydept.path: /mydept/**
  ignored-services: "*" # peo_user忽略微服務的真實名稱,不能以名稱通路,"*"隐藏全部服務
  prefix: /fyy #統一通路字首


info:
 app.name: fyy
 company.name: www.fyy.com
           

3)配置啟動類

@SpringBootApplication
@EnableZuulProxy
public class ZuuApplication {

    public static void main(String[] args) {
        SpringApplication.run(ZuuApplication.class,args);
    }

}
           

簡單三步,我們就實作了zuul統一網關的實作內建

Zuul配置詳解

  • 檢視 zuul 中配置好的路由和過濾器資訊

    當我們啟動了zuul 的網關之後,想知道目前zuul代理了那些路由,通路的路徑又是那些或者我們自己寫了一個zuul的filter,想知道它目前位于zuul的filter的那個位置時,該如何查詢

    通路路徑:

    http://網關位址:端口/routes 通路路由的簡單資訊

    http://網關位址:端口/routes?format=details 通路路由的詳細資訊

    http://網關位址:端口/filters 通路zuul中使用了那些過濾器

    yml配置

management:  
  security:  
    enabled: false  # 預設值是 true, 為true的話那麼頁面上可能會報沒有權限通路  
           
  • 忽略所有微服務或某些微服務
zuul:  
  ignored-services: "*" #忽略所有微服務
  ignored-services: product-provider,product-consumer-8201  #忽略某些微服務:(直接寫微服務的名字=>可以了解為spring.application.name的值,多個以都好分隔)
           
  • 路由指定的微服務
zuul:
  routes: #配置微服務的通路别名,一個map的key-value
    mydept.serviceId: peo_user
    mydept.path: /mydept/**
    ...
    ...
           
  • 通過path和url通路到具體的某台機器上
zuul:  
  routes:  
    product-provider:  
      path: /product/**  
      url: http://localhost:8202/ #url 裡面不可以寫多個url,通路不會作為 HystrixCommand 來進行通路
           
  • 脫離eureka進行通路,并使之具有負載均衡和隔離的機制等
ribbon:
	eureka:
		enabled: false #修改為false

zuul:
  routes: 
    product-provider: 
      path:
      serviceId:

baidu-oschina:
	ribbon:
		listOfServers: http://www.baidu.com/,https://gitee.com:443/
           
  • 轉發前是否去掉路由字首&添加統一路由字首
zuul:
  prefix: /fyy #統一通路字首
  strip-prefix: true #轉發前是否去掉路由字首 true:去掉;false:不去
           
  • 忽略某些路徑不進行路由
zuul:  
  ignored-patterns: /**/selectOne/**
           

@EnableZuulServer、@EnableZuulProxy兩個注解的差別

簡單的說

@EnableZuulProxy

@EnableZuulServer

的增強版,當Zuul與Eureka、Ribbon等元件配合使用時,我們使用

@EnableZuulProxy

@EnableZuulServer過濾器:

1)pre類型過濾器:

  • ServletDetectionFilter

    :該過濾器用于檢查請求是否通過Spring Dispatcher。檢查後,通過

    isDispatcherServletRequest

    設定布爾值
  • FormBodyWrapperFilter

    :解析表單資料,并為請求重新編碼
  • DebugFilter

    :顧名思義,調試用的過濾器,可以通過

    zuul.debug.request=true

    開啟該過濾器

    2)route類型過濾器

  • SendForwardFilter

    :該過濾器使用Servlet RequestDispatcher轉發請求,轉發位置存儲在

    RequestContext.getCurrentContext().get("forward.to")

    中,可以設定為

    zuul、routes、abc、path: /abc/**、url: forward:/abc

    ,然後通路

    $ZUUL_HOST:ZUUL_PORT/abc

    ,觀察該過濾器的執行過程。

    3)post類型過濾器

    SendResponseFilter

    :将Zuul所代理的微服務的響應寫入目前響應

    4)error類型過濾器

    SendErrorFilter

    :如果

    RequestContext.getThrowable()

    不為null,那麼預設就會轉發到/error,也可以設定

    error.path

    屬性修改預設的轉發路徑

@EnableZuulProxy過濾器:

如果使用注解

@EnableZuulProxy

,那麼除上述過濾器之外,Spring Cloud還會增加以下過濾器

1)pre類型過濾器

  • PreDecorationFilter

    :該過濾器根據提供的RouteLocator确定路由到的位址,以及怎樣去路由。該路由器也可為後端請求設定各種代理相關的header

    2)route類型過濾器

  • RibbonRoutingFilter

    :該過濾器使用Ribbon,Hystrix和可插拔的HTTP用戶端發送請求,該過濾器可使用不同的HTTP用戶端

    (1) Apache HttpClient:預設的HTTP用戶端

    (2)SquareupOkHttpClient v3:如需使用該用戶端,需保證

    com.squareup.okhttp3

    的依賴在classpath中,并設定

    ribbon.okhttp.enabled = true

    (3)Netflix Ribbon HTTP client:設定

    ribbon.restclient.enabled = true

    即可啟用該HTTP用戶端。需要注意的是,該用戶端有一定限制,例如不支援PATCH方法,另外,它有内置的重試機制
  • SimpleHostRoutingFilter

    :該過濾器通過Apache HttpClient向指定的URL發送請求。URL在

    RequestContext.getRouteHost()

源碼位址:下載下傳位址

繼續閱讀