本文來自於《精通Spring Cloud Alibaba》課程的整理,講師為餘勝軍,點擊查看視頻內容。
本文系志願者整理,供配合學習中心課程使用,不做商業用途。
Spring Cloud Alibaba課程說明
該課程主要講解Spring Cloud Alibaba核心組件 Nacos(服務註冊與發現和分佈式配置中心)、Sentinel(服務保護框架)、Seata(分佈式事務解決框架)、阿里雲OSS、Alibaba Cloud SchedulerX等。
注意事項:該課程需要有一定的SpringBoot基礎知識,如果對SpringBoot不瞭解的話、可以在螞蟻課堂中學習SpringBoot基礎內容。
微服務架構演變過程
傳統單體架構——分佈式架構——SOA面向服務架構——微服務架構模式
傳統架構
傳統的架構,也就是為單點應用,也就是大家在早期所學習的JavaEE知識SSH或者SSM架構模式,會採用分層架構模式:數據庫訪問層、業務邏輯層、控制層,從前端到後臺所有的代碼都是一個開發者去完成。
該架構模式沒有對我們業務邏輯代碼實現拆分,所有的代碼都寫入到同一個工程中裡面,適合於小公司開發團隊或者個人開發。
com.mayikt.controler---springmvc 視圖層 jsp/ftl
com.mayikt.service---業務邏輯層
com.mayikt.dao---數據庫訪問層
將項目的代碼都放入到同一個項目,部署在同一個Tomat中。
該架構模式存在哪些優、缺點:
優點:開發簡單、運維簡單
缺點:該架構模式沒有對我們的業務邏輯實現拆分,所有的代碼都寫入到同一個項目中,
只適合小團隊或者個人形式開發,不適合團隊模式協同工作開發
這種架構模式最大的缺點,如果該系統一個模塊出現不可用、會導致整個系統無法使用。
應用場景:政府項目、管理系統、crm、oa適合於個人小團隊開發。
分佈式架構
分佈式架構模式是基於傳統的架構模式演變過來,將傳統的單點項目根據業務模塊實現拆分、會拆分為會員系統、訂單系統、支付系統、秒殺系統等。 從而降低我們項目的耦合度,這種架構模式開始慢慢的適合於互聯網公司開發團隊。
如果項目團隊人數較多需要進行項目拆分。需要把單體項目不同的系統。大型公司和大型開發團隊多用這種團隊開發的模式。
不同的系統如何連成一塊呢?需要通過域名跳轉。
會員系統:memner.mayikt.com
支付系統pay.mayikt.com
命名系統化:包含服務和視圖層
SOA面向服務架構
不同系統間的會話是如何進行綁定的呢?需要用到SSO單點登入系統。
SOA架構模式也稱作為:面向服務架構模式、俗稱面向與接口開發,將共同存在的業務邏輯抽取成一個共同的服務,提供給其他的服務接口實現調用、服務與服務之間通訊採用rpc遠程調用技術。
通過SSO系統能解決代碼冗餘的問題。
服務:只是有接口 沒有控制層 沒有視圖層
com.mayikt.service
com.mayikt.dao
這種模式叫作SOA面向業務邏輯的開發。
SOA架構模式特點:
1、SOA架構通訊中,採用XML方式實現通訊、在高併發下通訊過程中協議存在非常大冗餘性,所以在最後微服務架構模式中使用JSON格式替代了XML。
2、SOA架構模式實現方案為Web Service或者是ESB企業服務總線 底層通訊協議SOAP協議(Http+XML)實現傳輸。
傳統政府、銀行項目還是保留的在使用Web Service
互聯網公司肯定採用http+json形式實現運輸
ESB企業服務總線
解決多系統之間跨語言通訊,數據協議的轉換,提供可靠消息傳輸。
基於IDEA快速構建Web Service
Web Service服務器端
public class UserService {
@WebMethod
public String getUser(Long id) {
return "mayikt用戶:" + id
;
}
public static void main(String[] args) {
Endpoint.publish("http://192.168.18.218:8089/service/UserService", new UserService());
System.out.println("服務發佈成功");
}
http://192.168.18.218:8089/service/UserService?wsdl 獲取wsdl
wsdl文件描述接口的調用地址 服務的接口 方法 參數等。
Web Service客戶端
public class WebServiceClient {
public static void main(String[] args) throws ServiceException, RemoteException {
UserServiceServiceLocator userServiceServiceLocator = new UserServiceServiceLocator();
UserService userService = userServiceServiceLocator.getUserServicePort();
String result = userService.getUser(10L);
System.out.println("result:" + result);
}
}