一、在eureka注册中心里使用feign远程调用时出现java.net.UnknownHostException异常
java.net.UnknownHostException(主机未知异常)(PS:因为使用nacos调用服务时候不会出现这种问题)
@FeignClient(name = "springcloud-eureka-provider",configuration = FeignLoggerConfig.class,fallback = ProviderFeignClientFallBack.class)
public interface ProviderFeignClient {
@GetMapping("/provider/getResult/{id}")
Result getResult(@PathVariable int id);
}
运行时出现以下异常
java.net.UnknownHostException: springcloud-eureka-provider
(异常详细信息如后图)
//如果注册中心中设置的hostname域名不可用,可以通过以下任一方法解决:
a)删除hostname属性,设置偏好ip:prefer-ip-address: true
b)在此接口上@FeignClient注解中设置url = "http://127.0.0.1:8000"
//url设置调用服务的全路径,一般用于本地测试(eureka与nacos不同,只设置name会报:java.net.UnknownHostException: springcloud-eureka-provider)
@FeignClient(url = "http://127.0.0.1:8001",name = "springcloud-eureka-provider",configuration = FeignLoggerConfig.class,fallback = ProviderFeignClientFallBack.class)
**解决方式:在/@FeignClient注解中增添url参数解决,或者删除服务提供者application.yml文件注册中心设置的hostname属性,修改IP偏好设置 prefer-ip-address: true
二、使用静态路由转换成动态路由时出现java.net.UnknownHostException异常
spring:
application:
name: springcloud-gateway-server
cloud:
gateway:
routes:
#id 唯一标识
- id: gateway-provider
#uri 转发路径 #静态路由
uri: http://127.0.0.1:8001
#uri 转发路径 #动态路由
uri: lb://SPRINGCLOUD-EUREKA-PROVIDER
#predicates 用来请求网关路径的匹配规则
predicates:
- Path=/provider/**
- id: gateway-consumer
uri: http://127.0.0.1:8002
predicates:
- Path=/consumer/**
解决方式:
删除服务提供者application.yml文件注册中心设置的hostname属性,修改IP偏好设置 prefer-ip-address: true ,或者在C:\Windows\System32\drivers\etc\hosts文件中添加
127.0.0.1 springcloud-eureka-provider
在Eureka中使用@FeignClient未使用url属性时发生:
在配置文件中使用lb://xxx 动态路由时发生:
修改本机hosts文件:
总结:
在单机开发阶段,
如果出现UnknownHostException异常:
1、如果注册中心是eureka,检查FeignClient的url属性
2、如果不存在上述问题,检查是否由动态路由设置时造成
3、检查eureka配置文件中的hostname属性(ip地址或域名)
以上两种问题均可通过在本地hosts文件中修改ip 对应的域名解决,在开发过程中不建议使用域名,注册中心中hostname使用本机ip即可,(在正式测试、生产环境下修改成服务器对应的域名即可);
@FeignClient中name和url的作用和区别:
如果同时指定name和url属性: 则以url属性为准,name属性指定的值便当做客户端的名称
相关的资料:
原博:https://blog.csdn.net/qq_40891009/article/details/103390079