溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Spring Cloud Zuul中路由配置的示例分析

發(fā)布時(shí)間:2021-08-20 12:20:17 來(lái)源:億速云 閱讀:134 作者:小新 欄目:編程語(yǔ)言

這篇文章將為大家詳細(xì)講解有關(guān)Spring Cloud Zuul中路由配置的示例分析,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

首先我們來(lái)回憶一下配置路由規(guī)則的那兩行代碼:

zuul.routes.api-a.path=/api-a/**
zuul.routes.api-a.serviceId=feign-consumer

我們說(shuō)當(dāng)我的訪問(wèn)地址符合/api-a/**規(guī)則的時(shí)候,會(huì)被自動(dòng)定位到feign-consumer服務(wù)上去,不過(guò)兩行代碼有點(diǎn)麻煩,我們可以用下面一行代碼來(lái)代替,如下:

zuul.routes.feign-consumer=/api-a/**

zuul.routes后面跟著的是服務(wù)名,服務(wù)名后面跟著的是路徑規(guī)則,這種配置方式顯然更簡(jiǎn)單。

如果映射規(guī)則我們什么都不寫,系統(tǒng)也給我們提供了一套默認(rèn)的配置規(guī)則,默認(rèn)的配置規(guī)則如下:

zuul.routes.feign-consumer.path=/feign-consumer/**
zuul.routes.feign-consumer.serviceId=feign-consumer

默認(rèn)情況下,Eureka上所有注冊(cè)的服務(wù)都會(huì)被Zuul創(chuàng)建映射關(guān)系來(lái)進(jìn)行路由,但是對(duì)于我這里的例子來(lái)說(shuō),我希望提供服務(wù)的是feign-consumer,hello-service作為服務(wù)提供者只對(duì)服務(wù)消費(fèi)者提供服務(wù),不對(duì)外提供服務(wù),如果使用默認(rèn)的路由規(guī)則,則Zuul也會(huì)自動(dòng)為hello-service創(chuàng)建映射規(guī)則,這個(gè)時(shí)候我們可以采用如下方式來(lái)讓Zuul跳過(guò)hello-service服務(wù),不為其創(chuàng)建路由規(guī)則:

zuul.ignored-services=hello-service

有的小伙伴可能為有疑問(wèn),我們定義路由規(guī)則/api-a/**的時(shí)候,為什么最后面是兩個(gè)*,一個(gè)可不可以呢?當(dāng)然可以,不過(guò)意義可就不一樣了,Zuul中的路由匹配規(guī)則使用了Ant風(fēng)格定義,一共有三種不同的通配符:

通配符含義舉例解釋
?匹配任意單個(gè)字符/feign-consumer/?匹配/feign-consumer/a,/feign-consumer/b,/feign-consumer/c等
*匹配任意數(shù)量的字符/feign-consumer/*匹配/feign-consumer/aaa,feign-consumer/bbb,/feign-consumer/ccc等,無(wú)法匹配/feign-consumer/a/b/c
**匹配任意數(shù)量的字符/feign-consumer/*匹配/feign-consumer/aaa,feign-consumer/bbb,/feign-consumer/ccc等,也可以匹配/feign-consumer/a/b/c

有的時(shí)候我們還會(huì)遇到這樣一個(gè)問(wèn)題,比如我有兩個(gè)服務(wù),一個(gè)叫做feign-consumer,還有一個(gè)叫做feign-consumer-hello,此時(shí)我的路由配置規(guī)則可能這樣來(lái)寫:

zuul.routes.feign-consumer.path=/feign-consumer/**
zuul.routes.feign-consumer.serviceId=feign-consumer

zuul.routes.feign-consumer-hello.path=/feign-consumer/hello/**
zuul.routes.feign-consumer-hello.serviceId=feign-consumer-hello

此時(shí)我訪問(wèn)feign-consumer-hello的路徑會(huì)同時(shí)被這兩條規(guī)則所匹配,Zuul中的路徑匹配方式是一種線性匹配方式,即按照路由匹配規(guī)則的存儲(chǔ)順序依次匹配,因此我們只需要確保feign-consumer-hello的匹配規(guī)則被先定義feign-consumer的匹配規(guī)則被后定義即可,但是在properties文件中我們不能保證這個(gè)先后順序,此時(shí)我們需要用YAML來(lái)配置,這個(gè)時(shí)候我們可以刪掉resources文件夾下的application.properties,然后新建一個(gè)application.yml,內(nèi)容如下:

spring:
 application:
  name: api-gateway
server:
 port: 2006
zuul:
 routes:
  feign-consumer-hello:
   path: /feign-consumer/hello/**
   serviceId: feign-consumer-hello
  feign-consumer:
   path: /feign-consumer/**
   serviceId: feign-consumer
eureka:
 client:
  service-url:
   defaultZone: http://localhost:1111/eureka/

這個(gè)時(shí)候我們就可以確保先加載feign-consumer-hello的匹配規(guī)則,后加載feign-consumer的匹配規(guī)則。

上文我們說(shuō)了一個(gè)zuul.ignored-services=hello-service屬性可以忽略掉一個(gè)服務(wù),不給某個(gè)服務(wù)設(shè)置映射規(guī)則,這個(gè)配置我們可以進(jìn)一步細(xì)化,比如說(shuō)我不想給/hello接口路由,那我們可以按如下方式配置(后面我都用yaml配置):

zuul:
 ignored-patterns: /**/hello/**

此時(shí)訪問(wèn)/hello接口就會(huì)報(bào)404錯(cuò)誤,同時(shí)我們也可以看到后臺(tái)打印如下日志:

Spring Cloud Zuul中路由配置的示例分析

此外,我們也可以統(tǒng)一的為路由規(guī)則增加前綴,設(shè)置方式如下:

zuul:
 prefix: /myapi

此時(shí)我們的訪問(wèn)路徑就變成了http://localhost:2006/myapi/feign-consumer/hello1。

一般情況下API網(wǎng)關(guān)只是作為系統(tǒng)的統(tǒng)一入口,但是有的時(shí)候我們可能也需要在API網(wǎng)關(guān)上做一點(diǎn)業(yè)務(wù)邏輯操作,比如我現(xiàn)在在api-gateway項(xiàng)目中新建如下Controller:

@RestController
public class HelloController {
  @RequestMapping("/local")
  public String hello() {
    return "hello api gateway";
  }
}

我希望用戶在訪問(wèn)/local時(shí)能夠自動(dòng)跳轉(zhuǎn)到這個(gè)方法上來(lái)處理,那么此時(shí)我們需要用到Zuul的本地跳轉(zhuǎn),配置方式如下:

zuul:
 prefix: /myapi
 ignored-patterns: /**/hello/**
 routes:
  local:
   path: /local/**
   url: forward:/local

此時(shí)訪問(wèn)http://localhost:2006/myapi/local結(jié)果如下:

Spring Cloud Zuul中路由配置的示例分析

我們?cè)谑褂肗ginx的時(shí)候,會(huì)涉及到一個(gè)請(qǐng)求頭信息的配置,防止頁(yè)面重定向后跳轉(zhuǎn)到上游服務(wù)器上去,這個(gè)問(wèn)題在Zuul中一樣存在,假設(shè)我的feign-consumer中提供了一個(gè)接口/hello4,當(dāng)訪問(wèn)/hello4接口的時(shí)候,頁(yè)面重定向到/hello,默認(rèn)情況下,重定向的地址是具體的服務(wù)實(shí)例的地址,而不是API網(wǎng)關(guān)的跳轉(zhuǎn)地址,這種做法會(huì)暴露真實(shí)的服務(wù)地址,所以需要在Zuul中配置,配置方式很簡(jiǎn)單,如下:

zuul:
 add-host-header: true

表示API網(wǎng)關(guān)在進(jìn)行請(qǐng)求路由轉(zhuǎn)發(fā)前為請(qǐng)求設(shè)置Host頭信息。

默認(rèn)情況下,敏感的頭信息無(wú)法經(jīng)過(guò)API網(wǎng)關(guān)進(jìn)行傳遞,我們可以通過(guò)如下配置使之可以傳遞:

zuul:
 routes:
  feign-consumer:
   sensitiveHeaders:

在Zuul中,Ribbon和Hystrix的配置還是和之前的配置方式一致,這里我就不贅述了,如果我們想關(guān)閉Hystrix重試機(jī)制,可以通過(guò)如下方式:

關(guān)閉全局重試機(jī)制:

zuul:
 retryable: false

關(guān)閉某一個(gè)服務(wù)的重試機(jī)制:

zuul:
 routes:
  feign-consumer:
   retryable: false

關(guān)于“Spring Cloud Zuul中路由配置的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI