前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >feign client动态调用指定服务器

feign client动态调用指定服务器

作者头像
十毛
发布2023-10-16 16:34:12
5390
发布2023-10-16 16:34:12
举报
文章被收录于专栏:用户1337634的专栏

项目中使用feign client对接硬件的http接口,这样可以利用Feign Client的好处,但是跟一般的微服务不一样,每个同型号的硬件接口都是一样的,但是硬件的数据和状态是不一样的,有的请求只能发送到指定的硬件。 本文介绍如何让feign client支持动态调用服务器

实现

  • 动态替换URL 利用线程私有变量,动态替换URL,其实这种方式不但可以替换URL和可以只替换name,这样还可以实现动态名字
代码语言:javascript
复制
public class DynamicFeignClientInterceptor implements RequestInterceptor {

    @Override
    public void apply(RequestTemplate template) {
        Target<?> target = template.feignTarget();

        if (!Strings.isNullOrEmpty(THREAD_LOCAL_URL.get())) {
            //替换成线程私有URL
            String newUrl = target.url().replace(target.url(), THREAD_LOCAL_URL.get());
            Target.HardCodedTarget<?> newTarget = new Target.HardCodedTarget<>(target.type(), target.name(), newUrl);
            newTarget.apply(template);
        }
    }

    /**
     * 线程私有的URL.
     */
    private static final ThreadLocal<String> THREAD_LOCAL_URL = new ThreadLocal<>();

    public static void setUrl(String newUrl) {
        THREAD_LOCAL_URL.set(newUrl);
    }
    public static void removeUrl() {
        THREAD_LOCAL_URL.remove();
    }
}
  • FeignClient接口定义

如果使用动态名字,就不能设置url,如果要用url就必须设置,不能为空

代码语言:javascript
复制
@FeignClient(value = "DYNAMIC-CLIENT", url = "DYNAMIC-CLIENT", configuration = WxFeignConfiguration.class)
public interface HwNvrServiceApi {
    /**
     * 登录前设备信息.
     *
     * @return 设备信息
     */
    @PostMapping("API/Login/Range")
    HwNetResult<ObjectNode> deviceInfoBeforeLogin();
}
  • FeignClient配置
代码语言:javascript
复制
public class WxFeignConfiguration {
    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }

    @Bean
    DynamicFeignClientInterceptor dynamicFeignClientInterceptor() {
        return new DynamicFeignClientInterceptor();
    }
}

使用

代码语言:javascript
复制
DynamicFeignClientInterceptor.setUrl("https://www.baidu.com:443");
HwNetResult<ObjectNode> jsonNodes = hwNvrServiceApi.deviceInfoBeforeLogin();
DynamicFeignClientInterceptor.removeUrl();
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-06-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 实现
  • 使用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档