SpringCloud如何解決服務之間的通信問題
1、如何解決服務之間的通信問題?
[1]HTTP REST方式 使用http協議進行數據傳遞 json格式數據
[2]RPC方式 遠程過程調用 二進制數據
從OSI七層結構來講,即物理層、數據鏈路層、網絡層、運輸層、會話層、表示層、應用層。http屬於應用層協議,而RPC屬於傳輸層,所以RPC方式的傳輸效率比http高。SpringCloud使用的是HTTP協議傳遞數據。
2、如何在java代碼中發起http方式請求?
spring框架提供HttpClient對象 使用RestTemplate發起一個http請求。
3、實現服務間通信的小案例
3.1 使用兩個測試服務 用戶服務users和訂單服務orders
3.2 用戶服務和訂單服務都是兩個獨立的SpringBoot應用
3.3 兩個服務都引入consul client依賴和健康檢查依賴
<!--web--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--consul client--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency>
3.4 配置兩個服務的application.properties
用戶服務:(默認的服務名稱就是Spring.application.name,所以可以不用指定)
server.port=8888 spring.application.name=USERS #consul server spring.cloud.consul.host=localhost spring.cloud.consul.port=8500
訂單服務:
server.port=9999 spring.application.name=ORDERS #consul server spring.cloud.consul.host=localhost spring.cloud.consul.port=8500
3.5 在兩個服務的入口類中加入服務註冊client註解
用戶服務
訂單服務
3.6 控制器開發(這裡進行服務提供者和服務消費者開發) 3.6.1 服務提供者(訂單服務)
OrderController.java
package com.baizhi.controller; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController @Slf4j public class OrderController { @GetMapping("order") public String demo(){ log.info("order demo..."); return "order demo OK!!!"; } }
3.6.2 服務消費者(用戶服務)
UserController.java
package com.baizhi.controller; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @RestController @Slf4j public class UserController { @GetMapping("user") public String invokeDemo(){ log.info("user demo..."); //1、調用訂單服務 服務地址:http://localhost:9999/order 必須是get方式 接收返回值String RestTemplate restTemplate = new RestTemplate(); String orderResult = restTemplate.getForObject("http://localhost:9999/order", String.class); log.info("調用訂單服務成功:{}",orderResult); return "調用order服務成功,結果為:"+orderResult; } }
3.7 測試服務調用
在服務啟動之後查看consul服務註冊中心,可以看到用戶服務和訂單服務都註冊成功瞭。關於consul服務註冊與發現請看這篇文章:https://www.jb51.net/article/141790.htm
訪問http://localhost:9999/order
測試訂單服務:
訪問用戶服務(用戶服務中會調用訂單服務)
訂單服務日志:(這裡的第二次輸出是因為被用戶服務調用)
用戶服務日志:
4、現有RestTemplate方式通信存在的問題?
- 調用服務的路徑主機和服務端口直接寫死在url中無法實現服務集群時請求負載均衡
- 調用服務的請求路徑寫死在代碼中,日後提供服務路徑發生變化時不利於後續維護工作。
5、解決RestTemplate負載均衡問題
- 自定義負載均衡解決策略,但是這樣無法實現服務健康檢查切負載均衡策略過於單一
- 使用SpringCloud提供的組件 推薦使用Ribbon來解決負載均衡的調用問題
到此這篇關於SpringCloud如何解決服務之間的通信問題的文章就介紹到這瞭,更多相關SpringCloud 服務間通信內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Spring Cloud Consul的服務註冊與發現
- SpringCloud整合Consul的實現
- springCloud項目搭建流程步驟分解
- SpringCloud服務註冊和發現組件Eureka
- 深入學習Spring Cloud-Ribbon