2 服務拆分和遠端呼叫
任何分散式架構都離不開服務的拆分,微服務也是一樣。
2.1.服務拆分原則
這裡我總結了微服務拆分時的幾個原則:
- 不同微服務,不要重複開發相同業務
- 微服務資料獨立,不要訪問其它微服務的資料庫
- 微服務可以將自己的業務暴露為介面,供其它微服務呼叫
2.2.服務拆分示例
以課前資料中的微服務cloud-demo為例,其結構如下:
cloud-demo:父工程,管理依賴
- order-service:訂單微服務,負責訂單相關業務
- user-service:使用者微服務,負責使用者相關業務
要求:
- 訂單微服務和使用者微服務都必須有各自的資料庫,相互獨立
- 訂單服務和使用者服務都對外暴露Restful的介面
- 訂單服務如果需要查詢使用者資訊,只能呼叫使用者服務的Restful介面,不能查詢使用者資料庫
2.2.1.匯入Sql語句
首先,將課前資料提供的cloud-order.sql
和cloud-user.sql
匯入到mysql中:
cloud-user表中初始資料如下:
cloud-order表中初始資料如下:
cloud-order表中持有cloud-user表中的id欄位。
2.2.2.匯入demo工程
用IDEA匯入課前資料提供的Demo:
專案結構如下:
匯入後,會在IDEA右下角出現彈窗:
點選彈窗,然後按下圖選擇:
會出現這樣的選單:
配置下專案使用的JDK:
2.3.實現遠端呼叫案例
在order-service服務中,有一個根據id查詢訂單的介面:
根據id查詢訂單,返回值是Order物件,如圖:
其中的user為null
在user-service中有一個根據id查詢使用者的介面:
查詢的結果如圖:
2.3.1.案例需求:
修改order-service中的根據id查詢訂單業務,要求在查詢訂單的同時,根據訂單中包含的userId查詢出使用者資訊,一起返回。
因此,我們需要在order-service中 向user-service發起一個http的請求,呼叫http://localhost:8081/user/{userId}這個介面。
大概的步驟是這樣的:
- 註冊一個RestTemplate的例項到Spring容器
- 修改order-service服務中的OrderService類中的queryOrderById方法,根據Order物件中的userId查詢User
- 將查詢的User填充到Order物件,一起返回
2.3.2.註冊RestTemplate
首先,我們在order-service服務中的OrderApplication啟動類中,註冊RestTemplate例項:
package cn.itcast.order;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
2.3.3.實現遠端呼叫
修改order-service服務中的cn.itcast.order.service包下的OrderService類中的queryOrderById方法:
2.4.提供者與消費者
在服務呼叫關係中,會有兩個不同的角色:
服務提供者:一次業務中,被其它微服務呼叫的服務。(提供介面給其它微服務)
服務消費者:一次業務中,呼叫其它微服務的服務。(呼叫其它微服務提供的介面)
但是,服務提供者與服務消費者的角色並不是絕對的,而是相對於業務而言。
如果服務A呼叫了服務B,而服務B又呼叫了服務C,服務B的角色是什麼?
- 對於A呼叫B的業務而言:A是服務消費者,B是服務提供者
- 對於B呼叫C的業務而言:B是服務消費者,C是服務提供者
因此,服務B既可以是服務提供者,也可以是服務消費者