Redian新闻
>
手撸一个动态Feign,实现一个“万能”接口调用

手撸一个动态Feign,实现一个“万能”接口调用

公众号新闻

点击上方“芋道源码”,选择“设为星标

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

 
来源:juejin.cn/post/7085
661725881696293

Feign,在微服务框架中,是的服务直接的调用变得很简洁、简单,而不需要再编写Java Http调用其他微服务的接口。

动态feign

对于fegin调用,我们一般的用法都是为每个微服务都创建对应的feignclient接口,然后为每个微服务的controller接口,一一编写对应的方法,去调用对应微服务的接口。

例如下面这样:

//system
@FeignClient(name = "system")
public interface SystemClient {
    @GetMapping("/system/test1")
    JsonResult test1(String test1);
    
    @GetMapping("/system/test2")
    JsonResult test2(String test2);
    
    ....
}

//user
@FeignClient(name = "user")
public interface UserClient {
    @GetMapping("/user/test1")
    JsonResult test1(String test1);
    
    @GetMapping("/user/test2")
    JsonResult test2(String test2);
    
    ....
}

这样写的话,可能会有些累赘,那么我们能不能创建一个动态的feign;当调用sytem微服务的时候,传递一个feignclientnamesystem进去,然后定义一个通用的方法,指定调用的url,传递的参数,就可以了呢?

答案是可以的!!!^_^

装一下
  • 定义一个通用的接口,通用的get,post方法
public interface DynamicService {
    
    @PostMapping("{url}")
    Object executePostApi(@PathVariable("url") String url, @RequestBody Object params);

    @GetMapping("{url}")
    Object executeGetApi(@PathVariable("url") String url, @SpringQueryMap Object params);
}

executePostApi:(post方法)

url,表示你要调用微服务的接口url,一般来说是对应controller接口的url;

params,为调用该接口所传递的参数,这里加了@RequestBody,那对应的controller接口,接收参数也需要加上该注解。

  • 定义一个动态feignclient
@Component
public class DynamicClient {

    @Autowired
    private DynamicFeignClientFactory<DynamicService> dynamicFeignClientFactory;

    public Object executePostApi(String feignName, String url, Object params) {
        DynamicService dynamicService = dynamicFeignClientFactory.getFeignClient(DynamicService.classfeignName);
        return dynamicService.executePostApi(url, params);
    }

    public Object executeGetApi(String feignName, String url, Object params) {
        DynamicService dynamicService = dynamicFeignClientFactory.getFeignClient(DynamicService.classfeignName);
        return dynamicService.executeGetApi(url, params);
    }
}

executePostApi:(post方法)

feignName,表示需要调用的微服务的名称,一般对应application.name,例如:system

url,表示你要调用微服务的接口url,一般来说是对应controller接口的url;

params,为调用该接口所传递的参数,这里加了@RequestBody,那对应的controller接口,接收参数也需要加上该注解。

  • 定义一个动态feignclient工厂类
@Component
public class DynamicFeignClientFactory<T{

    private FeignClientBuilder feignClientBuilder;

    public DynamicFeignClientFactory(ApplicationContext appContext) {
        this.feignClientBuilder = new FeignClientBuilder(appContext);
    }

    public T getFeignClient(final Class<T> type, String serviceId) {
        return this.feignClientBuilder.forType(type, serviceId).build();
    }
}

主要的作用:是帮我们动态的创建一个feignclient对象

好了,具体的操作步骤,就是上面所说的了!!!是不是很通用了呢?^_^

通用是通用了,那怎么玩呢(如何使用)?

亮剑

使用的方式,也是十分的简单啦:^_^

DynamicClient dynamicClient = SpringUtil.getBean(DynamicClient.class);
Object result = dynamicClient.executePostApi("system""/system/test"new HashMap<>());
System.out.println("==========>"+JSONObject.toJSONString(result));

先获取到DynamicClient对象,然后直接调用executePostApi方法

"system",表示调用微服务的名称,一般对应application.name

"/system/test",表示调用的url

new HashMap<>(),为需要传递的参数

好了,这样就实现了一个通用版的feignclient,那我们就可以愉快的编写代码了!!!^_^

溜了


欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢

已在知识星球更新源码解析如下:

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。

谢谢支持哟 (*^__^*)

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
利用 Nacos 实现了一个动态化线程池,非常实用!马斯克:冻结招聘!明年裁员!再找个“傻子”接班!被打败意志力的退休老人运行GNN,为何IPU独擅胜场?看视频涨知识|6个动作,给自己做一个“新年免费体检”SpringBoot + MDC 实现全链路调用日志跟踪月光黯淡(二十三)拜登政府买单!“超标准”接待非法移民 住酒店包三餐洗衣替换OpenFeign,Spring 新版本自带的 HTTP 客户端工具来了!美股SPAC|Ignyte Acquisition Corp. (IGNY) 股东批准 Peak Bio 交易徒手撸代码,我跟拍「天宫」的这一年接了个变态需求:给定一个接口,要用户自定义动态实现并上传热部署,怎么搞?大规模GNN如何学习?北邮最新《分布式图神经网络训练》综述,35页pdf阐述分布式GNN训练算法和系统且行且珍惜“万柳少爷”在线收奴,“万柳千金”人人喊打美国西南部美墨边境的沙漠国家公园行(3)德州海拔最高处—-瓜达卢普山国家公园39.9,撸一套华熙生物高端洗护!临期低价,介意勿拍!我就是那个“爱无能”女孩埃隆·马斯克的 Twitter 将添加开源 Signal 协议,实现加密私信 | Linux 中国【首发】脑机接口公司脑虎科技(NeuroXess)完成数亿元A轮融资,持续推进侵入式脑机接口发展龙湖交班:吴亚军彻底放手,80后“仕官生”接过权杖从JVM虚拟机到多线程,手撸Java开发面试必备技术栈 | 极客时间“不文明儿童绘本”接连上热搜,看得我是真不淡定了!美国政府买单!“超标准”接待非法移民 住酒店包三餐洗衣越来越不喜欢这个世界,世界终于变成了我不喜欢的样子。。。,欧盟强制要求手机电池可拆卸!“万能充”又要回来了?如何实现一个 mallocNext.js 13提供新的实验性特性,实现App“动态无限制”最全的来了!立减888元,撸一头羊明星同款“万能油”!一瓶能抵好几瓶,搞定起皮、泛红、细纹,换季也能颜值翻倍!弗洛伊德的死亡哲学丨“生本能”和“死本能”手把手带你用 Go语言实现一个Web框架 | 极客时间SpringBoot 整合 Groovy 脚本,实现动态编程说走就走的“万能”身份有多抢手?手握马耳他永居身份,享受“四位一体国”的居民福利【交通】新增“万能钥匙”功能,69辆新能源公交车投入运营
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。