網關中加入熔斷機制(Hystrix)


網關中加入熔斷機制

在網關中加入熔斷機制

Alt text

添加依賴項

spring-cloud-gateway項目POM文件加入spring-cloud-starter-netflix-hystrix

                <dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
		</dependency>

修改配置文件

修改application.yml配置文件

server:
 port: 9000
spring:
  cloud:
    consul:
      host: 127.0.0.1
      port: 8500
      discovery:
        register: true
    gateway:
      routes:
        - id: test_route
          uri: lb://service-provider
          predicates:
            - Path=/service-provider/{segment}
          filters:
            - SetPath=/{segment}
            - name: Hystrix
              args:
                name: service-provider-fallback
                fallbackUri: forward:/service-provider-error
            - name: Retry
              args:
                retries: 3
                statuses: BAD_GATEWAY,BAD_REQUEST
      default-filters:
        - name: Hystrix
          args:
            name: fallbackcmd
            fallbackUri: forward:/default-error
  application:
    name: PC-ApiGateWay

在默認過濾器中加入熔斷機制

default-filters:
        - name: Hystrix
          args:
            name: fallbackcmd
            fallbackUri: forward:/default-error

gateway下的default-filters代表默認過濾器,Hystrix是熔斷機制的實現,fallbackcmd是HystrixCommand對象的名字(name屬性),fallbackUri表示觸發熔斷機制后的跳轉請求url,/default-error是在spring-cloud-gateway項目中實現的錯誤信息統一處理Controller:

@RestController
public class ErrorHandle {

	@RequestMapping("/default-error")
	public String DefaultErrorHandle(){
		return "這是通用錯誤處理返回的信息。";
	}
}

自定義單條路由的熔斷機制處理內容

gateway:
      routes:
        - id: test_route
          uri: lb://service-provider
          predicates:
            - Path=/service-provider/{segment}
          filters:
            - SetPath=/{segment}
            - name: Hystrix
              args:
                name: service-provider-fallback
                fallbackUri: forward:/service-provider-error

內容和上面介紹相同,同樣需要spring-cloud-gateway項目實現service-provider-error處理過程。

@RestController
public class ErrorHandle {

	@RequestMapping("/default-error")
	public String DefaultErrorHandle(){
		return "這是通用錯誤處理返回的信息。";
	}

	@RequestMapping("/service-provider-error")
	public String ServiceProviderErrorHandle(){
		return "這是ServiceProvider服務專屬的錯誤處理信息。";
	}
}

自動重試機制

gateway:
      routes:
        - id: test_route
          uri: lb://service-provider
          predicates:
            - Path=/service-provider/{segment}
          filters:
            - SetPath=/{segment}
            - name: Hystrix
              args:
                name: service-provider-fallback
                fallbackUri: forward:/service-provider-error
            - name: Retry
              args:
                retries: 3
                statuses: BAD_GATEWAY,BAD_REQUEST

在gateway的filters下聲明name為Retry的過濾器,retries重試次數,statuses返回HTTP狀態碼為何值時重試(還有methods和series參數),請參考org.springframework.http.HttpStatus、org.springframework.http.HttpMethod和org.springframework.http.HttpStatus.Series。

啟動項目測試

啟動 Consul服務中心和spring-cloud-provider微服務,最后啟動spring-cloud-gateway項目,正常情況下:
Alt text

關閉spring-cloud-provider微服務進程之后再次刷新頁面:
Alt text

源碼

Github倉庫:https://github.com/sunweisheng/spring-cloud-example


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM