解决Feign只配置name或者value,报java.net.UnknownHostException
问题背景:
- 服务A与服务B在同一个阿里云mse(nacos)下注册,部署在k8s容器上
- 服务A通过Feign把服务B的名称配置到name或者value
- nacos后台可以看到两个服务都已经注册
但是一直报java.net.UnknownHostException
问题排查:
- 先检查pom依赖
在Spring Cloud 2020.0.0 (Ilford) 版本之后,Netflix Ribbon被移除了,默认使用Spring Cloud LoadBalancer。
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>检查配置注解
@EnableFeignClients: feign客户端是否开启
@EnableDiscoveryClient: 服务注册与服务发现是否开启检查nacos配置
检查两个服务是否在同一个nacos的同一个namespace的同一个group下;
检查最终启动程序的nacos配置是否正确: (文件/自动发布脚本/配置中心等);
最终在nacos后台可以看到两个服务都在服务列表确认负载均衡是否配置
Feign 没有负载均衡器,直接使用 HTTP 客户端调用,但服务名不是有效的域名。导致UnknownHostException
问题定位
- 最终定位是负载均衡未配置
- 配置方式如下面两种
1.通过配置文件
spring:cloud:loadbalancer:enabled:true2.通过自定义配置类(我选择的此种方式)
importfeign.Client;importfeign.Logger;importfeign.slf4j.Slf4jLogger;importorg.springframework.cloud.client.loadbalancer.LoadBalancerClient;importorg.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;importorg.springframework.cloud.openfeign.loadbalancer.FeignBlockingLoadBalancerClient;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;@ConfigurationpublicclassFeignConfig{@BeanpublicClientfeignClient(LoadBalancerClientblockingLoadBalancerClient,LoadBalancerClientFactoryloadBalancerClientFactory){returnnewFeignBlockingLoadBalancerClient(newClient.Default(null,null),blockingLoadBalancerClient,loadBalancerClientFactory);}@BeanLogger.LevelfeignLoggerLevel(){returnLogger.Level.FULL;}@BeanpublicLoggerlogger(){returnnewSlf4jLogger();}}最终问题得以解决