javascript
Spring Cloud Alibaba 服务消费者调用 nacos 服务报错:java.net.UnknownHostException: xxx
目錄
1. 服務(wù)消費(fèi)者啟動類
?1.1. 服務(wù)消費(fèi)者 controller
?2. 服務(wù)提供者啟動類
2.1. 服務(wù)提供者 controller
?3. 服務(wù)報錯
4. nacos 信息
5. 解決思路
5.1. 配置、注解檢查
5.2. 其他方面原因排查
6. 解決方案
7. 參考連接
在 SpringBoot 項目中調(diào)用另外的服務(wù)報錯:
重點是這一句:
java.net.UnknownHostException: stock-nacos?
意思是未知的主機(jī)異常:stock-nacos
stock-nacos 是被調(diào)用方。
項目架構(gòu)如下:
| 框架 | 版本號 |
| Spring Boot? | ? 2.6.3 |
| spring.cloud.alibaba | 2021.0.1.0 |
| spring.cloud | 2021.0.1 |
采用 RestTemplate 進(jìn)行服務(wù)之間的調(diào)用,配置負(fù)載均衡注解,代碼如下:
1. 服務(wù)消費(fèi)者啟動類
package com.dake.order;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate;@SpringBootApplication // 在spring cloud 現(xiàn)在的新版本中不需要添加了 @EnableDiscoveryClient public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}// 通常寫在配置類中,但是示例的話就這樣也可以// LoadBalanced注解是告訴該服務(wù)調(diào)用對方服務(wù)時使用負(fù)載均衡策略調(diào)用,沒有此注解則調(diào)用時會報500的錯誤響應(yīng)碼@Bean@LoadBalancedpublic RestTemplate restTemplate() { // public RestTemplate restTemplate(RestTemplateBuilder builder ) {// 可以 new RestTemplate,但是官方推薦 RestTemplateBuilder 構(gòu)造器來構(gòu)造,提現(xiàn)了構(gòu)造者模式的設(shè)計思想// 在這里可以設(shè)置超時時間等屬性,這里先不設(shè)置return new RestTemplate(); // return builder.build();} }?1.1. 服務(wù)消費(fèi)者 controller
package com.dake.order.controller;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate;@RestController @RequestMapping("/order") public class OrderController {@AutowiredRestTemplate restTemplate;@Value("${service-url.nacos-user-service}")private String serviceUrl;@Value("${server.port}")private String port;@RequestMapping("/add")public String add() { // String msg = restTemplate.getForObject("http://localhost:8021" + "/stock/reduct", String.class);String msg = restTemplate.getForObject(serviceUrl + "/stock/reduct", String.class);System.out.println("---------下單成功---------");return "Hello World " + msg + ":" + port;} }?2. 服務(wù)提供者啟動類
package com.dake.stock;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@SpringBootApplication @EnableDiscoveryClient public class StockApplication {public static void main(String[] args) {SpringApplication.run(StockApplication.class, args);} }2.1. 服務(wù)提供者 controller
package com.dake.stock.controller;import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;@RestController @RequestMapping("/stock") public class StockController {@RequestMapping("/reduct")public String reduct() {System.out.println("---------扣減庫存---------");return "扣減庫存";} }?3. 服務(wù)報錯
通過 URL 調(diào)用服務(wù)消費(fèi)者的 controller 報錯:
報錯信息,參見文章開頭。
4. nacos 信息
我們 nacos 配置完成,1個服務(wù)消費(fèi)者實例和2個服務(wù)提供者實例均已注冊到 nacos 中。
?關(guān)于 nacos 的配置檢查完畢,沒有發(fā)現(xiàn)有問題。
5. 解決思路
5.1. 配置、注解檢查
我們要看是否缺少了注解、配置,或者配置錯誤,檢查完畢之后沒有發(fā)現(xiàn)有什么問題。
有文章說需要在 RestTemplate 上添加?@LoadBalanced 注解。如果我們?nèi)タ次业姆?wù)消費(fèi)者啟動類,就會發(fā)現(xiàn),該注解我們是有的。
還有人說是 需要在啟動類上添加注解?@EnableDiscoveryClient 。實際上,在新版本的 Spring Cloud Alibaba 中,該注解不使用一樣可以實現(xiàn)服務(wù)注冊與發(fā)現(xiàn)功能。我們在下文會演示不添加該注解是否可以自動實現(xiàn)服務(wù)注冊于發(fā)現(xiàn)。
5.2. 其他方面原因排查
到了這里,還是解決不了問題。此時不得不去考慮,是否是 SpringBoot版本、 Spring Cloud 與 Spring Cloud Alibaba 版本兼容問題。通過官網(wǎng)我們發(fā)現(xiàn)我們使用的版本兼容性沒有問題,我們也不用去想我們發(fā)現(xiàn)了什么 bug 之類的奇思妙想。
還有人說是 JDK 版本兼容問題。這個有可能,我使用的是 JDK 17,這個倒是有可能,但是我將 JDK 版本降低之后發(fā)現(xiàn)還是同樣的錯誤。
我們排除了各種原因之后,還是解決不了問題,那這個可能就麻煩了。
我通過翻看自己之前的項目,也去網(wǎng)上找了?Spring Cloud Alibaba 的教程,也沒有發(fā)現(xiàn)問題。
就這樣,沒有辦法了,這個項目的演示就耽擱這里了。
6. 解決方案
過了一陣子,我回頭繼續(xù)看這個問題,還是同樣的錯誤。但是這次我們嘗試了不同的檢索方式,最終讓我找到了一個解決方案:
在服務(wù)消費(fèi)方的 pom 文件中添加依賴:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency>?找到的參考文章中沒有提到在服務(wù)消費(fèi)者還是服務(wù)提供者的 pom 中添加該依賴,我個人感覺應(yīng)該是服務(wù)消費(fèi)者 ,因為它添加的是負(fù)載均衡的依賴,而 nacos 自帶的 Ribbon 是一個客戶端負(fù)載均衡,意思就是誰調(diào)用就誰來決定負(fù)載均衡策略。當(dāng)然還有服務(wù)端負(fù)載均衡策略,如F5、HA等,這不在本文的討論范圍,感興趣者可以自行查閱資料。
我門就在服務(wù)消費(fèi)者的 pom 中添加了以上依賴,剛開始可能是項目編譯問題,沒有成功,我將服務(wù)提供者的 pom 中也添加了該依賴,重新編譯后調(diào)用成功了。但是這里我們不清楚真正加在哪里,我們?nèi)コ?服務(wù)消費(fèi)者的該依賴,結(jié)果調(diào)用失敗。這也證明了是需要添加在?服務(wù)消費(fèi)者的pom 中。但是,這不一定正確,因為我們之前也在服務(wù)提供者中也添加了該依賴,下面我們?nèi)コ?wù)提供者中的依賴,最終如圖:
?啟動項目,重新調(diào)用,成功:
7. 參考連接
Spring Cloud:負(fù)載均衡 - Spring Cloud Loadbalancer原理?
(已解決)nacos+RestTemplate使用服務(wù)名報異常java.net.UnknownHostException
總結(jié)
以上是生活随笔為你收集整理的Spring Cloud Alibaba 服务消费者调用 nacos 服务报错:java.net.UnknownHostException: xxx的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机考试准考证打印格式
- 下一篇: 20道JavaScript经典面试题