ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

openfeign 实现动态Url

2021-11-11 18:04:30  阅读:217  来源: 互联网

标签:OpenFeign openfeign Url JSONObject XXX 代理 url 注解 动态


 

1. 依赖:

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

 

2.使用: 

//url必须写一个默认的,
@FeignClient(value = "bx-xx-service",url = "http://XXX.XXX.XXX.XXX:80")
public interface UserServiceClient {
    @PostMapping("/query")
    JSONObject findByUser(URI uri,@RequestBody JSONObject json);
}
 @Autowired
    private UserServiceClient userServiceClient;
    
    @PostMapping("/findByUser")
    public JSONObject findByUser(@RequestBody JSONObject json)throws Exception{
        String url = json.remove("uri") 
JSONObject result=userServiceClient.findByUser(new URI(url),json); return result; }

 

逐个解析下相关细节:

SpringMVC的其他注解在此处都是支持的。(有其他文章提到也支持OpenFeign原有的注解@RequestLine、@Param等,但博主实测是不支持的,相关解析类为 feign.Contract,这个存疑)

 

 

 

在使用方式上,OpenFeign需要手动构建代理对象,Spring Cloud OpenFeign 不同于 OpenFeign, Spring Cloud OpenFeign 帮我们自动生成了接口的代理对象(即实现类),并且注册到Spring中,我们可以很方便的使用 @Autowired 注入代理对象然后使用。其默认的代理对象是 LoadBalancerFeignClient。还有一个代理对象是 feign.Client.Default。两者区别在于:
LoadBalancerFeignClient 通过服务名(下文提到)从Eureka查找相关的节点地址url,发起调用。
feign.Client.Default 仅是简单的直接调用。

@FeignClient(name = “ThirdPartyAPI”, url = “http://XXX.XXX.XXX.XXX:8080”)
name 属性是 @FeignClient 注解必要的!不定义时会报错,其默认指代Eureka上的服务名。
url 属性,这是重点了! url属性指定什么值其实不重要,因为最终都会被方法的URI参数值替换掉,它在这里另一个重要的作用,就是将接口的代理对象变成feign.Client.Default(上文提到默认是LoadBalancerFeignClient),这样就绕过了从Eureka取节点地址这一步,毕竟第三方的地址不可能注册到我们的Eureka上。(相关细节可自行debug FeignClientFactoryBean.getTarget())

总结一下关键点:
@FeignClient 注解需要指定其 url 属性(值不重要)!
接口方法定义增加 URI类型的参数!
接口方法定义SpringMVC的注解
使用@Autowired 注入代理对象可直接调用

参考:实测可用:

https://blog.csdn.net/weixin_43851064/article/details/115123276

标签:OpenFeign,openfeign,Url,JSONObject,XXX,代理,url,注解,动态
来源: https://www.cnblogs.com/lshan/p/15541012.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有