SpringCloud 嵌入式Zuul反向代理

2023-11-23 11:36 更新

Spring Cloud已創(chuàng)建嵌入式Zuul代理,以簡化UI應(yīng)用程序要對一個或多個后端服務(wù)進行代理調(diào)用的常見用例的開發(fā)。此功能對于用戶界面代理所需的后端服務(wù)很有用,從而避免了為所有后端獨立管理CORS和身份驗證問題的需求。

要啟用它,請用@EnableZuulProxy注釋Spring Boot主類。這樣做會導(dǎo)致將本地呼叫轉(zhuǎn)發(fā)到適當(dāng)?shù)姆?wù)。按照約定,ID為users的服務(wù)從位于/users的代理接收請求(前綴被去除)。代理使用Ribbon來定位要通過發(fā)現(xiàn)轉(zhuǎn)發(fā)到的實例。所有請求均在hystrix命令中執(zhí)行,因此失敗以Hystrix指標顯示。一旦電路斷開,代理就不會嘗試與服務(wù)聯(lián)系。

Zuul入門程序不包含發(fā)現(xiàn)客戶端,因此,對于基于服務(wù)ID的路由,您還需要在類路徑上提供其中之一(Eureka是一種選擇)。

要跳過自動添加服務(wù)的過程,請將zuul.ignored-services設(shè)置為服務(wù)ID模式的列表。如果服務(wù)與被忽略但已包含在顯式配置的路由映射中的模式匹配,則將其忽略,如以下示例所示:

application.yml。 

 zuul:
  ignoredServices: '*'
  routes:
    users: /myusers/**

在前面的示例中,除 users 外,所有服務(wù)均被忽略。

要增加或更改代理路由,可以添加外部配置,如下所示:

application.yml。 

 zuul:
  routes:
    users: /myusers/**

前面的示例意味著對/myusers的HTTP調(diào)用被轉(zhuǎn)發(fā)到users服務(wù)(例如,/myusers/101被轉(zhuǎn)發(fā)到/101)。

要對路由進行更細粒度的控制,可以分別指定路徑和serviceId,如下所示:

application.yml。 

 zuul:
  routes:
    users:
      path: /myusers/**
      serviceId: users_service

前面的示例意味著對/myusers的HTTP調(diào)用將轉(zhuǎn)發(fā)到users_service服務(wù)。路由必須具有可以指定為螞蟻樣式模式的path,因此/myusers/*僅匹配一個級別,而/myusers/**則分層匹配。

后端的位置可以指定為serviceId(用于發(fā)現(xiàn)服務(wù))或url(用于物理位置),如以下示例所示:

application.yml。 

 zuul:
  routes:
    users:
      path: /myusers/**
      url: https://example.com/users_service

這些簡單的url路由不會作為HystrixCommand來執(zhí)行,也不會使用Ribbon對多個URL進行負載均衡。為了實現(xiàn)這些目標,可以使用靜態(tài)服務(wù)器列表指定一個serviceId,如下所示:

application.yml。 

zuul:
  routes:
    echo:
      path: /myusers/**
      serviceId: myusers-service
      stripPrefix: true

hystrix:
  command:
    myusers-service:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: ...

myusers-service:
  ribbon:
    NIWSServerListClassName: com.netflix.loadbalancer.ConfigurationBasedServerList
    listOfServers: https://example1.com,http://example2.com
    ConnectTimeout: 1000
    ReadTimeout: 3000
    MaxTotalHttpConnections: 500
    MaxConnectionsPerHost: 100

另一種方法是指定服務(wù)路由并為serviceId配置Ribbon客戶端(這樣做需要在Ribbon中禁用Eureka支持- 有關(guān)更多信息,請參見上文),如下所示例:

application.yml。 

zuul:
  routes:
    users:
      path: /myusers/**
      serviceId: users

ribbon:
  eureka:
    enabled: false

users:
  ribbon:
    listOfServers: example.com,google.com

您可以使用regexmapperserviceId和路由之間提供約定。它使用正則表達式命名組從serviceId中提取變量,并將其注入到路由模式中,如以下示例所示:

ApplicationConfiguration.java。 

@Bean
public PatternServiceRouteMapper serviceRouteMapper() {
    return new PatternServiceRouteMapper(
        "(?<name>^.+)-(?<version>v.+$)",
        "${version}/${name}");
}

前面的示例意味著myusers-v1中的serviceId被映射到路由/v1/myusers/**??梢越邮苋魏握齽t表達式,但是所有命名組必須同時存在于servicePatternroutePattern中。如果

servicePatternserviceId不匹配,則使用默認行為。在前面的示例中,myusers中的serviceId被映射到/ myusers / **路由(未檢測到版本)。默認情況下,此功能是禁用的,僅適用于發(fā)現(xiàn)的服務(wù)。

要為所有映射添加前綴,請將zuul.prefix設(shè)置為一個值,例如/api。默認情況下,在轉(zhuǎn)發(fā)請求之前,將從請求中刪除代理前綴(您可以使用zuul.stripPrefix=false將此行為關(guān)閉)。您還可以關(guān)閉從單個路由中剝離特定于服務(wù)的前綴,如以下示例所示:

application.yml。 

 zuul:
  routes:
    users:
      path: /myusers/**
      stripPrefix: false
zuul.stripPrefix僅適用于zuul.prefix中設(shè)置的前綴。它對給定路由的path中定義的前綴沒有任何影響。

在前面的示例中,對/myusers/101的請求被轉(zhuǎn)發(fā)到users服務(wù)上的/myusers/101

zuul.routes條目實際上綁定到類型為ZuulProperties的對象。如果查看該對象的屬性,則可以看到它也有一個retryable標志。將該標志設(shè)置為true,以使Ribbon客戶端自動重試失敗的請求。當(dāng)您需要修改使用Ribbon客戶端配置的重試操作的參數(shù)時,也可以將該標志設(shè)置為true。

默認情況下,X-Forwarded-Host標頭被添加到轉(zhuǎn)發(fā)的請求中。要關(guān)閉它,請設(shè)置zuul.addProxyHeaders = false。默認情況下,前綴路徑被剝離,并且后端請求使用X-Forwarded-Prefix標頭(在前面顯示的示例中為/myusers)。

如果設(shè)置默認路由(/),則帶有@EnableZuulProxy的應(yīng)用程序可以充當(dāng)獨立服務(wù)器。例如,zuul.route.home: /會將所有流量(“ / **”)路由到“ home”服務(wù)。

如果需要更細粒度的忽略,則可以指定要忽略的特定模式。這些模式在路線定位過程開始時進行評估,這意味著模式中應(yīng)包含前綴以保證匹配。被忽略的模式跨越所有服務(wù),并取代任何其他路由規(guī)范。以下示例顯示了如何創(chuàng)建忽略的模式:

application.yml。 

 zuul:
  ignoredPatterns: /**/admin/**
  routes:
    users: /myusers/**

前面的示例意味著所有呼叫(例如/myusers/101)都被轉(zhuǎn)發(fā)到users服務(wù)上的/101。但是,包括/admin/在內(nèi)的呼叫無法解決。

 如果您需要保留路由的順序,則需要使用YAML文件,因為使用屬性文件時順序會丟失。以下示例顯示了這樣的YAML文件:

application.yml。 

 zuul:
  routes:
    users:
      path: /myusers/**
    legacy:
      path: /**

如果要使用屬性文件,則legacy路徑可能最終位于users路徑的前面,從而導(dǎo)致users路徑不可訪問。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號