背景:
在provider成功注册到Nacos后,我们需要让consumer来通过nacos发现和访问服务。
现象:
编译没问题,nacos能正常看到consumer上来了,在进行restTemplate.getForObject("http://service-provider/echo/" + str, String.class)时报错;
报错内容:
consumer访问接口报错:
I/O error on GET request for "http://service-provider/echo/laolitou":service-provider; nested exception is java.net.UnknownHostException: service-provider] with root cause
网络连接没有问题,名称拼写没有问题,gpt问破也没搞定原因。
解决方案:
先贴下counsumer代码:
@SpringBootApplication
@EnableDiscoveryClient
public class Demo3Application {
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(Demo3Application.class, args);
}
@RestController
public class TestController {
private final RestTemplate restTemplate;
@Autowired
public TestController(RestTemplate restTemplate) {this.restTemplate = restTemplate;}
@RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)
public String echo(@PathVariable String str) {
String serviceUrl = "http://service-provider/echo/" + str;
ResponseEntity<String> response = restTemplate.getForEntity(serviceUrl, String.class);
return response.getBody();
}
}
}
网上有说是给RestTemplate 加上@LoadBalanced就能解决。可是不仅仅是这样。
最主要的问题,是各依赖要找个兼容匹配的版本。
首先spring boot和spring cloud alibaba以及nacos三者之间的版本约束都知道匹配了吧 ,可以查看约束说明
这里解决该问题的关键是还有个LoadBalanced的版本约束,网上没啥资料。看似编译不报错,其实一旦版本不合适,就会报如题错误。
我换了多个LoadBalanced的版本,最终在我的环境下,使用3.1.0版本zhuzhu就完美解决了。
我的环境是Nacos是2.2.0,其他各项版本:
<spring-boot.version>2.6.13</spring-boot.version>
<spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${spring-cloud-alibaba.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
<version>3.1.0</version>
</dependency>
尤其是loadbalancer为什么是3.1.0,没查到出处,总之多试试版本就可以了。
只要报这问题,大多是缺少loadbalancer注解或者版本不匹配导致的