熔斷器hystrix
在分布式系統中,每個服務都可能會調用很多其他服務,被調用的那些服務就是依賴服務,有的時候某些依賴服務出現故障也是很正常的。
Hystrix 可以讓我們在分布式系統中對服務間的調用進行控制,加入一些調用延遲或者依賴故障的容錯機制。
Hystrix 通過將依賴服務進行資源隔離,進而阻止某個依賴服務出現故障時在整個系統所有的依賴服務調用中進行蔓延;同時Hystrix 還提供故障時的 fallback 降級機制。
總而言之,Hystrix 通過這些方法幫助我們提升分布式系統的可用性和穩定性。
feign開啟熔斷功能
feign可以用okhttp代替傳統的httpclient,性能更好
feign:
hystrix:
enabled: true
httpclient:
enabled: false
okhttp:
enabled: true
ribbon這塊也可以對okhttp進行配置
ribbon.httpclient.enabled=false
ribbon.okhttp.enabled=true
hystrix熔斷器可以對請求進行重試,對超時時間進行配置等。
hystrix:
command:
default:
execution:
timeout:
enabled: true
isolation:
thread:
#目前有兩個容器實例,單個請求超時5s,+重試>10s,超15s則熔斷
timeoutInMilliseconds: 15000
ribbon:
#ribbon請求連接的超時時間- 限制3秒內必須請求到服務,並不限制服務處理的返回時間
connectTimeout: 3000
#請求處理的超時時間 下級服務響應最大時間,超出時間消費方(路由也是消費方)返回timeout,超時時間不可大於斷路器的超時時間
readTimeout: 5000
feign添加fallback實現默認行為
feign上使用fallback之前,當服務端出現問題時,可以快速響應,並且不會拋出異常,就象為feign加了一層try...cache一樣。
使用方式
開始feign.hystrix的功能
feign:
hystrix:
enabled: true
httpclient:
enabled: false
okhttp:
enabled: true
當feign的服務端出現問題時,返回值為fallback的值,你可以自己定,例如:
@Component
@Slf4j
public class UserClientFallback implements UserClient {
@Override
public Map getUser(Long id) {
logger.info("getUser.error");
return null;
}
@Override
public Map getUsers() {
logger.info("getUsers.error.retrun.default");
return ImmutableMap.of("name", "lind", "sex", "male");
}
}
調用userclient失敗之后,將返回默認的對象
@GetMapping("/api/v1/test")
public ResponseEntity<?> userGet() {
Map users= userClient.getUsers();
return ResponseUtils.okMessage("success");
}
結果將是默認值
{"status":200,"message":"操作成功","data":{"name":"lind","sex":"male"},"totalRecords":0}