一、微服務拆分注意事項
微服務拆分注意事項:
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既可以是服務提供者,也可以是服務消費者。