Nacos服务调用时的UnknownHostException问题

一、问题描述

成功安装并运行Nacos,并且可以正常访问。服务可以在Nacos中正常注册和发现,但是在调用服务时出现UnknownHostException错误,具体错误信息如下图所示:

 

二、解决过程

环境信息
  • Spring Cloud 版本:2023.0.0.0-RC1
  • Spring Boot 版本:3.2.0
  • Nacos 版本:依赖于Spring Cloud 版本

在Spring Cloud 2020.0.1.0之后的版本中,不再使用Netflix组件,因此Ribbon不再用于实现负载均衡。我们需要在消费者服务端添加以下依赖:

   <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
具体步骤

1.确保服务注册正常:首先确保所有服务在Nacos中注册和发现都正常,没有任何异常日志。

2.添加必要的依赖:在消费者服务的pom.xml文件中,添加spring-cloud-starter-loadbalancer依赖。

 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
 </dependency>

3.配置Nacos客户端:确保Nacos客户端配置正确,包括Nacos服务器地址和命名空间等信息。以下是一个示例配置:

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.01:8848

4.使用负载均衡注解:在服务调用端,使用Spring Cloud的@LoadBalanced注解配置RestTemplate,以启用负载均衡。

@Bean
@LoadBalanced
public RestTemplate restTemplate() {
    return new RestTemplate();
}
 
示例代码,

服务调用代码示例 ConsumeController :

@RestController
@RequestMapping("/api")
public class ConsumeController {


   //调用的服务名
    public static final String PAYENT_URL = "http://order-service";

    @Autowired
    RestTemplate restTemplate;


    @RequestMapping(value = "/add/{str}", method = RequestMethod.GET)
    public String echo(@PathVariable("str") String str) {
        System.out.println("str==="+str);
        return restTemplate.getForObject(PAYENT_URL+"/order/add/" + str, String.class);
    }

}
负载均衡RestTemplatep配置类
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
* @ClassName ApplicationContextConfig
* @Description: RestTemplatep配置类
* @Author hui.ZH
* @Date 2025/6/18
**/
@Configuration
public class ApplicationContextConfig {

/**
* 如果是集群方式调用需要加上LoadBalanced 否则会502
* @return
*/
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}

被调用的服务代码示例

import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

/**
 * @ClassName OrderController
 * @Description: TODO
 * @Author hui.ZH
 * @Date 2025/6/1
 **/

@RestController
@RequestMapping("/order")
public class OrderController {

    @RequestMapping(value = "/add/{params1}", method = RequestMethod.GET)
    public String add(@PathVariable("params1") String params1){
        System.out.println("下单成功"+params1);
        return "huui_"+params1;

    }

}
 
posted @ 2025-06-23 11:24  安然66  阅读(176)  评论(0)    收藏  举报