SpringCloud入門(二)服務間呼叫和案例

努力--坚持發表於2024-09-12

一、微服務拆分注意事項
微服務拆分注意事項:
1.單一職責:不同微服務,不要重複開發相同業務
2.資料獨立:不要訪問其它微服務的資料庫
3.面向服務:將自己的業務暴露為介面,供其它微服務呼叫

1.微服務需要根據業務模組拆分,做到單一職責,不要重複開發相同業務
2.微服務可以將業務暴露為介面,供其它微服務使用
3.不同微服務都應該有自己獨立的資料庫

二、訂單和使用者服務呼叫案例
訂單和使用者兩個獨立服務;有兩個單獨的資料庫,

-需求:根據訂單id查詢訂單的同時,把訂單所屬的使用者資訊一起返回

不要重複開發業務,不能直接查資料庫,服務是獨立的看不見別人的資料庫。
訂單向使用者發起遠端呼叫;如何完成遠端呼叫;遠端呼叫方式分析: 發起http請求。如下圖:

使用 spring提供的 RestTemplate http請求;透過bean注測為spring物件;

基於RestTemplate發起的http請求實現遠端呼叫。http請求做遠端呼叫是與語言無關的呼叫,只要知道對方的ip、埠、介面路徑、請求引數即可。

因此,我們需要在order-service中 向user-service發起一個http的請求,呼叫http://localhost:8081/user/{userId}這個介面。

使用步驟:

步驟是這樣的:

步驟一、註冊一個RestTemplate的例項到Spring容器

註冊RestTemplate,首先,我們在order-service服務中的OrderApplication啟動類中,註冊RestTemplate例項:

@MapperScan("cn.it.order.mapper")
@SpringBootApplication
public class OrderApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
 
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}


步驟二、修改order-service服務中的OrderService類中的queryOrderById方法,根據Order物件中的userId查詢User

修改order-service服務中的cn.it.order.service包下的OrderService類中的queryOrderById方法:

步驟三、將查詢的User填充到Order物件,一起返回

@Service
public class OrderService {
 
    @Autowired
    private OrderMapper orderMapper;
 
 
    @Autowired
    private RestTemplate restTemplate;
 
    public Order queryOrderById(Long orderId) {
        // 1.查詢訂單
        Order order = orderMapper.findById(orderId);
        // 2.利用RestTemplate發起http請求,查詢使用者
        // 2.1.url路徑
        String url = "http://userservice/user/" + order.getUserId();
        // 2.2.傳送http請求,實現遠端呼叫
        User user = restTemplate.getForObject(url, User.class);
        // 3.封裝user到Order
        order.setUser(user);
        // 4.返回
        return order;
    }
    
   
}

三、服務的提供者和消費者概念
-提供者與消費者

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

-服務呼叫關係:

服務提供者:暴露介面給其它微服務呼叫
服務消費者:呼叫其它微服務提供的介面
提供者與消費者角色其實是相對的
一個服務可以同時是服務提供者和服務消費者

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

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

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

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

相關文章