在上篇博客的代碼裏,用@HystrixCommand fallbackMethod進行服務熔斷、服務降級是很不好的,因爲是在服務提供者裏進行處理的,和業務代碼耦合度太高,不利於維護,所以需要解耦,將服務熔斷、服務降級放在服務消費者裏進行處理,本篇博客介紹下Feign與Hystrix整合
實現解耦具體步驟
1、修改microservice-student-provider-hystrix-1004項目,不用原先那套,按照正常的邏輯來寫
在StudentService里加新的接口方法:
/**
* 獲取信息
* @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方法:
/**
* 獲取信息
* @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方法:
/**
* 獲取信息
* @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類:
@FeignClient(value="MICROSERVICE-STUDENT",fallbackFactory=StudentClientFallbackFactory.class)
3、修改microservice-student-consumer-feign-80項目支持Hystrix
在StudentConsumerFeignController新增方法調用服務提供者的接口:
@GetMapping(value="/getInfo")
public Map<String,Object> getInfo(){
return studentClientService.getInfo();
}
在application.yml里加上hystrix的配置:
feign:
hystrix:
enabled: true
4、開始測試,先啓動三個eureka,在啓動帶hystrix的provider,最後啓動帶feign、hystrix的consummer:
然後在瀏覽器地址欄輸入http://localhost/student/getInfo,結果如下:
Feign與Hystrix整合之默認超時時間配置
Feign與Hystrix整合後,Hystrix的超時時間要配置在消費端,也就是配置在microservice-student-consumer-feign-80的yml裏:
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 3000
但是配置進去後測試依然無效,這是因爲feign也有一個超時時間的設置,feign底層是ribbon的封裝,所以直接配置ribbon即可(ribbon默認超時也是1秒),所以這裏是強制要求,ribbon的超時時間要大於hystrix的超時時間,否則hystrix自定義的超時時間毫無意義,所以還得加個ribbon超時時間設置:
ribbon:
ReadTimeout: 10000
ConnectTimeout: 9000
圖解如下:
然後就可以進行測試了,結果如下:
以上就是本篇博客的全部內容,將服務熔斷、服務降級進行解耦,即將服務熔斷、服務降級放到服務消費端進行處理