什麼微服務?
微服務是一種經過良好架構設計的分布式架構方案,微服務架構特征:
- 單一職責:微服務拆分力度更小,每一個服務都對應唯一的業務能力,做到單一職責,避免重複業務開發。
- 面向服務:微服務需要對外暴露業務接口,實作跨服務調用。
- 隔離性強:服務調用做好隔離、容錯、降級、避免出現級聯問題
微服務架構的設計主要是為了實作高内聚、低耦合。
單體架構:
簡介:
單體架構指的是将業務的所有功能集中在一個項目中開發,打成一個包部署。該架構适用于簡易項目,例如:學生管理系統

優點:
- 架構相對簡單
- 部署成本低
缺點:
- 耦合度高
分布式架構:
簡介:
分布式架構指的是根據業務功能對系統進行拆分,每個業務子產品作為獨立項目開發,稱為一個服務。該架構适用于大型項目開發,例如京東、淘寶等
例如商城項目,其中有訂單子產品、使用者功能、商品功能、支付功能四大子產品,通過分布式架構就可以按照業務拆分為四個獨立的項目,每個獨立的功能都作為一個項目來建立
優點:
- 降低服務耦合
- 有利于服務更新拓展
缺點:
- 架構複雜,運維、監控、部署難度提高
微服務技術學習路線
微服務技術對比
微服務這種方案需要技術架構來落地,全球的網際網路公司都在積極嘗試自己的微服務落地技術,在國内最知名的就是SpringCloud和阿裡巴巴的Dubbo
認識 SpringCloud
SpringCloud 是目前國内使用最廣泛的微服務架構,其中內建了各種微服務功能元件(服務歐注冊發現、服務遠端調用、服務鍊路監控、統一配置管理、統一網關路由、流控、降級、保護),并基于SpringBoot實作了這些元件的自動裝配,進而提供了良好的開箱即用的體驗:
SpringCloud 中文網;https://www.springcloud.cc/
SpringCloud與SpringBoot的版本相容性關系如下:
SpringCloud版本 | SpringBoot版本 |
2020.0.x aka llford | 2.4.x |
Hoxton | 2.2.x,2.3.x(Starting with SR5) |
Greenwich | 2.1.x |
Finchley | 2.0.x |
Edgware | 1.5.x |
Dalston | 1.5.x |
注意:版本不一緻,将會導緻代碼報錯,甚至無法啟動。
服務的拆分及遠端調用
服務拆分注意事項
服務拆分,也就是一個單體架構,按照功能子產品進行拆分,變成多個服務。例如:XX商城管理系統中有訂單模式、使用者功能、商品功能、支付功能四大子產品,将這四個子產品拆分位四個服務,如下圖所示:
拆分前的單體架構:
拆分後的分布式結構:
例如:現在有一個需求是查詢訂單,同時将訂單中關聯的使用者資訊、商品資訊都擷取到,傳統的單體架構模式,是在訂單Controller中定義一個函數去查訂單,然後在訂單資料擷取使用者id,然後再通過使用者id查詢使用者表擷取對應的使用者資訊。得到商品id以後,根據商品id查詢商品表對應的資料,而這些功能全部都寫在了訂單子產品中,這種做法是完全違背了微服務的原則。
微服務拆分的目的,就是維持單一原則,一個服務隻做與自己相關的事。
訂單子產品就隻做訂單業務,而不操作使用者和商品。
在進行拆分時,需要注意以下幾點
- 不用微服務,不要重複開發相同業務。
- 微服務資料獨立,不要通路其它微服務的資料庫。
- 微服務可以将自己的業務暴露為接口,供其它微服務遠端調用。
如果在微服務模式下, 想在操作訂單時,查詢到使用者和商品相關的資料,這個時候就需要微服務提前将自己的業務暴露為接口,供其它微服務調用。
服務拆分Demo
項目名稱為:cloud-demo
項目結構:
該示例項目所需的sql如下:
cloud-order.sql 中的資料如下:
cloud-user.sql 中的資料如下:
修改yml配置檔案中的資料庫秘密以後,分别啟動OrderApplication和UserApplication兩個微服務, 如下截圖:
訂單通路位址:http://localhost:8080/order/101
使用者通路位址:http://localhost:8081/user/1
該示例項目就完全遵循微服務拆分的原則,遵循單一職責,每個服務做不同的事,并且資料庫也做了分離,每個服務都有一個獨立的資料庫。
目前, 該示例隻是做了資料庫獨立和服務拆分,并沒有實作微服務之間遠端調用的功能,如果想實作根據訂單id查詢訂單資料的同時,把訂單所屬的使用者資訊查詢出來并傳回出去,就需要完成微服務之間遠端調用的功能,如下截圖:
隻能是在訂單子產品中向使用者子產品發起遠端調用,然後将查詢到的資料進行組合,返給用戶端。
微服務遠端調用-查詢訂單具體實作步驟:
1、注冊RestTemplate
在order-service的OrderApplication中注冊RestTemplate
/**
* 微服務之間遠端調用
* 建立RestTemplate并注入Spring容器
* @return
*/
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
2、然後在OrderService中通過 RestTemplate 發送http請求,擷取使用者資料,組拼資料以後傳回
package cn.itcast.order.service;
import cn.itcast.order.mapper.OrderMapper;
import cn.itcast.order.pojo.Order;
import cn.itcast.order.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper;
@Autowired
private RestTemplate restTemplate;
public Order queryOrderById(Long orderId) {
// 1.查詢訂單
Order order = orderMapper.findById(orderId);
// ================== 通過RestTemplate 發起http請求,查詢使用者資料
String url = "http://localhost:8081/user/"+order.getUserId();
/*
getForObject 表示發送get請求,并且将傳回資料封裝成對象
發送http請求,實作遠端調用
*/
User user = restTemplate.getForObject(url, User.class);
order.setUser(user);
// 4.傳回
return order;
}
}
3、然後重新開機order-service中的OrderApplication服務,浏覽器通路:http://localhost:8080/order/101 測試是否可以實作微服務之間的遠端調用