日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Spring Cloud【Finchley】-17 使用Zuul为单个或全部微服务提供容错与回退功能

發布時間:2025/3/21 68 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Cloud【Finchley】-17 使用Zuul为单个或全部微服务提供容错与回退功能 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 概述
  • 沒有添加fallback功能的示例
  • 使用zuul為單個微服務添加容錯和回退功能
    • Step1. 新建微服務microservice-gateway-zuul-fallback
    • Step2. FallbackProvider實現類
    • Step3. 測試
  • 為全部微服務提供回退
    • 代碼改造
    • zuul-fallback工程application.yml修改
    • 測試驗證
  • 代碼

概述

Spring Cloud【Finchley】-14 微服務網關Zuul的搭建與使用 # Step8. 網關功能-Hystrix監控測試中我們測試了Zuul默認集成了Hystrix的監控,但是沒有提及容錯。

這里我們來學習下zuul的容錯與回退功能如何實現。

官方指導:https://cloud.spring.io/spring-cloud-static/Finchley.SR2/single/spring-cloud.html#hystrix-fallbacks-for-routes


沒有添加fallback功能的示例

順著 https://blog.csdn.net/yangshangwei/article/details/85850470#Step8_Hystrix_192 的操作步驟,如果我們將micorservice-provider-user 停掉,繼續多次調用,查看Dashboard

上圖可知:zuul的hystrix的監控粒度是微服務,而不是某個API,同樣的,經過zuul的所有請求,都會被Hystrix保護起來。

zuul的配置規則如下:

zuul: routes:microservice-provider-user: /userprovider/**

所以可以這么訪問: http://localhost:4534/userprovider/user/4

這樣返回是不是很難看,下面我們來為zuul添加容錯。


使用zuul為單個微服務添加容錯和回退功能

Step1. 新建微服務microservice-gateway-zuul-fallback

為了不影響別的微服務,我們新建個支持容錯與回退功能的微服務 ,在maven父工程上右鍵 新增mave module

代碼同 microservice-gateway-zuul的,為了區別,修改下application.yml中的端口,將port修改為4535


Step2. FallbackProvider實現類

主要是兩個方法

  • getRoutes 方法,返回為哪個微服務提供回退功能
  • getBody 方法,微服務不可用時返回的信息
package com.artisan.microservice.fallback;import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream;import org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.client.ClientHttpResponse; import org.springframework.stereotype.Component;import com.netflix.hystrix.exception.HystrixTimeoutException; // 添加注解#Component使其成為Spring管理的bean @Component public class MyFallbackProvider implements FallbackProvider {@Overridepublic String getRoute() {// 為哪個微服務提供提供回退服務,返回微服務的名字,必須和注冊在Eureka Server上的名字一致return "microservice-provider-user";}@Overridepublic ClientHttpResponse fallbackResponse(String route, final Throwable cause) {// fallback時的狀態碼if (cause instanceof HystrixTimeoutException) {return response(HttpStatus.GATEWAY_TIMEOUT);} else {return response(HttpStatus.INTERNAL_SERVER_ERROR);}}private ClientHttpResponse response(final HttpStatus status) {return new ClientHttpResponse() {@Overridepublic HttpStatus getStatusCode() throws IOException {return status;}@Overridepublic int getRawStatusCode() throws IOException {return status.value();}@Overridepublic String getStatusText() throws IOException {return status.getReasonPhrase();}@Overridepublic void close() {}@Overridepublic InputStream getBody() throws IOException {// 響應體return new ByteArrayInputStream(("【 " +getRoute() + " 】fallback").getBytes());}@Overridepublic HttpHeaders getHeaders() {// headers設置HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_JSON);return headers;}};} }

Step3. 測試

  • 啟動Eureka Server
  • 啟動microservice-gateway-zuul-fallback
  • 啟動micorservice-provider-user
  • 此時,通過zuul去訪問微服務micorservice-provider-user

    http://localhost:4535/userprovider/user/4

    停掉micorservice-provider-user,再次訪問

    http://localhost:4535/userprovider/user/4

    可見回退功能生效了。


    為全部微服務提供回退


    代碼改造

    將 getRoute方法 返回 * or null

    @Overridepublic String getRoute() {return "*";}

    簡單起見,僅修改這一個地方,至于返回什么信息,我們這里也不做太復雜,保持和上面的示例一致即可。


    zuul-fallback工程application.yml修改

    zuul-fallback工程的zuul部分的配置信息:


    測試驗證

    接下來測試下,為了驗證我們起兩個微服務:

  • 啟動microservice-discovery-eureka
  • 啟動microservice-provider-user
  • 啟動micorservice-consumer-movie-ribbon
  • 啟動microservice-gateway-zuul-fallback
  • 查看服務注冊情況 http://localhost:8761/

    查看zuul的路由信息 http://localhost:4535/actuator/routes

    先通過zuul微服務去訪問其他兩個微服務

    電影微服務: http://localhost:4535/userprovider/user/3

    {"id":3,"username":"artisan3","name":"小工匠三","age":30,"balance":300.00}

    用戶微服務: http://localhost:4535/usermovie/movie/4

    {"id":4,"username":"artisan4","name":"小工匠4","age":40,"balance":400.00}

    停掉micorservice-consumer-movie-ribbon,再次通過zuul訪問consumer-movie

    http://localhost:4535/usermovie/movie/4

    必須使用zuul代理的路徑訪問才能生效,使用http://localhost:4535/micorservice-consumer-movie-ribbon/movie/4 不行,因為停掉服務后zuul的路由信息中 http://localhost:4535/actuator/routes 已經沒有該代理信息了。

    同樣的停掉 microservice-provider-user, 再次訪問 http://localhost:4535/userprovider/user/3

    最后順便看下zuul的路由信息

    代碼

    https://github.com/yangshangwei/SpringCloudMaster/tree/master/microservice-gateway-zuul-fallback

    總結

    以上是生活随笔為你收集整理的Spring Cloud【Finchley】-17 使用Zuul为单个或全部微服务提供容错与回退功能的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。