openfeign 實現動態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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM