第十章:SpringCloud Zuul路由器和過濾器

Netflix uses Zuul for the following: Netflix使用Zuul進(jìn)行以下操作:
Authentication 認(rèn)證
Insights洞察
Stress Testing 壓力測試
Canary Testing 金絲雀測試
Dynamic Routing 動態(tài)路由
Service Migration 服務(wù)遷移
Load Shedding 加載脫落
Security 安全
Static Response handling 靜態(tài)響應(yīng)處理
Active/Active traffic management 主動/主動流量管理

1.添加依賴

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

zuul也需要注冊到eureka

2.修改啟動類

添加注解@EnableZuulProxy
我們來看看@EnableZuulProxy里面都包含了什么注解

image.png

@EnableCircuitBreaker實現(xiàn)斷路器
@EnableDiscoveryClient實現(xiàn)eureka用戶端注冊

3.application.yml

和普通eureka客戶端配置一樣

server:
  port: 8040
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:9000/eureka
#加入密碼驗證
security:
  basic:
    enabled: true
  user:
    name: laojiao
    password: laojiao
spring:
  application:
    name: gateway-zuul

4.啟動 查看zuul組件是否添加成功

  • 啟動eureka
  • 啟動user3服務(wù)
  • 啟動zuul服務(wù)


    image.png

    訪問user3服務(wù)


    image.png

    通過zuul訪問user3服務(wù)
    image.png

5. 自定義訪問前綴

zuul:
  ignoredPatterns: /**/admin/**    #忽略某個服務(wù)的訪問
  routes:
    provider-user3: /user/**

或者  serviceId模式
zuul:
  routes:
    users:
      path: /user/**
      serviceId: provider-user3

或者 url 模式(不能實現(xiàn)ribbon的負(fù)載均衡和hystrix斷路器)
 zuul:
  routes:
    users:
      path: /user/**
      url: http://127.0.0.1:7904

image.png

但是要注意一點:

These simple url-routes don’t get executed as a HystrixCommand nor can you loadbalance multiple URLs with Ribbon.
To achieve this, specify a service-route and configure a Ribbon client for the serviceId (this currently requires disabling Eureka support in Ribbon: see above for more information), e.g.
這些簡單的url路由不會作為HystrixCommand執(zhí)行,也不能使用Ribbon來負(fù)載多個URL陪汽。
為此诡蜓,請指定服務(wù)路由并為serviceId配置功能區(qū)客戶端(目前需要在功能區(qū)中禁用Eureka支持:有關(guān)詳細(xì)信息闸迷,請參閱上文)晤斩。

zuul:
  routes:
    users:
      path: /user/**
      serviceId: provider-user3
ribbon:
  eureka:
    enabled: false

provider-user3:
  ribbon:
    listOfServers: http://127.0.0.1:7904,http://127.0.0.1:7902

這樣配置后柳沙。我們啟動7902盛险,然后訪問


image.png

然后看看兩個user3服務(wù) 日志打印 是否做到負(fù)載均衡:


image.png
image.png

6. /routes 使用

訪問zuul服務(wù)下的/routes僧家,可以查看代理的服務(wù)路徑列表雀摘。

image.png

7.Strangulation Patterns and Local Forwards(請求轉(zhuǎn)發(fā))

Zuul代理是一個有用的工具,因為您可以使用它來處理來自舊端點的客戶端的所有流量八拱,但將一些請求重定向到新端點阵赠。
application.yml

 zuul:
  routes:
    first:
      path: /first/**
      url: http://first.example.com
    second:
      path: /second/**
      url: forward:/second
    third:
      path: /third/**
      url: forward:/3rd
    legacy:
      path: /**
      url: http://legacy.example.com

解釋:

在這個例子中,我們正在扼殺映射到不匹配其他模式的所有請求的“遺留”應(yīng)用程序肌稻。
/ first / **中的路徑已被提取到具有外部URL的新服務(wù)中清蚀。
并且/ second / **中的路徑被禁止,所以它們可以在本地處理爹谭,例如枷邪, 與一個正常的Spring @RequestMapping。
在/ third / **中的路徑也被轉(zhuǎn)發(fā)诺凡,但是具有不同的前綴(即/ third / foo被轉(zhuǎn)發(fā)到/ 3rd / foo)东揣。
注意:被忽略的模式并不完全被忽略,它們只是不被代理處理(所以它們也被有效地本地轉(zhuǎn)發(fā))腹泌。

7.Uploading Files through Zuul(文件上傳)

如果您使用@EnableZuulProxy嘶卧,則可以使用代理路徑上傳文件,只要文件很小凉袱,就可以使用芥吟。
對于大文件,在“/ zuul / ”中有一條繞過*Spring DispatcherServlet(避免多部分處理)的替代路徑绑蔫。
例子:我想通過upload服務(wù)上傳文件运沦,我在upload的配置文件設(shè)置允許的最大文件為2500Mb泵额,但是如果通過zuul來上傳http://super-john:8040/file-upload/upload的話配深,如果文件超過10MB,zuul會直接擋掉(因為用的是zuul的默認(rèn)值);所以我可以在請求前綴上加個zuul即:http://super-john:8040/zuul/file-upload/upload
servlet路徑通過zuul.servletPath進(jìn)行外部化嫁盲。
因為zuul默認(rèn)通過hystrix和ribbon篓叶,所以極大的文件也需要提升超時設(shè)置 烈掠。

  • hystrix和ribbon的超時設(shè)置
    application.yml
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 60000
ribbon:
  ConnectTimeout: 3000
  ReadTimeout: 60000

8.禁用Zuul過濾器

For example to disable org.springframework.cloud.netflix.zuul.filters.post.SendResponseFilter set zuul.SendResponseFilter.post.disable=true.

9.Providing Hystrix Fallbacks For Routes(提供Hystrix路由回退)

當(dāng)Zuul中給定路由的電路被跳閘時,可以通過創(chuàng)建一個類型為ZuulFallbackProvider的bean來提供回退響應(yīng)缸托。 在這個bean中左敌,你需要指定fallback的路由ID,并提供一個ClientHttpResponse作為回退俐镐。 這是一個非常簡單的ZuulFallbackProvider實現(xiàn)

class MyFallbackProvider implements ZuulFallbackProvider {
    @Override
    public String getRoute() {
        return "customers";
    }

    @Override
    public ClientHttpResponse fallbackResponse() {
        return new ClientHttpResponse() {
            @Override
            public HttpStatus getStatusCode() throws IOException {
                return HttpStatus.OK;
            }

            @Override
            public int getRawStatusCode() throws IOException {
                return 200;
            }

            @Override
            public String getStatusText() throws IOException {
                return "OK";
            }

            @Override
            public void close() {

            }

            @Override
            public InputStream getBody() throws IOException {
                return new ByteArrayInputStream("fallback".getBytes());
            }

            @Override
            public HttpHeaders getHeaders() {
                HttpHeaders headers = new HttpHeaders();
                headers.setContentType(MediaType.APPLICATION_JSON);
                return headers;
            }
        };
    }
}

其中

public String getRoute() {
        return "customers";
    }

 public InputStream getBody() throws IOException {
                return new ByteArrayInputStream("fallback".getBytes());
            }

customers改為自己 微服務(wù)的idname provider-user3
new ByteArrayInputStream("fallback".getBytes());里自定義返回內(nèi)容

  • And here is what the route configuration would look like.
zuul:
  routes:
    provider-user3: /user/**
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末矫限,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子佩抹,更是在濱河造成了極大的恐慌叼风,老刑警劉巖驶社,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件输莺,死亡現(xiàn)場離奇詭異肆饶,居然都是意外死亡呀枢,警方通過查閱死者的電腦和手機(jī)瘾英,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門账锹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狡赐,“玉大人盈魁,你說我怎么就攤上這事栏豺”蚣睿” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵奥洼,是天一觀的道長堡妒。 經(jīng)常有香客問我,道長溉卓,這世上最難降的妖魔是什么皮迟? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮桑寨,結(jié)果婚禮上伏尼,老公的妹妹穿的比我還像新娘。我一直安慰自己尉尾,他們只是感情好爆阶,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著沙咏,像睡著了一般辨图。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肢藐,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天故河,我揣著相機(jī)與錄音,去河邊找鬼吆豹。 笑死鱼的,一個胖子當(dāng)著我的面吹牛理盆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播凑阶,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼猿规,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了宙橱?” 一聲冷哼從身側(cè)響起姨俩,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎师郑,沒想到半個月后哼勇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡呕乎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年积担,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猬仁。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡帝璧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出湿刽,到底是詐尸還是另有隱情的烁,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布诈闺,位于F島的核電站渴庆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏雅镊。R本人自食惡果不足惜襟雷,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望仁烹。 院中可真熱鬧耸弄,春花似錦、人聲如沸卓缰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽征唬。三九已至捌显,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間总寒,已是汗流浹背扶歪。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留偿乖,地道東北人击罪。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓哲嘲,卻偏偏與公主長得像贪薪,于是被迫代替她去往敵國和親媳禁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容