关于服务降级方面,主要有两种配置方式,
1.使用@HystrixCommand(fallbackMethod = "****")配置,其中***为同一类中的其余方法,用作服务降级的时候响应所用,具体实例,
/**
* 解决服务雪崩效应的接口
* @HystrixCommand<br>
* 默认开启服务隔离方式 以线程池方式<br>
* 默认开启服务降级执行方法orderToMemberUserInfoHystrixFallback<br>
* 默认开启服务熔断机制<br>
*/
@HystrixCommand(fallbackMethod = "orderToMemberUserInfoHystrixFallback")
@LoadBalanced
@RequestMapping("/orderToMemberHystrix")
public ResponseBase getUserInfoHystrix() {
System.out.println("getUserInfoHystrix线程池名称:" + Thread.currentThread().getName());
return orderService.getUserInfo();
}
public ResponseBase orderToMemberUserInfoHystrixFallback(){
return setResultSuccess("服务降级,服务器忙,请稍后重试!");
}
此方法有很大缺陷,因为方法过于冗余,都堆积在一个类中,会对后期维护造成很大的不便。
执行结果,
2.使用FeignFallback类去实现Feign客户端的接口,统一配置所有的服务降级方法。
代码实例如下,
实现Feign客户端的Service方法,
//Hystrix 第二种写法 使用类方式
@LoadBalanced
@RequestMapping("/orderToMemberHystrix_demo02")
public ResponseBase orderToMemberUserInfoHystrixDemo02(){
System.out.println("getUserInfoHystrix线程池名称:" + Thread.currentThread().getName());
return orderService.getUserInfo();
}
Feign远程调用的接口,
@Component
@FeignClient(name = "APP-MEISZL-MEMBER",fallback = MemberServiceFallback.class)
public interface OrderService extends Memberservice {
@RequestMapping("/orderInfo")
public ResponseBase orderInfo();
}
实现远程调用的Feign客户端回调类,
@Component
public class MemberServiceFallback extends BaseApiService implements OrderService {
@Override
public ResponseBase orderInfo() {
return null;
}
@Override
public String testEurekaClient() {
return null;
}
@Override
public ResponseBase getUserInfo() {
return setResultError("服务器忙,请稍后重试!以类方式写服务降级");
}
}
注意此处需要将此类注册成组件形式,否则会导致无法回调,因为无法从Spring中拿出组件定义。
执行结果: