javascript
Spring Cloud Alibaba 服务消费者调用 nacos 服务报错:java.net.UnknownHostException: xxx
目錄
1. 服務消費者啟動類
?1.1. 服務消費者 controller
?2. 服務提供者啟動類
2.1. 服務提供者 controller
?3. 服務報錯
4. nacos 信息
5. 解決思路
5.1. 配置、注解檢查
5.2. 其他方面原因排查
6. 解決方案
7. 參考連接
在 SpringBoot 項目中調用另外的服務報錯:
重點是這一句:
java.net.UnknownHostException: stock-nacos?
意思是未知的主機異常:stock-nacos
stock-nacos 是被調用方。
項目架構如下:
| 框架 | 版本號 |
| Spring Boot? | ? 2.6.3 |
| spring.cloud.alibaba | 2021.0.1.0 |
| spring.cloud | 2021.0.1 |
采用 RestTemplate 進行服務之間的調用,配置負載均衡注解,代碼如下:
1. 服務消費者啟動類
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 現在的新版本中不需要添加了 @EnableDiscoveryClient public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}// 通常寫在配置類中,但是示例的話就這樣也可以// LoadBalanced注解是告訴該服務調用對方服務時使用負載均衡策略調用,沒有此注解則調用時會報500的錯誤響應碼@Bean@LoadBalancedpublic RestTemplate restTemplate() { // public RestTemplate restTemplate(RestTemplateBuilder builder ) {// 可以 new RestTemplate,但是官方推薦 RestTemplateBuilder 構造器來構造,提現了構造者模式的設計思想// 在這里可以設置超時時間等屬性,這里先不設置return new RestTemplate(); // return builder.build();} }?1.1. 服務消費者 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. 服務提供者啟動類
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. 服務提供者 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. 服務報錯
通過 URL 調用服務消費者的 controller 報錯:
報錯信息,參見文章開頭。
4. nacos 信息
我們 nacos 配置完成,1個服務消費者實例和2個服務提供者實例均已注冊到 nacos 中。
?關于 nacos 的配置檢查完畢,沒有發現有問題。
5. 解決思路
5.1. 配置、注解檢查
我們要看是否缺少了注解、配置,或者配置錯誤,檢查完畢之后沒有發現有什么問題。
有文章說需要在 RestTemplate 上添加?@LoadBalanced 注解。如果我們去看我的服務消費者啟動類,就會發現,該注解我們是有的。
還有人說是 需要在啟動類上添加注解?@EnableDiscoveryClient 。實際上,在新版本的 Spring Cloud Alibaba 中,該注解不使用一樣可以實現服務注冊與發現功能。我們在下文會演示不添加該注解是否可以自動實現服務注冊于發現。
5.2. 其他方面原因排查
到了這里,還是解決不了問題。此時不得不去考慮,是否是 SpringBoot版本、 Spring Cloud 與 Spring Cloud Alibaba 版本兼容問題。通過官網我們發現我們使用的版本兼容性沒有問題,我們也不用去想我們發現了什么 bug 之類的奇思妙想。
還有人說是 JDK 版本兼容問題。這個有可能,我使用的是 JDK 17,這個倒是有可能,但是我將 JDK 版本降低之后發現還是同樣的錯誤。
我們排除了各種原因之后,還是解決不了問題,那這個可能就麻煩了。
我通過翻看自己之前的項目,也去網上找了?Spring Cloud Alibaba 的教程,也沒有發現問題。
就這樣,沒有辦法了,這個項目的演示就耽擱這里了。
6. 解決方案
過了一陣子,我回頭繼續看這個問題,還是同樣的錯誤。但是這次我們嘗試了不同的檢索方式,最終讓我找到了一個解決方案:
在服務消費方的 pom 文件中添加依賴:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency>?找到的參考文章中沒有提到在服務消費者還是服務提供者的 pom 中添加該依賴,我個人感覺應該是服務消費者 ,因為它添加的是負載均衡的依賴,而 nacos 自帶的 Ribbon 是一個客戶端負載均衡,意思就是誰調用就誰來決定負載均衡策略。當然還有服務端負載均衡策略,如F5、HA等,這不在本文的討論范圍,感興趣者可以自行查閱資料。
我門就在服務消費者的 pom 中添加了以上依賴,剛開始可能是項目編譯問題,沒有成功,我將服務提供者的 pom 中也添加了該依賴,重新編譯后調用成功了。但是這里我們不清楚真正加在哪里,我們去除了 服務消費者的該依賴,結果調用失敗。這也證明了是需要添加在?服務消費者的pom 中。但是,這不一定正確,因為我們之前也在服務提供者中也添加了該依賴,下面我們去除服務提供者中的依賴,最終如圖:
?啟動項目,重新調用,成功:
7. 參考連接
Spring Cloud:負載均衡 - Spring Cloud Loadbalancer原理?
(已解決)nacos+RestTemplate使用服務名報異常java.net.UnknownHostException
總結
以上是生活随笔為你收集整理的Spring Cloud Alibaba 服务消费者调用 nacos 服务报错:java.net.UnknownHostException: xxx的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机考试准考证打印格式
- 下一篇: 【狂云歌之unity_vr】unity项