1.重試機制 ribbon
1.1 解釋:當一次服務調用失敗後,不會立即抛出異常,而是再次重試另一個服務。
1.2 實作步驟:
- 在服務調用端配置檔案中開啟重試機制
spring:
cloud:
loadbalancer:
retry:
enabled: true # 開啟Spring Cloud的重試功能
service: #負載均衡規則的配置
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #規則:随機________預設:輪循
ConnectTimeout: 250 # Ribbon的連接配接逾時時間
ReadTimeout: 1000 # Ribbon的資料讀取逾時時間
OkToRetryOnAllOperations: true # 是否對所有操作都進行重試
MaxAutoRetriesNextServer: 1 # 切換執行個體的重試次數
MaxAutoRetries: 1 # 對目前執行個體的重試次數
- pom檔案添加依賴
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
- 運作測試
當多個消息提供端關閉一個,不會有請求傳回異常,經過連接配接逾時時間就會傳回所有響應資料
-
跟蹤源碼,檢視ip位址:
輕按兩下Shift鍵,搜尋LoadBalancerInterceptor–>
輕按兩下Shift鍵,搜尋LoadBalancerlnterceptor–>
通過intercept方法,點選傳回函數execute方法–>
ctrl + alt +B查找實作類–>
execute方法處加斷點
2.熔斷器 Hystrix
2.1 簡介 :
Hystrix是Netflix開源的一個延遲和容錯庫,用于隔離通路遠端服務、第三方庫,防止出現級聯失敗。
2.2 功能 :
當服務繁忙時,如果服務出現異常,不是粗暴的直接報錯,而是傳回一個友好的提示,雖然拒絕了使用者的通路,但是會傳回一個結果。
2.3 實作步驟:
- 引入依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
- 開啟熔斷(啟動類上)
@EnableHystrix
-
修改消費者
查找方法添加注解
@HystrixCommand(fallbackMethod = “methodFallback”)____復原函數
- 運作測試
請求超過一秒得不到響應,就傳回模拟錯誤提示資訊
3.ribbon和Hystrix相結合
3.1 簡述:
當我們配置完熔斷器之後發現,似乎重試機制不生效了,原因是我們這兩個技術都采用的是預設時間1s
這并不是我們想要的結果,結合項目的話,我們自然是希望兩個功能都要在項目中得到應用
so我們采用的解決方案是:ribbon和Hystrix相結合,先重試再熔斷,是以,Ribbon的逾時時間一定要小于Hystix的逾時時間。
3.2 實作步驟:
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMillisecond: 6000 # 設定hystrix的逾時時間為6000ms
完美優化!!!
附: 檢視端口調用(可能會有用)
@Autowired
RibbonLoadBalancerClient client;
@Test
public void test(){
for (int i = 0; i < 100; i++) {
ServiceInstance instance = this.client.choose("service");
System.out.println(instance.getHost() + ":" + instance.getPort());
}
}
4.Feign
4.1 簡介
Feign可以把Rest的請求進行隐藏,僞裝成類似SpringMVC的Controller一樣。你不用再自己拼接url,拼接參數等等操作,一切都交給Feign去做。
簡化遠端調用代碼,替代RestTemplate
4.2 入門
- 導入依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- 編寫Feign的用戶端
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient("service")
public interface UserFeignClient {
@GetMapping("/user/{id}")
String consume(@PathVariable("id") Long id);
}
-
注意事項
•1.首先這是一個接口,Feign會通過動态代理,幫我們生成實作類。這點跟mybatis的mapper很像
•[email protected],聲明這是一個Feign用戶端,類似@Mapper注解。同時通過value屬性指定服務名稱
•3.接口中的定義方法,完全采用SpringMVC的注解,Feign會根據注解幫我們生成URL,并通路擷取結果
- 在服務調用方注入UserFeignClient
@Autowired
private UserFeignClient userFeighClient;
- 通過遠端調用方法獲得傳回值
- 在啟動類上,添加注解,開啟Feign功能
@EnableFeignClients
- 原來的RestTemplate已經可以完全删掉了,運作測試,入門完成
4.3 優化
-
負載均衡
Feign中本身已經內建了Ribbon依賴和自動配置
可以通過ribbon.xx來進行全局配置。也可以通過服務名.ribbon.xx來對指定服務配置,例舉局部:SpringCloud eureka 重試機制ribbon,熔斷器Hystrix,簡化遠端調用Feign
user-service:
ribbon:
ConnectTimeout: 250 # 連接配接逾時時間(ms)
ReadTimeout: 1000 # 通信逾時時間(ms)
OkToRetryOnAllOperations: true # 是否對所有操作重試
MaxAutoRetriesNextServer: 1 # 同一服務不同執行個體的重試次數
MaxAutoRetries: 1 # 同一執行個體的重試次數
-
Hystix支援
Feign預設也有對Hystix的內建
隻不過,預設情況下是關閉的。我們需要通過下面的參數來開啟:SpringCloud eureka 重試機制ribbon,熔斷器Hystrix,簡化遠端調用Feign
feign:
hystrix:
enabled: true # 開啟Feign的熔斷功能
- 編寫UserFeignClient的實作,作為fallback的處理類
import org.springframework.stereotype.Component;
@Component
public class UserFeignClientFallback implements UserFeignClient {
@Override
public String consume(Long id) {
return "資訊查詢出現異常!";
}
}
- 然後在服務調用端中,UserFeignClient類上指定剛才編寫的實作類
- 重新開機測試,成功完成優化