天天看點

SpringCloud eureka 重試機制ribbon,熔斷器Hystrix,簡化遠端調用Feign

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依賴和自動配置

    SpringCloud eureka 重試機制ribbon,熔斷器Hystrix,簡化遠端調用Feign
    可以通過ribbon.xx來進行全局配置。也可以通過服務名.ribbon.xx來對指定服務配置,例舉局部:
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類上指定剛才編寫的實作類
  • 重新開機測試,成功完成優化