目錄
一,什么是單體架構
二,什么是集群和分布式架構
三,什么是微服務架構
四,解決微服務難題的方案Spring-cloud
Spring Cloud Alibaba是阿里巴實現的方案,基于SpringCloud的規范。如果說Spring Cloud Netflix 是 Spring Cloud 的第?代實現, 那么Spring Cloud Alibaba 也可以看做是? Spring Cloud 的第?代實現, 主要由 Nacos、Sentinel、Seata等組件組成.
五,創建一個微服務項目
單體架構,集群和分布式架構,微服務架構
一,什么是單體架構
在java初學階段,當自己獨立做完一個項目,這個項目的業務功能 控制層 配置層 中間件等等所有的功能集中在一個jar包中,那么這個項目就是單體架構的。
二,什么是集群和分布式架構
1.當一個單體架構的項目的流量和需求逐漸增多時,這個時候單體架構就容易崩潰,為解決這個問題。就可以將個別涉及流量大的功能部署在多個服務器上,多個服務器共同完成這個功能。每個服務器的負載按照負載均衡來調度完成任務。這共同完成一個功能的多個服務器共稱為集群。
2.將一個系統拆分為多個小子系統,并且部署在多個服務,不同的服務器承擔的任務不同。這個就是分布式
集群和分布式區別與聯系?
1.概念上:集群是多個計算機做同樣的事情,分布式是多個計算機做不同的事情。
2.功能上:集群的每個節點的功能是相同的,并且有一個節點掛了其他節點可以分擔它的工作,整個業務依然可以訪問。分布式每個節點的功能不同,一個掛了整個業務將不可訪問。
3.關系上:分布式的節點可以是一個集群組成,集群與分布式相互搭配使用。一般不會將兩者單獨區分。而是統稱:分布式架構
三,什么是微服務架構
在一個電商系統中有很多業務代碼是重復的。調用的關系也有很多重復的。可以把一些通用的功能封裝起來形成獨立的基礎服務供別人調用,組成一個微小的服務,這就是微服務。
更加通俗地說,把一個微小的服務封裝起來獨立部署起來。
微服務和分布式架構?
分布式講究流量壓力拆分,流量大的拆開。
微服務講究功能的拆分,拆成一個個獨立功能的整體。
微服務通常是分布式架構,選擇微服務就意味著要解決分布式架構的難題。
四,解決微服務難題的方案Spring-cloud
Spring-cloud是分布式微服務架構的一站式解決方案。微服務架構落地的多種技術集合。
雖然SpringCloud包含微服務架構的多種技術,但這些技術大多不是SpringCloud團隊開發的,SpringCloud像管家一樣把多種技術以SpringCloud規范和SpringBoot風格進行整合起來。但這些技術還是由各個公司維護。
SpringCloud的實現方案主要有以下兩種
1.Spring Cloud Netflix
2.Spring Cloud Alibaba
Netflix一直是SpringCloud的默認實現方案,但是在2018年以后Netflix公司宣布停止維護。SpringCloud也給出了替代技術。
Spring Cloud Alibaba是阿里巴實現的方案,基于SpringCloud的規范。如果說Spring Cloud Netflix 是 Spring Cloud 的第?代實現, 那么Spring Cloud Alibaba 也可以看做是? Spring Cloud 的第?代實現, 主要由 Nacos、Sentinel、Seata等組件組成.
五,創建一個微服務項目
1.服務拆分原則:明確一個服務的最小不可拆分的功能。以便于我們在做一個項目的時不會迷惑到底要拆分哪些服務獨立部署。
2.服務自治:每個拆分出來的獨立服務都可以獨立的開發,測試,運行,部署。
以一個電商系統為例,對于商品的服務應該如何拆分呢,我們平時使用的網購軟件關于商品的功能有很多,在訂單中,首頁中,推薦中等等。這里為演示如何使用SpringCloud解決微服務架構問題,我們不是要做出來一個電商系統為例而是建立項目的架構去模擬項目之間的關系。
一個商品可以出現在訂單上,也可以出現在商品的例表上。并且這個業務的功能是獨立且可以通過商品的ID聯系起來,那么這兩個業務就可以使用微服務架構獨立部署起來。
3.首先準備模擬數據建立訂單表和產品表。
-- 建庫
CREATE DATABASE IF NOT EXISTS cloud_order DEFAULT CHARACTER SET utf8mb4;
CREATE DATABASE IF NOT EXISTS cloud_product DEFAULT CHARACTER SET utf8mb4;-- 訂單表
DROP TABLE IF EXISTS order_detail;
CREATE TABLE order_detail (`id` INT NOT NULL AUTO_INCREMENT COMMENT '訂單id',`user_id` BIGINT(20) NOT NULL COMMENT '用戶ID',`product_id` BIGINT(20) NULL COMMENT '產品id',`num` INT(10) NULL DEFAULT 0 COMMENT '下單數量',`price` BIGINT(20) NOT NULL COMMENT '實付款',`delete_flag` TINYINT(4) NULL DEFAULT 0,`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (id)
) ENGINE = INNODB DEFAULT CHARACTER SET = utf8mb4 COMMENT = '訂單表';-- 數據初始化
INSERT INTO order_detail (user_id, product_id, num, price)
VALUES
(2001, 1001, 1, 99), (2002, 1002, 1, 30), (2001, 1003, 1, 40),
(2003, 1004, 3, 58), (2004, 1005, 7, 85), (2005, 1006, 7, 94);-- 產品表
DROP TABLE IF EXISTS product_detail;
CREATE TABLE product_detail (`id` INT NOT NULL AUTO_INCREMENT COMMENT '產品id',`product_name` VARCHAR(128) NULL COMMENT '產品名稱',`product_price` BIGINT(20) NOT NULL COMMENT '產品價格',`state` TINYINT(4) NULL DEFAULT 0 COMMENT '產品狀態 0-有效 1-下架',`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (id)
) ENGINE = INNODB DEFAULT CHARACTER SET = utf8mb4 COMMENT = '產品表';-- 數據初始化
INSERT INTO product_detail (id, product_name, product_price, state)
VALUES
(1001, "T恤", 101, 0), (1002, "短袖", 30, 0), (1003, "短褲", 44, 0),
(1004, "衛衣", 58, 0), (1005, "馬甲", 98, 0), (1006, "羽絨服", 101, 0),
(1007, "沖鋒衣", 30, 0), (1008, "襪子", 44, 0), (1009, "鞋子", 58, 0),
(10010, "毛衣", 98, 0);
4.創建一個父項目Spring-cloud-demo
紅框里的parent標簽內指定SpringBoot的版本為3.1.6,代表這個項目的父項目的版本,切記不能隨便使用SpringBoot版本,因為SpringBoot版本和SpringCloud版本是嚴格對應的。SpringBoot父項目可以讓當前項目繼承父項目的默認配置以方便管理。
以下是SpringBoot版本和SpringCloud版本對應關系:
Spring Cloud 版本 | Spring Boot 版本范圍 | 備注 |
---|---|---|
2023.0.x (Eureka SRx) | Spring Boot 3.2.x | 最新的 Spring Cloud 版本,適配 Spring Boot 3.2。 |
2022.0.x (Gateway SRx) | Spring Boot 3.1.x | 適配 Spring Boot 3.1。 |
2021.0.x (Jubilee) | Spring Boot 2.6.x ~ 2.7.x | 支持 JDK 17,適配 Spring Boot 2.x。 |
2020.0.x (Ilford) | Spring Boot 2.4.x ~ 2.5.x | 開始支持 JDK 15。 |
Hoxton | Spring Boot 2.2.x | 經典穩定版本,支持 JDK 8 和 11。 |
Greenwich | Spring Boot 2.1.x | 與 Spring Boot 2.1 完美搭配。 |
Finchley | Spring Boot 2.0.x | Spring Boot 2.0 的標準配置。 |
Dalston | Spring Boot 1.5.x | 適配較老的 Spring Boot 版本。 |
在properties中加入可能會用到的各個依賴的版本,方便以后統一管理父項目和子項目中的依賴版本。
<dependencyManagement>這個標簽是聲明可能會用到的依賴,這里的依賴不會直接引入到項目中而是以后再<dependency>中聲明后才會真正的引用。如果子項目中引用的依賴沒有指定版本號則會從父項目中讀取<version>?
紅框里的標簽制定了打包方式是pom不是jar這需要手動調節。
import
作用域是一個特殊的范圍,它只與pom
類型的依賴一起使用。當使用import
范圍時,Maven會將依賴的POM文件中定義的所有依賴、插件和其他配置導入到當前項目的POM文件中,就像這些配置是直接在當前項目的POM文件中定義的一樣
<type>pom</type>:在Maven默認依賴類型是jar,pom表示這是一個父pom文件,需要時,Maven會將父項目依賴和配置導入到子項目中。
5.創建子項目product-service 和 order-service
在這個子項目中引入這些依賴,由于這些依賴在父項目的<dependencyManagement>中都存在,所有子項目會自動導入<dependencyManagement>的依賴,如果已經制定版本號則用子項目自己導入的具體版本號的依賴。
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId></dependency><!--mybatis--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId></dependency></dependencies>
創建product-sevice項目
關于pom.xml文件的配置與order-service一樣。
6.配置yml文件