SpringCloud Zuul路由網關的使用介紹

Zuul概述

Zuul包含的對請求的路由和過濾兩個主要功能。
其中路由功能負責將外部請求轉發到具體的微服務實例上,是實現外部訪問統一入口的基礎,而過濾功能則負責對請求的處理過程進行干預,是實現請求校驗、服務聚合等功能的基礎。
ZuulEureka整合,將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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章