在Spring Cloud的微服务框架中,Feign是非常重要且常用的功能,我们可以通过Feign处理服务调用的负责均衡。在使用Feign中,一个非常重要的场景就是配置Feign的Fallback机制,用于解决当依赖的微服务不可用时,使用默认的返回值。本文会针对Feign Fallback的配置方式和常见问题进行介绍。
1. Feign的基础配置
- 引入spring-cloud-starter-feign依赖包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
- 在Application类上增加注解
@SpringCloudApplication
@EnableEurekaClient
@EnableFeignClients
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class);
}
}
- 接口类的配置
@FeignClient("cache")
@RequestMapping("/cache")
public interface CacheService {
@RequestMapping(value = "/passive/{hashCode}", method = RequestMethod.GET)
QueryResult get(@PathVariable(value = "hashCode") int hashCode);
@RequestMapping(value = "/passive/{hashCode}", method = RequestMethod.POST)
void set(@PathVariable(value = "hashCode") int hashCode, @RequestBody QueryResult queryResult);
}
到此,已经可以通过@Autowired的方式,将CacheService引入到其他Service中,实现对cache这个服务的调用了。
2. Feign的Fallback配置
- Fallback类的配置
这里要重点强调的是@RequestMapping URL路径映射的问题,如果@RequestMapping的值和CacheService的接口相同,会导致同一个URL映射到两个方法上,因此需要保证Fallback类的@RequestMapping的值与interface不同。
@Component
@RequestMapping("/fallback/cache")
public class CacheServiceFallback implements CacheService {
@Override
public QueryResult get(int hashCode) {
return null;
}
@Override
public void set(int hashCode, QueryResult queryResult) {
}
}
- 接口类的配置修改
接口类中通过@FeignClient注解的参数进行Fallback类的指定,同时需要增加@Component注解,因为在Spring中同时存在两个CacheService的实例,需要增加@Component以进行区分。
@Component
@FeignClient(value = "cache", fallback = CacheServiceFallback.class)
@RequestMapping("/cache")
public interface CacheService {
@RequestMapping(value = "/passive/{hashCode}", method = RequestMethod.GET)
QueryResult get(@PathVariable(value = "hashCode") int hashCode);
@RequestMapping(value = "/passive/{hashCode}", method = RequestMethod.POST)
void set(@PathVariable(value = "hashCode") int hashCode, @RequestBody QueryResult queryResult);
}
- 打开Feign的Hystrix熔断功能
在application.yml中增加以下配置,打开Hystrix熔断功能:
feign:
hystrix:
enabled: true
- 设置Hystrix的time-out时间
Hystrix的默认time-out时间为1s,如果不做修改的话,有可能会报出以下的异常。如果不清楚设置什么超时时间合适的话,可以设置Hystrix不超时。
Caused by: com.netflix.hystrix.exception.HystrixRuntimeException: Service#function() timed-out and no fallback available.
设置超时时间为20s:
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 20000
设置从不超时:
hystrix:
command:
default:
execution:
timeout:
enabled: false
完成了以上的配置,就可以完美的使用Feign的Fallback功能了!
网友评论