溫馨提示×

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

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

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

發(fā)布時(shí)間:2021-12-24 10:29:58 來(lái)源:億速云 閱讀:190 作者:小新 欄目:云計(jì)算

這篇文章主要為大家展示了“Spring Cloud中Zuul路由配置的示例分析”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Spring Cloud中Zuul路由配置的示例分析”這篇文章吧。

Zuul路由配置

        路由配置看似簡(jiǎn)單,但也有部分的規(guī)則需要說(shuō)明,小節(jié)以前面搭建的集群項(xiàng)目為基礎(chǔ),講解Zuul的路由配置。

簡(jiǎn)單路由

        Spring Cloud在Zuul的“routing”階段實(shí)現(xiàn)了幾個(gè)過(guò)濾器,這些過(guò)濾器決定如何進(jìn)行路由工作。其中,最基本的就是SimpleHostRoutingFilter,該過(guò)濾器運(yùn)行后,會(huì)將HTTP請(qǐng)求全部轉(zhuǎn)發(fā)到“源服務(wù)”(HTTP服務(wù)),本書(shū)將其稱為簡(jiǎn)單路由,本章7.2小節(jié)的例子,實(shí)際上就是使用了簡(jiǎn)單路由進(jìn)行請(qǐng)求轉(zhuǎn)發(fā)。以下為簡(jiǎn)單路由的配置,同時(shí)使用了path與url:

zuul: 
  routes:
    routeTest:
      path: /routeTest/163
      url: http://www.163.com

        以上的配置,訪問(wèn)“http://localhost:8080/reuteTest/163”,將會(huì)跳轉(zhuǎn)到163網(wǎng)站。為了配置簡(jiǎn)便,可以省略path,默認(rèn)情況下使用routeId作為path,以下的配置省略了path配置:

zuul: 
  routes:
    route163:
      url: http://www.163.com

        訪問(wèn)“http://localhost:8080/route163”,同樣會(huì)路由到163網(wǎng)站。實(shí)際上,要觸發(fā)簡(jiǎn)單路由,配置的url的值,需要以“http:”或者“https:”字符串打頭。以下的配置,不能觸發(fā)簡(jiǎn)單路由。

zuul: 
  routes:
    noRoute163:
      url: www.163.com

        簡(jiǎn)單路由的過(guò)濾器SimpleHostRoutingFilter,使用的是HttpClient進(jìn)行轉(zhuǎn)發(fā),該過(guò)濾器會(huì)將HttpServletRequest的相關(guān)數(shù)據(jù)(HTTP方法、參數(shù)、請(qǐng)求頭等),轉(zhuǎn)換為HttpClient的請(qǐng)求實(shí)例(HttpRequest),再使用CloseableHttpClient進(jìn)行轉(zhuǎn)發(fā)。

        在此過(guò)程中,為了保證轉(zhuǎn)發(fā)的性能,使用了HttpClient的連接池功能。涉及連接池,就需要對(duì)其進(jìn)行配置。在使用簡(jiǎn)單路由時(shí),可以配置以下兩項(xiàng),修改HttpClient連接池的屬性:

  • zuul.host.maxTotalConnections:目標(biāo)主機(jī)的最大連接數(shù),默認(rèn)值為200。配置該項(xiàng),相當(dāng)于調(diào)用了PoolingHttpClientConnectionManager的setMaxTotal方法。

  • zuul.host.maxPerRouteConnections:每個(gè)主機(jī)的初始連接數(shù),默認(rèn)值為20。配置該項(xiàng),相當(dāng)于調(diào)用了PoolingHttpClientConnectionManager的setDefaultMaxPerRoute方法。

跳轉(zhuǎn)路由

        除了簡(jiǎn)單路由外,也支持跳轉(zhuǎn)路由,當(dāng)外部訪問(wèn)網(wǎng)關(guān)的A地址時(shí),會(huì)forward到B地址,處理跳轉(zhuǎn)路由的過(guò)濾器為SendForwardFilter。接下來(lái)進(jìn)行簡(jiǎn)單測(cè)試,為網(wǎng)關(guān)項(xiàng)目(zuul-gateway)添加一個(gè)控制器,請(qǐng)見(jiàn)代碼清單7-5。

        代碼清單7-5:

        codes\07\03\zuul-gateway\src\main\java\org\crazyit\cloud\web\SourceController.java

@RestController
public class SourceController {

    @RequestMapping(value = "/source/hello/{name}", method = RequestMethod.GET)    
    public String hello(@PathVariable("name") String name) {
        return "hello " + name;
    }
}

        控制器中提供了一個(gè)最簡(jiǎn)單的“hello”服務(wù),用來(lái)當(dāng)作“源服務(wù)”,在application.yml中進(jìn)行轉(zhuǎn)發(fā)配置,配置項(xiàng)如下:

zuul: 
  routes:
    helloRoute:
      path: /test/**
      url: forward:/source/hello

        當(dāng)外部訪問(wèn)“/test”地址時(shí),將會(huì)自動(dòng)forward到“/source/hello”地址,打開(kāi)瀏覽器,輸入:http://localhost:8080/test/anugs,可以看到瀏覽器會(huì)返回字符串“hello angus”,可見(jiàn)源服務(wù)被調(diào)用。跳轉(zhuǎn)路由實(shí)現(xiàn)較為簡(jiǎn)單,實(shí)際上是調(diào)用了RequestDispatcher的forward方法進(jìn)行跳轉(zhuǎn)。

Ribbon路由

        在7.3.2中,我們已經(jīng)接觸過(guò)Ribbon路由。當(dāng)網(wǎng)關(guān)作為Eureka客戶端,注冊(cè)到Eureka服務(wù)器時(shí),可以通過(guò)配置serviceId,將請(qǐng)求轉(zhuǎn)發(fā)到集群的服務(wù)中。使用以下配置,可以執(zhí)行Ribbon路由過(guò)濾器:

zuul: 
  routes:
    sale:
      path: /sale/**
      serviceId: zuul-sale-service

        與簡(jiǎn)單路由類似,serviceId也可以被省略,當(dāng)省略時(shí),將會(huì)使用routeId作為serviceId,下面的配置片斷,效果等同于上面的配置:

zuul: 
  routes:
    zuul-sale-service:
      path: /sale/**

        需要注意的是,如果提供的url配置項(xiàng),不是簡(jiǎn)單路由格式(不以http:或htpps:開(kāi)頭),也不是跳轉(zhuǎn)路由格式(forward:開(kāi)頭),那么將會(huì)執(zhí)行Ribbon路由過(guò)濾器,將url看作是一個(gè)serviceId,下面的配置片斷,效果也等同于前面的配置:

zuul: 
  routes:
    sale:
      path: /sale/**
      url: zuul-sale-service

自定義路由規(guī)則

        如果上面的路由配置無(wú)法滿足實(shí)際的需求,可以考慮使用自定義的路由規(guī)則。實(shí)現(xiàn)方式較為簡(jiǎn)單,在配置類中創(chuàng)建一個(gè)PatternServiceRouteMapper即可,請(qǐng)見(jiàn)代碼清單7-6。

        代碼清單7-6:codes\07\03\zuul-gateway\src\main\java\org\crazyit\cloud\MyConfig.java

@Configuration
public class MyConfig {

    @Bean
    public PatternServiceRouteMapper patternServiceRouteMapper() {
        return new PatternServiceRouteMapper(
                "(zuul)-(?<module>.+)-(service)", "${module}/**");
    }
}

        創(chuàng)建的PatternServiceRouteMapper實(shí)例,構(gòu)造器第一個(gè)參數(shù)為serviceId的正則表達(dá)式,第二個(gè)參數(shù)為路由的path。訪問(wèn)“module/**”的請(qǐng)求,將會(huì)被路由到“zuul-module-service”的微服務(wù)。

        更進(jìn)一步,以上的路由規(guī)則,如果想讓一個(gè)或多個(gè)服務(wù)不被路由,可以使用zuul.ignoredServices屬性,例如在代碼清單7-6的基礎(chǔ)上,想排除zuul-sale-service、zuul-book-service這兩個(gè)模塊,可以配置“zuul.ignoredServices: zuul-sale-service, zuul-book-service”。

忽略路由

        除了上面提到的zuul.ignoredServices配置可以忽略路由外,還可以使用zuul.ignoredPatterns來(lái)設(shè)置不進(jìn)行路由的URL,請(qǐng)見(jiàn)以下配置片斷:

zuul:
  ignoredPatterns: /sale/noRoute
  routes:
    sale:
      path: /sale/**
      serviceId: zuul-sale-service

        訪問(wèn)“/sale”路徑的請(qǐng)求,都會(huì)被路由到“zuul-sale-service”進(jìn)行處理,但“/sale/noRoute”除外。

以上是“Spring Cloud中Zuul路由配置的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向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