天天看點

Feign與Hystrix整合(将服務熔斷、服務降級徹底解耦)

在上篇部落格的代碼裡,用@HystrixCommand fallbackMethod進行服務熔斷、服務降級是很不好的,因為是在服務提供者裡進行處理的,和業務代碼耦合度太高,不利于維護,是以需要解耦,将服務熔斷、服務降級放在服務消費者裡進行處理,本篇部落格介紹下Feign與Hystrix整合

實作解耦具體步驟

1、修改microservice-student-provider-hystrix-1004項目,不用原先那套,按照正常的邏輯來寫

在StudentService裡加新的接口方法:

Feign與Hystrix整合(将服務熔斷、服務降級徹底解耦)
/**
 * 擷取資訊
 * @return
 */
public Map<String,Object> getInfo();
           

StudentServiceImpl寫具體實作:

@Override
public Map<String, Object> getInfo() {
	Map<String,Object> map=new HashMap<String,Object>();
	map.put("code", 200);
	map.put("info", "業務資料");
	return map;
}
           

StudentProviderController正常調用service方法:

Feign與Hystrix整合(将服務熔斷、服務降級徹底解耦)
/**
 * 擷取資訊
 * @return
 * @throws InterruptedException
 */
@ResponseBody
@GetMapping(value="/getInfo")
public Map<String,Object> getInfo() throws InterruptedException{
	Thread.sleep(900);
	return studentService.getInfo();
}
           

2、在microservice-common項目建立FallbackFactory類,解耦服務熔斷、服務降級

在StudentClientService裡新增getInfo方法:

Feign與Hystrix整合(将服務熔斷、服務降級徹底解耦)
/**
 * 擷取資訊
 * @return
 */
@GetMapping(value="/student/getInfo")
public Map<String,Object> getInfo();
           

建立一個StudentClientFallbackFactory類,實作FallbackFactory<StudentClientService>接口:

package com.ue.service;

import com.ue.entity.Student;
import feign.hystrix.FallbackFactory;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Component
public class StudentClientFallbackFactory implements FallbackFactory<StudentClientService> {
 
    @Override
    public StudentClientService create(Throwable cause) {
        // TODO Auto-generated method stub
        return new StudentClientService() {
             
            @Override
            public boolean save(Student student) {
                // TODO Auto-generated method stub
                return false;
            }
             
            @Override
            public List<Student> list() {
                // TODO Auto-generated method stub
                return null;
            }
             
            @Override
            public Map<String, Object> getInfo() {
                Map<String,Object> map=new HashMap<String,Object>();
                map.put("code", 500);
                map.put("info", "系統出錯,稍後重試");
                return map;
            }
             
            @Override
            public Student get(Integer id) {
                // TODO Auto-generated method stub
                return null;
            }
             
            @Override
            public boolean delete(Integer id) {
                // TODO Auto-generated method stub
                return false;
            }

            @Override
            public String ribbon() {
                return null;
            }
        };
    }
}
           

在StudentClientService接口的@FeignClient注解裡加上fallbackFactory屬性 ,并指定上面建立的StudentClientFallbackFactory類:

Feign與Hystrix整合(将服務熔斷、服務降級徹底解耦)
@FeignClient(value="MICROSERVICE-STUDENT",fallbackFactory=StudentClientFallbackFactory.class)
           

3、修改microservice-student-consumer-feign-80項目支援Hystrix

在StudentConsumerFeignController新增方法調用服務提供者的接口:

Feign與Hystrix整合(将服務熔斷、服務降級徹底解耦)
@GetMapping(value="/getInfo")
public Map<String,Object> getInfo(){
	return studentClientService.getInfo();
}
           

在application.yml裡加上hystrix的配置:

Feign與Hystrix整合(将服務熔斷、服務降級徹底解耦)
feign:
  hystrix:
    enabled: true
           

4、開始測試,先啟動三個eureka,在啟動帶hystrix的provider,最後啟動帶feign、hystrix的consummer:

Feign與Hystrix整合(将服務熔斷、服務降級徹底解耦)

然後在浏覽器位址欄輸入http://localhost/student/getInfo,結果如下:

Feign與Hystrix整合(将服務熔斷、服務降級徹底解耦)
Feign與Hystrix整合(将服務熔斷、服務降級徹底解耦)

Feign與Hystrix整合之預設逾時時間配置

Feign與Hystrix整合後,Hystrix的逾時時間要配置在消費端,也就是配置在microservice-student-consumer-feign-80的yml裡:

Feign與Hystrix整合(将服務熔斷、服務降級徹底解耦)
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 3000
           

但是配置進去後測試依然無效,這是因為feign也有一個逾時時間的設定,feign底層是ribbon的封裝,是以直接配置ribbon即可(ribbon預設逾時也是1秒),是以這裡是強制要求,ribbon的逾時時間要大于hystrix的逾時時間,否則hystrix自定義的逾時時間毫無意義,是以還得加個ribbon逾時時間設定:

ribbon:
  ReadTimeout: 10000
  ConnectTimeout: 9000
           

圖解如下:

Feign與Hystrix整合(将服務熔斷、服務降級徹底解耦)

然後就可以進行測試了,結果如下:

Feign與Hystrix整合(将服務熔斷、服務降級徹底解耦)
Feign與Hystrix整合(将服務熔斷、服務降級徹底解耦)

以上就是本篇部落格的全部内容,将服務熔斷、服務降級進行解耦,即将服務熔斷、服務降級放到服務消費端進行處理

繼續閱讀