(2)什麼是服務拆分和遠端呼叫

word發表於2022-02-09

2 服務拆分和遠端呼叫

任何分散式架構都離不開服務的拆分,微服務也是一樣。

2.1.服務拆分原則

這裡我總結了微服務拆分時的幾個原則:

  • 不同微服務,不要重複開發相同業務
  • 微服務資料獨立,不要訪問其它微服務的資料庫
  • 微服務可以將自己的業務暴露為介面,供其它微服務呼叫

image-20210713210800950

2.2.服務拆分示例

以課前資料中的微服務cloud-demo為例,其結構如下:

image-20210713211009593

cloud-demo:父工程,管理依賴

  • order-service:訂單微服務,負責訂單相關業務
  • user-service:使用者微服務,負責使用者相關業務

要求:

  • 訂單微服務和使用者微服務都必須有各自的資料庫,相互獨立
  • 訂單服務和使用者服務都對外暴露Restful的介面
  • 訂單服務如果需要查詢使用者資訊,只能呼叫使用者服務的Restful介面,不能查詢使用者資料庫

2.2.1.匯入Sql語句

首先,將課前資料提供的cloud-order.sqlcloud-user.sql匯入到mysql中:

image-20210713211417049

cloud-user表中初始資料如下:

image-20210713211550169

cloud-order表中初始資料如下:

image-20210713211657319

cloud-order表中持有cloud-user表中的id欄位。

2.2.2.匯入demo工程

用IDEA匯入課前資料提供的Demo:

image-20210713211814094

專案結構如下:

image-20210713212656887

匯入後,會在IDEA右下角出現彈窗:

image-20210713212349272

點選彈窗,然後按下圖選擇:

image-20210713212336185

會出現這樣的選單:

image-20210713212513324

配置下專案使用的JDK:

image-20210713220736408

2.3.實現遠端呼叫案例

在order-service服務中,有一個根據id查詢訂單的介面:

image-20210713212749575

根據id查詢訂單,返回值是Order物件,如圖:

image-20210713212901725

其中的user為null

在user-service中有一個根據id查詢使用者的介面:

image-20210713213146089

查詢的結果如圖:

image-20210713213213075

2.3.1.案例需求:

修改order-service中的根據id查詢訂單業務,要求在查詢訂單的同時,根據訂單中包含的userId查詢出使用者資訊,一起返回。

image-20210713213312278

因此,我們需要在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方法:

image-20210713213959569

2.4.提供者與消費者

在服務呼叫關係中,會有兩個不同的角色:

服務提供者:一次業務中,被其它微服務呼叫的服務。(提供介面給其它微服務)

服務消費者:一次業務中,呼叫其它微服務的服務。(呼叫其它微服務提供的介面)

image-20210713214404481

但是,服務提供者與服務消費者的角色並不是絕對的,而是相對於業務而言。

如果服務A呼叫了服務B,而服務B又呼叫了服務C,服務B的角色是什麼?

  • 對於A呼叫B的業務而言:A是服務消費者,B是服務提供者
  • 對於B呼叫C的業務而言:B是服務消費者,C是服務提供者

因此,服務B既可以是服務提供者,也可以是服務消費者

相關文章