Spring Cloud Alibaba Nacos異常Java.Net.UnknownHostException

zhaozhangxiao發表於2022-04-27

java.net.UnknownHostException異常

在Springcloud使用RestTemplate訪問其他模組的時候,可能會出現java.lang.IllegalStateException: No instances available for localhost問題。在Spring Cloud中整合Spring cloud alibaba的Nacos元件時,當進行微服務請求時會出現如下異常資訊:

java.net.UnknownHostException: user-provider

at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:196) ~[na:1.8.0_271]

at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394) ~[na:1.8.0_271]

at java.net.Socket.connect(Socket.java:606) ~[na:1.8.0_271]

at java.net.Socket.connect(Socket.java:555) ~[na:1.8.0_271]

或者如下資訊:

java.net.UnknownHostException: nacos-payment-provider

at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184) ~[na:1.8.0_131]

at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) ~[na:1.8.0_131]

at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_131]

at java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_131]

at java.net.Socket.connect(Socket.java:538) ~[na:1.8.0_131]

基本環境配置

service-url:

nacos-user-service: http://nacos-payment-provider

Controller層的使用:

@RestController

@Slf4j

public class OrderNacosController {

@Resource

private RestTemplate restTemplate;

@Value("${service-url.nacos-user-service}")

private String serverURL;

@GetMapping(value = "/consumer/payment/nacos/{id}")

public String paymentInfo(@PathVariable("id") Long id ){

return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class);

}

}

對應RestTemplate的例項化:

@Configuration
public class ApplicationContextConfig {
    @Bean
    public RestTemplate getRestTemplate(){
        return  new RestTemplate();
    }
}

錯誤原因分析
在上述示例中,導致錯誤的原因在於對RestTemplate的例項化過程中,缺少了指定基於Ribbon的負載均衡策略。在例項化RestTemplate的註解上新增@LoadBalanced註解即可,效果如下:

@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
大多數情況下如果是缺失該註解導致的問題,新增上對應的註解即可。RestTemplateCustomizer會給標有@LoadBalance的RestTemplate新增一個攔截器,攔截器的作用就是對請求的URI進行轉換獲取到具體應該請求哪個服務例項ServiceInstance。

問題還未解決?

如果新增註解還不能夠解決問題,此時就要考慮是否是依賴引入的問題了。比如檢查一下微服務消費者(consumer)的專案中是否引入了LoadBalance的依賴:

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-loadbalancer</artifactId>

<version>${loadbalancer.version}</version>

</dependency>

如果基於Ribbon的負載均衡,那麼是否新增了Ribbon的依賴:

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>

</dependency>
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章