自定义单个接口配置

再不改变全局配置怎么指定单个接口feign的配置呢
image.png
官网提供了一个方法,自定义FeignClientConfigurer 注入容器,在@FeignClient的属性configuration 指定自定义的配置即可。

我们看一下feign默认的配置
image.png
image.png
这是feign的默认重试
具体实现:
image.png
具体怎么使用要看SynchronousMethodHandler类
image.png
实现了MethodHandler接口 重写invoke方法
image.png
注意方法中catch的异常是 RetryableException, 这是由executeAndDecode中在客户端发出请求时抛出的异常
image.png
image.png
抛出自定义异常在invoke方法catch调用Retryer的continueOrPropagate方法进行重试处理;

大佬又让我涨了一波见识!
配置文件配置:
feign:
client:
config:
contextId:
readTimeout:2000
connectTimeout:1000

最终映射到FeignClientProperties的config中
image.png
image.png

多线程feign传递请求头参数

  1. @Configuration
  2. @Slf4j
  3. public class FeignConfig implements RequestInterceptor {
  4. private static String[] allowHeaders = {"user", "token", "x-request-id", "build-version", "longitude", "latitude", "city-code", "device-id"};
  5. /**
  6. * 往下一级传递的header
  7. */
  8. private static final Set<String> PASS_HEADERS = new HashSet<>(Arrays.asList(allowHeaders));
  9. @Override
  10. public void apply(RequestTemplate requestTemplate) {
  11. ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
  12. // 防止子线程拿不到 或者 请求头没有传, 从MDC中获取
  13. String requestIdKey = "X-Request-Id";
  14. String buildVersion = "Build-Version";
  15. String requestId = MDC.get(requestIdKey);
  16. String version = MDC.get(buildVersion);
  17. if (StringUtils.isNotBlank(requestId)) {
  18. requestTemplate.header(requestIdKey, StringUtils.trimToEmpty(requestId));
  19. }
  20. if (StringUtils.isNotBlank(version)){
  21. requestTemplate.header(buildVersion, StringUtils.trimToEmpty(version));
  22. }
  23. if (attributes == null) {
  24. log.warn("requestTemplate attributes is null");
  25. return;
  26. }
  27. HttpServletRequest request = attributes.getRequest();
  28. Enumeration<String> headerNames = request.getHeaderNames();
  29. if (headerNames == null) {
  30. return;
  31. }
  32. while (headerNames.hasMoreElements()) {
  33. String key = headerNames.nextElement();
  34. String value = request.getHeader(key);
  35. if (PASS_HEADERS.contains(key.toLowerCase()) && value != null) {
  36. requestTemplate.header(key, value);
  37. }
  38. }
  39. }