SpringCloud入坑記-Zuul 初探

在這裏插入圖片描述

簡介(是什麼)

服務拆分,使得原本清晰的業務線不那麼明朗了,各個服務散落在不同角落,爲了實現一個具體的業務邏輯,可能調用多個不同的服務,此時需要一個面向服務治理的組件——網關,Zuul就是在這種場景下誕生的。

在沒有引入網關時,用戶的請求的一個購買請求需要調用多個微服務。

在這裏插入圖片描述

此時可能遇到的問題:

  • 請求由客戶端(網頁、APP)控制,對其來說稍顯複雜
  • 需要解決跨域問題
  • 很多服務需要認證授權

在引入網關後,用戶請求直達網關,由網關決定之後的請求分發到哪個微服務。

在這裏插入圖片描述

此時帶來的好處:

  • 請求由後端控制,易於監控
  • 認證、鑑權、登錄一步搞定

Zuul is the front door for all requests from devices and web sites to the backend fo the Netflix streaming application.

Zuul像網站後端應用的前門,其底層是Servlet,本質是過濾器,從代碼層面看是一系列Filter所構成的責任鏈。

案例(怎麼用)

創建項目ms-g1-zuul,添加網關依賴:

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>

添加註解:

@EnableZuulProxy

添加配置:

server:
  port: 10070
spring:
  application:
    name: zuul-server
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka
zuul:
  routes:
    product:
      path: /product/**
      serviceId: product-service

這裏Zuul網關的端口爲 10070,項目名爲zuul-server。
關於zuul的配置在最後幾行:

  • product 我起的路由名稱
  • path 表示將所有 /product開頭的請求做URL映射
  • serviceId 即服務名稱

依次啓動3個項目:

  • ms-a1-eureka-server 註冊中心
  • ms-c1-product-service 服務提供者
  • ms-g1-zuul 網關服務

路由配置

路由規則在實際項目中可能非常複雜,Zuul提供了多種方式來進行路由配置。

基礎配置

zuul:
    routes:
        product-service: /product/**

product-service服務映射到 ‘/product’

忽略服務

zuul:
    ignored-services: product-service, user-service

這樣Zuul就不會處理被忽略的服務,而代理其他服務。

zuul:
    ignored-patterns: /**/delete/**

忽略某些接口,屏蔽掉服務中含有delete的接口。

路由指定服務

zuul:
    ignored-services: '*'
    routes:
        product-service: /product/**

這樣Zuul就只路由 product-service服務。

多個路由規則

zuul:
    routes:
        route-rule-a:
            serviceId: product-service
            path: /product/**
        route-rule-b:
            serviceId: user-service
            path: /user/**

這裏的route-rule-a只是一個名稱,沒有實際意義。

路由某個URL

zuul:
    routes:
        user-route:
            url: http://localhost:8080/
            path: /user/**

這裏不是路由某個服務,而是代理一個URL地址。

路由前綴

zuul:
    prefix: /ms-service
    strip-prefix: false
    routes:
        product-service: /product/**

在訪問Zuul服務 /ms-service/product-service/s1路徑時,請求會被轉發到product-service服務的/ms-service/s1

失敗重試

zuul:
    retryable: true  // 開啓重試機制
ribbon:
    MaxAutoRetries: 2  // 服務失敗重試次數
    MaxAutoRetriesNextServer: 1 //切換相同服務數量

某些場景下,開啓自動重試能提升用戶體驗。

配置說明

在上面的舉例中,映射路徑使用的是/product/**,還有其他幾種選項:

配置方式 說明 舉例
/** 匹配任意路徑 /product/add,/product/save,/product/id/123
/* 匹配單級路徑 /product/add,/product/save,/product/list
/? 匹配一個字符 /product/a,/product/s

未完待續

Zuul是外界進入微服務應用內部的入口,其原理不復雜,但是需要面對的業務場景太多,因此需要較好的擴展性,Zuul還給用戶暴露了更多了擴展能力,在下一節中將從Zuul的生命週期來探索更多可能。

項目代碼託管於Github

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章