前面的文章中提到了fallback,这里我们描述一个它的增强版。fallbackFactory。都是实现断路器的功能。
UserFeignClient
package com.dynamic.cloud.feign;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.dynamic.cloud.entity.User;
//@FeignClient(name="microservice-provider-user",fallback =HystrixClientFallback.class,fallbackFactory=HystrixClientFallbackFactory.class)
@FeignClient(name="microservice-provider-user",fallbackFactory=HystrixClientFallbackFactory.class)
public interface UserFeignClient {
@RequestMapping(value="/simple/{id}",method = RequestMethod.GET) //只能是RequestMapping
public User findById(@PathVariable("id") Long id); //@PathVariable需要设置括号中的名称
}
加上fallbackFactory
对应的类是HystrixClientFallbackFactory
package com.dynamic.cloud.feign;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import com.dynamic.cloud.entity.User;
import feign.hystrix.FallbackFactory;
@Component
public class HystrixClientFallbackFactory implements FallbackFactory<UserFeignClient> {
private static final Logger logger = LoggerFactory.getLogger(HystrixClientFallbackFactory.class);
@Override
public UserFeignClient create(Throwable cause) {
HystrixClientFallbackFactory.logger.info("fallback reason was: {} " ,cause.getMessage());
return new UserFeignClientWithFactory()
{
@Override
public User findById(Long id) {
User user = new User();
user.setId(-1L);
return user;
}
};
}
}
该类中存在UserFeignClientWithFactory,它继承了UserFeignClient。这里实现了它的方法。
package com.dynamic.cloud.feign;
public interface UserFeignClientWithFactory extends UserFeignClient {
}
我们把用户微服务停掉之后,断路器打开,执行fallbackfactory 指定的类中方法。HystrixClientFallbackFactory 。