一、在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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐