通過Feign進行調(diào)用@FeignClient?找不到的解決方案
Feign進行調(diào)用@FeignClient 找不到
通過Feign 進行調(diào)用
這里配置spring-cloud 版本為 M8的
?<properties> ? ? ? ? <java.version>1.8</java.version> ? ? ? ? <spring-cloud.version>Finchley.M8</spring-cloud.version> ? ? </properties>
引入依賴
?? ??? ?<dependency> ? ? ? ? ? ? <groupId>org.springframework.cloud</groupId> ? ? ? ? ? ? <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> ? ? ? ? </dependency> ? ? ? ? <dependency> ? ? ? ? ? ? <groupId>org.springframework.cloud</groupId> ? ? ? ? ? ? <artifactId>spring-cloud-starter-openfeign</artifactId> ? ? ? ? ? ? <version>2.0.0.RC1</version> ? ? ? ? </dependency>
注意:spring-cloud 版本一定要選好,不然可能會找不到FeignClient,
再網(wǎng)上看到這樣一句話:
Spring Cloud對Feign的支持由org.springframework.cloud:spring-cloud-netflix-core
移到org.springframework.cloud:spring-cloud-openfeign-core下,
Finchley.M8版本下的spring-cloud-starter-openfeign:2.0.0.M2的pom依賴文件中導入的是
spring-cloud-netflix-core而非spring-cloud-openfeign-core,
需要我們在pom文件中添加對應依賴管理使spring-cloud-starter-openfeign版本
更新到2.0.0.RC1
那么接下來我們進行代碼整理
編寫接口
@FeignClient(name="eureka-client-1") public interface EurekaClient { ? ? @GetMapping("/info") ? ? String getInfo(); }
調(diào)用
?@GetMapping("getMessage") ? ? public String getMessage(){ ? ? ? ? String res = ?eurekaClient.getInfo(); ? ? ? ? return res; ? ? }
Feign通過服務名調(diào)用服務,找不到服務
報錯環(huán)境
- eureka注冊中心在遠程服務器上
- 本地服務注冊到遠程的eureka注冊中心
- 本地服務通過Fegin組件+服務名調(diào)用服務
報錯時,注冊中心的情況
Application?? ??? ??? ??? ?Status SERVICE-HOT?? ??? ??? ?192.168.22.180:8308 SERVICE-REDIS?? ??? ?127.0.0.1:4046 SERVICE-ZUUL?? ??? ?127.0.0.1:4041
報錯情況
feign.RetryableException: connect timed out executing GET http://SERVICE-REDIS/redis/NaviKey-24149-1
at feign.FeignException.errorExecuting(FeignException.java:84)
at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:113)
排查后發(fā)現(xiàn):是因為注冊服務ip問題,導致本地服務無法通過服務名字找到相應的服務。
- 遠程項目和eureka服務部署在同一臺服務器上,所以通過127.0.0.1去服務中心注冊服務是沒問題的
- 本地項目通過遠程服務器ip來注冊服務,也沒問題
- 在同一個注冊中心上,可以互相發(fā)現(xiàn)服務,就是通過名字可以找到對方,沒錯
- 問題在于, 當本地SERVICE-HOT服務在eureka中心找到SERVICE-REDIS服務后,redis服務告訴他,我的服務ip地址是127.0.0.1:4046.那么,這就有問題了!!!
- 本地服務和遠程服務不在一臺服務器上,你的127.0.0.1是自己的服務器ip,本地服務肯定找不到
- 所以,注冊服務時,統(tǒng)一都使用服務器ip來注冊就行了,修改后的配置中心如下:
Application?? ??? ??? ??? ?Status SERVICE-HOT?? ??? ??? ?192.168.22.180:8308 SERVICE-REDIS?? ??? ?192.168.22.180:4046 SERVICE-ZUUL?? ??? ?192.168.22.180:4041
不修改服務注冊配置,還有一種辦法:使用fegin時,通過url指定訪問服務的ip
@FeignClient(value = "SERVICE-REDIS", ? ? ? ? url="http://192.168.22.180:4041/service-redis" , ? ? ? ? fallback = RedisSvcFallback.class) public interface RedisSvc {
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于spring boot整合kafka+注解方式
這篇文章主要介紹了關(guān)于spring boot整合kafka+注解方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09springcloud如何獲取網(wǎng)關(guān)封裝的頭部信息
這篇文章主要介紹了springcloud獲取網(wǎng)關(guān)封裝的頭部信息,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06SpringBoot整合MyBatis-Plus3.1教程詳解
這篇文章主要介紹了SpringBoot整合MyBatis-Plus3.1詳細教程,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-08-08SpringMVC中的@RequestMapping注解的使用詳細教程
@RequestMapping注解的作用就是將請求和處理請求的控制器方法關(guān)聯(lián)起來,建立映射關(guān)系,本文主要來和大家詳細講講它的具體使用,感興趣的可以了解一下2023-07-07SpringBoot項目導入aliyun oss starter依賴后啟動報錯問題
這篇文章主要介紹了SpringBoot項目導入aliyun oss starter依賴后啟動報錯問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01