通过Feign进行调用@FeignClient|通过Feign进行调用@FeignClient 找不到的解决方案

目录

  • Feign进行调用@FeignClient找不到
    • 通过Feign进行调用
  • Feign通过服务名调用服务,找不到服务
    • 报错环境
    • 报错时,注册中心的情况
    • 报错情况

Feign进行调用@FeignClient 找不到
通过Feign 进行调用
这里配置spring-cloud 版本为 M8的
1.8Finchley.M8

引入依赖
org.springframework.cloudspring-cloud-starter-netflix-eureka-clientorg.springframework.cloudspring-cloud-starter-openfeign2.0.0.RC1

注意:spring-cloud 版本一定要选好,不然可能会找不到FeignClient,
再网上看到这样一句话:
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(); }

调用
@GetMapping("getMessage")public String getMessage(){String res =eurekaClient.getInfo(); return res; }


Feign通过服务名调用服务,找不到服务
报错环境
  • eureka注册中心在远程服务器上
  • 本地服务注册到远程的eureka注册中心
  • 本地服务通过Fegin组件+服务名调用服务

报错时,注册中心的情况
ApplicationStatusSERVICE-HOT192.168.22.180:8308SERVICE-REDIS127.0.0.1:4046SERVICE-ZUUL127.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)
排查后发现:是因为注册服务ip问题,导致本地服务无法通过服务名字找到相应的服务。
  • 远程项目和eureka服务部署在同一台服务器上,所以通过127.0.0.1去服务中心注册服务是没问题的
  • 本地项目通过远程服务器ip来注册服务,也没问题
  • 在同一个注册中心上,可以互相发现服务,就是通过名字可以找到对方,没错
  • 问题在于, 当本地SERVICE-HOT服务在eureka中心找到SERVICE-REDIS服务后,redis服务告诉他,我的服务ip地址是127.0.0.1:4046.那么,这就有问题了!!!
  • 本地服务和远程服务不在一台服务器上,你的127.0.0.1是自己的服务器ip,本地服务肯定找不到
  • 所以,注册服务时,统一都使用服务器ip来注册就行了,修改后的配置中心如下:
ApplicationStatusSERVICE-HOT192.168.22.180:8308SERVICE-REDIS192.168.22.180:4046SERVICE-ZUUL192.168.22.180:4041

不修改服务注册配置,还有一种办法:使用fegin时,通过url指定访问服务的ip
@FeignClient(value = "https://www.it610.com/article/SERVICE-REDIS",url="http://192.168.22.180:4041/service-redis" ,fallback = RedisSvcFallback.class)public interface RedisSvc {

【通过Feign进行调用@FeignClient|通过Feign进行调用@FeignClient 找不到的解决方案】以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

    推荐阅读