Kevin's blog Kevin's blog
首页
  • AI基础
  • RAG技术
  • 提示词工程
  • Wireshark抓包
  • 常见问题
  • 数据库
  • 代码技巧
  • 浏览器
  • 手册教程
  • 技术应用
  • 流程规范
  • github技巧
  • git笔记
  • vpn笔记
  • 知识概念
  • 学习笔记
  • 环境搭建
  • linux&运维
  • 微服务
  • 经验技巧
  • 实用手册
  • arthas常用
  • spring应用
  • javaAgent技术
  • 网站
友情链接
  • 分类
  • 标签
  • 归档

Kevin

你可以迷茫,但不可以虚度
首页
  • AI基础
  • RAG技术
  • 提示词工程
  • Wireshark抓包
  • 常见问题
  • 数据库
  • 代码技巧
  • 浏览器
  • 手册教程
  • 技术应用
  • 流程规范
  • github技巧
  • git笔记
  • vpn笔记
  • 知识概念
  • 学习笔记
  • 环境搭建
  • linux&运维
  • 微服务
  • 经验技巧
  • 实用手册
  • arthas常用
  • spring应用
  • javaAgent技术
  • 网站
友情链接
  • 分类
  • 标签
  • 归档
  • 手册教程

  • 技术应用

    • 工作杂货

      • Jprofiler排查
      • ES查询压测
      • 阿尔萨斯(Arthas)
      • 定时任务
      • DruidDataSource配置
      • Spring Cloud Stream
      • 线上Tomcat配置参考
      • 配置Prometheus及健康检测
      • Feign远程调用
      • Hystrix单方法熔断配置
      • 本地开发联调配置
      • Java代码杂记
      • SQL脚本杂记
      • 批量算费本地工具类
      • Apollo配置模糊查询
      • 开发问题记录
      • 机器配置参考
    • 技巧备忘

  • 流程规范

  • GitHub技巧

  • VPN

  • Git笔记

  • 实用手册
  • 技术应用
  • 工作杂货
luoxiaofeng
2022-05-14

Feign远程调用

场景:很多时候可能我们需要调用第三方平台,例如OSS、alipay或者是未在注册中心注册的服务,通常我们可以选用RestTemplate来操作,但是有时候我们更想通过Feign的方式来直接调用远程的接口。

public interface DispatchCodeFeign {
  @RequestLine(value = "POST /dispatchcode/fetchCodes")
  @Headers("Content-Type: application/json")
  DispatchCodeResult<Map<String, DispatchCodeVo>> fetchCodes(URI baseUri, @RequestBody List<DisPatchCodeDto> disPatchCodeDtos);
}
1
2
3
4
5

参数说明:

@ReqeustLine:相当于WebMvc中的@RequestMapping

@Headers: 请求头

1.baseUri:需要调用的地址路径

2.disPatchCodeDto:具体的参数

此处为什么不直接使用FeignClient(url="${动态配置}")?

因为在Spring的加载顺序 会先加载FeignClient再去加载apollo的配置,所以url不能解析到动态配置的属性,只能通过Feign原生api的方式来进行动态的传入uri。

@Configuration
public class OmsApiFeignConfig {
  /**请求连接超时时间1S**/
  private final int CONNECT_TIME_OUT = 1000;
  /**请求读取超时时间10S**/
  private final int READ_TIME_OUT = 10000;
  /**feign command**/
  private final String FEIGN_COMMAND = "dispatchCode";

  @Bean
  public DispatchCodeFeign dispatchCodeFeign(Decoder decoder, Encoder encoder, DispatchCodeFallBack fallback) {
    Target<DispatchCodeFeign> target = Target.EmptyTarget.create(DispatchCodeFeign.class, FEIGN_COMMAND);
    HystrixFeign.Builder builder = HystrixFeign.builder();
    DispatchCodeFeign orderReportFeign = builder
            .options(new Request.Options(CONNECT_TIME_OUT, READ_TIME_OUT))
            .encoder(encoder)
            .decoder(decoder)
            .target(target, fallback);
    return orderReportFeign;
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

需要引用此feign的Service 需要加入注解 @Import(FeignClientsConfiguration.class)

@Service
@Slf4j
@Import(FeignClientsConfiguration.class)
public class DispatchCodeServiceImpl extends AbstractCacheServiceImpl implements IDispatchCodeService {
  @Value("${dispatch.code.uri:\"\"}")
  private String dispatchCodeUri;

  private URI uri = null;

  private final Integer RES_FAIL = 0;

  @Autowired
  private DispatchCodeFeign dispatchCodeFeign;

  @Override
  public DispatchCodeVo fetch(DisPatchCodeDto disPatchCodeDto) {
    URI uri = getUri();

    Long startTime = System.currentTimeMillis();
    log.info("【请求三段码】地址:{},入参: {}", uri, JSONUtil.toJsonStr(disPatchCodeDto));
    DispatchCodeResult<Map<String, DispatchCodeVo>> result = dispatchCodeFeign.fetchCodes(uri, Arrays.asList(disPatchCodeDto));
    log.info("【请求三段码】耗时:{},返回值: {}", System.currentTimeMillis() - startTime, JSONUtil.toJsonStr(result));
    //请求成功
    if (isSuccess(result) && Objects.nonNull(result.getData()) && result.getData().containsKey(disPatchCodeDto.getUniqueSequence())) {
      return result.getData().get(disPatchCodeDto.getUniqueSequence());
    }
    return null;
  }

  private <T> boolean isSuccess(DispatchCodeResult<T> dispatchCodeResult) {
    if (Objects.isNull(dispatchCodeResult)) {
      return false;
    }
    if (RES_FAIL.equals(dispatchCodeResult.getCode())) {
      return false;
    }
    return true;
  }

  private URI getUri() {
    if (Objects.isNull(uri) || !dispatchCodeUri.equals(uri.toString())) {
      synchronized (DispatchCodeServiceImpl.class) {
        if (Objects.isNull(uri) || !dispatchCodeUri.equals(uri.toString())) {
          try {
            uri = new URI(dispatchCodeUri);
          } catch (Exception e) {
            log.error("【创建uri发生异常】异常信息: {}", e);
            throw new ServiceException(ResultCodeEnum.FAIL);
          }
        }
      }
    }
    return uri;
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
上次更新: 2022/06/02, 11:20:10
配置Prometheus及健康检测
Hystrix单方法熔断配置

← 配置Prometheus及健康检测 Hystrix单方法熔断配置→

最近更新
01
AI是如何学习的
06-05
02
chatGpt提示原则
06-05
03
提示词工程实践指南
06-05
更多文章>
| Copyright © 2022-2025 Kevin | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式