網關中加入熔斷機制
在網關中加入熔斷機制

添加依賴項
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項目,正常情況下:

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

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