本文我們來演示下Hystrix中解決雪崩效應的第一種方式降級的實現
1.場景介紹
先來看下正常服務調用的情況
當consumer調用provider服務出現問題的情況下:
此時我們對consumer的服務調用做降級處理
2.服務降級概述
整體資源快不夠了,忍痛將某些服務先關掉,待渡過難關,再開啓回來。服務降級處理是在客戶端實現完成的,與服務端沒有關係。
Fallback相當於是降級操作。對於查詢操作,我們可以實現一個fallback方法,當請求後端服務出現異常的時候,可以使用fallback方法返回的值。 fallback方法的返回值一般是設置的默認值或者來自緩存。
2.2.引入依賴
首先在user-consumer中引入Hystix依賴:
<!--服務熔斷組件-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
2.3.修改之前的Controller
在之前的Controller中添加熔斷機制:
@RequestMapping(value = "/get/{id}", method = RequestMethod.GET)
// 一旦調用服務方法失敗並拋出了錯誤信息後,會自動調用@HystrixCommand標註好的fallbackMethod調用類中的指定方法
@HystrixCommand(fallbackMethod = "processHystrix_Get")
public User get(@PathVariable("id") Long id) {
User u = this.userService.get(id);
if (null == u) {
throw new RuntimeException("該ID:" + id + "沒有沒有對應的信息");
}
return u;
}
public User processHystrix_Get(@PathVariable("id") Long id) {
User u=new User();
u.setId(110);
u.setUsername("該ID:" + id + "沒有沒有對應的信息,null--@HystrixCommand");
u.setNote("no this database in MySQL");
return u;
}
2.4.修改主啓動類
修改consumer並添加新註解@EnableCircuitBreaker
@SpringBootApplication
@EnableDiscoveryClient // 開啓EurekaClient功能
@EnableFeignClients // 開啓Feign功能
@EnableCircuitBreaker//對hystrixR熔斷機制的支持
public class SpringcloudDemoConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudDemoConsumerApplication.class, args);
}
}
2.5. 服務熔斷測試
3個eureka先啓動
主啓動類SpringcloudDemoConsumerApplication
訪問測試
http://127.0.0.1:88/consumer/get/2
如果對應的ID:3,數據庫裏面沒有這個記錄,我們報錯後統一返回。
3. 服務降級優化-徹底解耦
修改microservicecloud-api工程,根據已經有的DeptClientService接口新建一個實現FallbackFactory接口的類DeptClientServiceFallbackFactory
/**
* @author bruceliu
* @create 2019-08-04 15:11
* @description
*/
@Component // 不要忘記添加
public class UserClientServiceFallbackFactory implements FallbackFactory<UserClientService> {
@Override
public UserClientService create(Throwable throwable) {
return new UserClientService() {
@Override
public List<User> queryUsers() {
return null;
}
@Override
public User get(Long id) {
User u=new User();
u.setId(110);
u.setUsername("該ID:\" + id + \"沒有沒有對應的信息,null--服務降級~~");
u.setNote("no this database in MySQL----服務降級!!!");
return u;
}
};
}
}
- 修改consumer工程,UserClientService接口在註解@FeignClient中添加fallbackFactory屬性值
/**
* @author bruceliu
* @create 2019-05-04 18:49
* @description Feign客戶端
*/
@FeignClient(value = "SPRINGCLOUD-DEMO-SERVICE",fallbackFactory=UserClientServiceFallbackFactory.class)
public interface UserClientService {
@RequestMapping("/all")
public List<User> queryUsers();
@RequestMapping("/get/{id}")
public User get(@PathVariable("id") Long id);
}
- 修改配置文件
# 開啓服務熔斷策略
feign.hystrix.enabled=true
3.1.測試
- 3個eureka先啓動
- 微服務提供者啓動
- 微服務消費者啓動
正常訪問測試:http://127.0.0.1:88/consumer/get/1
故意關閉微服務提供者
客戶端自己調用提示
此時服務端provider已經down了,但是我們做了服務降級處理,讓客戶端在服務端不可用時也會獲得提示信息而不會掛起耗死服務器。