文章目錄
- 1、如何解決服務之間的通信問題?
- 2、如何在java代碼中發起http方式請求?
- 3、實作服務間通信的小案例
- 3.1 使用兩個測驗服務 用戶服務users和訂單服務orders
- 3.2 用戶服務和訂單服務都是兩個獨立的SpringBoot應用
- 3.3 兩個服務都引入consul client依賴和健康檢查依賴
- 3.4 配置兩個服務的application.properties
- 3.5 在兩個服務的入口類中加入服務注冊client注解
- 3.6 控制器開發(這里進行服務提供者和服務消費者開發)
- 3.6.1 服務提供者(訂單服務)
- 3.6.2 服務消費者(用戶服務)
- 3.7 測驗服務呼叫
- 4、現有RestTemplate方式通信存在的問題?
- 5、解決RestTemplate負載均衡問題
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://blog.csdn.net/qq_43753724/article/details/119820664?spm=1001.2014.3001.5501

訪問http://localhost:9999/order測驗訂單服務:

訪問用戶服務(用戶服務中會呼叫訂單服務)

訂單服務日志:(這里的第二次輸出是因為被用戶服務呼叫)

用戶服務日志:

4、現有RestTemplate方式通信存在的問題?
- 呼叫服務的路徑主機和服務埠直接寫死在url中無法實作服務集群時請求負載均衡
- 呼叫服務的請求路徑寫死在代碼中,日后提供服務路徑發生變化時不利于后續維護作業,
5、解決RestTemplate負載均衡問題
- 自定義負載均衡解決策略,但是這樣無法實作服務健康檢查切負載均衡策略過于單一
- 使用SpringCloud提供的組件 推薦使用Ribbon來解決負載均衡的呼叫問題

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/295630.html
標籤:java
