第一种方式具体的实现可以分为两步:第一步是实现Feign客户端远程调用接口,编写一个Fallback回退处理类,并将RPC失败后的回退逻辑编写在回退处理类对应的实现方法中;第二步是在Feign客户端接口的关键性注解@FeignClient上配置失败处理类,具体来说,将该注解的Fallback属性的值配置为上一步定义的Fallback回退处理类。
下面介绍具体的实例,演示如何定义和使用一个Fallback回退处理类。在crazy-springcloud脚手架的uaa-client模块中,有一个用于对uaa-provider进行RPC调用的Feign客户端远程调用接口UserClient,其目的是获取用户信息。
第一步为UserClient接口定义一个简单的Fallback回退处理实现类,代码如下:
package com.crazymaker.springcloud.user.info.remote.fallback;
//省略import
/**
*Feign客户端接口的Fallback回退处理类
*/
@Component
public class UserClientFallback implements UserClient
{
/**
*获取用户信息RPC失败后的回退方法
*/
@Override
public RestOut detail(Long id)
{
return RestOut.error(“failBack:user detail rest服务调用失败” );
}
}
第二步是在UserClient客户端接口的@FeignClient注解中,将Fallback属性的值配置为上一步定义的Fallback回退处理类UserClientFallback,代码如下:
package com.crazymaker.springcloud.user.info.remote.client;
//省略import
/**
*Feign客户端接口
*@description:获取用户信息的RPC接口类
*/
@FeignClient(value = “uaa-provider”,
configuration = FeignConfiguration.class,
fallback = UserClientFallback.class, #配置回退处理类 path = “/uaa-provider/api/user”)
public interface UserClient
{
@RequestMapping(value = “/detail/v1”, method = RequestMethod.GET)
RestOut detail(@RequestParam(value = “userId”) Long userId);
}
回退处理类的实现已经完成,如何进行验证呢?仍然使用前面定义的demoprovider的REST接口
/api/call/uaa/user/detail/v2,该接口通过UserClient对uaa-provider进行远程调用。具体的演示方式为:
停掉所有uaa-provider服务,然后在demo-provider的swagger-ui界面访问其REST接口
/api/call/uaa/user/detail/v2,该接口的内部代码会通过UserClient远程调用Feign接口对目标uaa-provider的REST接口/api/user/detail/v1发起FeignRPC远程调用,而uaa-provider全部服务处于宕机状态,因此Feign将会触发Hystrix回退,执行Fallback回退处理类UserClientFallback的回退实现方法,返回Fallback回退处理的内容,输出的内容如图2-17所示。
图2-17 UserClientFallback回退处理类生效后的示意图
接下来看第二种方式,定义和使用一个Fallback回退处理工厂类。
第二种方式具体的实现也可以分为两步:第一步创建一个Fallback回退处理工厂类,该工厂类需要实现Hystrix的FallbackFactory回退工厂接口,实现其抽象的create创建方法,在该方法的实现代码中,需要返回一个Feign客户端接口的实现类,方法中的具体实现即为回退处理实例,可以通过匿名类的方式创建一个新的回退处理类,并在该匿名类的每个方法的实现代码中编写好RPC回退逻辑;第二步在Feign客户端接口的关键性注解@FeignClient上配置失败处理工厂类,将fallbackFactory属性的值配置为上一步定义的FallbackFactory回退处理工厂类。
下面介绍具体的实例,演示如何定义和使用一个Fall