前言 微服務是一種拆分之後分而治之和分而動態強化之的思想; 把一股防禦力量拆分為海、陸、空軍; 在戰時可以在敵人侵犯海域時強化海軍力量, 可以在遇到空襲時強化空軍力量, 可以在在敵人登陸時強化陸軍力量,以對來犯之敵; 在和平時期還可以進行針對性管理; 為什麼要將1個整體的應用程式,拆分成1堆無法再繼 ...
前言
微服務是一種拆分之後分而治之和分而動態強化之的思想;
把一股防禦力量拆分為海、陸、空軍;
- 在戰時可以在敵人侵犯海域時強化海軍力量, 可以在遇到空襲時強化空軍力量, 可以在在敵人登陸時強化陸軍力量,以對來犯之敵;
- 在和平時期還可以進行針對性管理;
為什麼要將1個整體的應用程式,拆分成1堆無法再繼續拆分的微服務呢?
架構化整為零之後,就可以針對某1個功能模塊進行動態地彈性擴縮容和針對性的管理;
互聯網早期,一般的網站應用流量較小,只需一個應用,將所有功能代碼都部署在一起就可以,這樣可以減少開發、部署和維護的成本。
比如說一個電商網站,裡面會包含很多用戶管理,商品管理,訂單管理,物流管理等等很多模塊,我們會把它們做成1個web項目,然後部署到1台Tomcat上。
1.2.缺點
還是以上面的電商為例子,用戶訪問量的增加可能影響的只是用戶和訂單模塊,但是對消息模塊的影響就比較小。
那麼此時我們希望只多增加幾個訂單模塊,而不增加消息模塊,此時單體應用就做不到了,垂直應用就應運而生了。
所謂的垂直應用架構,就是將原來的一個應用拆成互不相干的幾個應用,比如我們可以將上面電商的單體應用拆分成
-
電商系統(用戶管理 商品管理 訂單管理)
-
後臺系統(用戶管理 訂單管理 客戶管理)
-
CMS系統(廣告管理 營銷管理)
2.2.缺點
3.2.缺點
4.2.缺點
5.2.缺點
-
單一職責:微服務拆分粒度更小,每一個服務都對應唯一的業務能力,做到單一職責,避免重覆業務開發
-
面向服務:微服務對外暴露業務介面
-
自治:團隊獨立(不同的團隊負責不同的模塊開發維護)、技術獨立(可使用不同的編程語言實現不同的子模塊)、數據獨立(每個子模塊使用不同的資料庫)、部署獨立(每個子模塊可部署到不同的伺服器上)
-
-
這麼多小服務,如何管理他們?服務治理(電話本)
-
這麼多小服務,他們之間如何通訊?(RPC/HTTP-->RestTemplate)
-
這麼多小服務,客戶端怎麼訪問他們?(服務網關)
三、實現微服務的方案
目前最知名的就是SpringCloud和SpringCloudAlibaba
-
SpringCloud:Spring基於NetFlix微服務組件進行封裝,提供微服務一站式解決方案
-
-
-
獨立資料庫:微服務數據獨立,不要訪問其它微服務的資料庫
-
1.1.創建微服務
springcloud-demo:父工程,管理依賴
-
order-service:訂單微服務,負責訂單相關業務
-
/* Navicat Premium Data Transfer Source Server : local Source Server Type : MySQL Source Server Version : 50622 Source Host : localhost:3306 Source Schema : heima Target Server Type : MySQL Target Server Version : 50622 File Encoding : 65001 Date: 01/04/2021 14:57:18 */ create database cloud_order; use cloud_order; SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for tb_order -- ---------------------------- DROP TABLE IF EXISTS `tb_order`; CREATE TABLE `tb_order` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '訂單id', `user_id` bigint(20) NOT NULL COMMENT '用戶id', `name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '商品名稱', `price` bigint(20) NOT NULL COMMENT '商品價格', `num` int(10) NULL DEFAULT 0 COMMENT '商品數量', PRIMARY KEY (`id`) USING BTREE, UNIQUE INDEX `username`(`name`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 109 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; -- ---------------------------- -- Records of tb_order -- ---------------------------- INSERT INTO `tb_order` VALUES (101, 1, 'Apple 蘋果 iPhone 12 ', 699900, 1); INSERT INTO `tb_order` VALUES (102, 2, '雅迪 yadea 新國標電動車', 209900, 1); INSERT INTO `tb_order` VALUES (103, 3, '駱駝(CAMEL)休閑運動鞋女', 43900, 1); INSERT INTO `tb_order` VALUES (104, 4, '小米10 雙模5G 驍龍865', 359900, 1); INSERT INTO `tb_order` VALUES (105, 5, 'OPPO Reno3 Pro 雙模5G 視頻雙防抖', 299900, 1); INSERT INTO `tb_order` VALUES (106, 6, '美的(Midea) 新能效 冷靜星II ', 544900, 1); INSERT INTO `tb_order` VALUES (107, 2, '西昊/SIHOO 人體工學電腦椅子', 79900, 1); INSERT INTO `tb_order` VALUES (108, 3, '梵班(FAMDBANN)休閑男鞋', 31900, 1); SET FOREIGN_KEY_CHECKS = 1;cloud_order.sql
/* Navicat Premium Data Transfer Source Server : local Source Server Type : MySQL Source Server Version : 50622 Source Host : localhost:3306 Source Schema : heima Target Server Type : MySQL Target Server Version : 50622 File Encoding : 65001 Date: 01/04/2021 14:57:18 */ create database cloud_user; use cloud_user; SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for tb_user -- ---------------------------- DROP TABLE IF EXISTS `tb_user`; CREATE TABLE `tb_user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `username` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '收件人', `address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地址', PRIMARY KEY (`id`) USING BTREE, UNIQUE INDEX `username`(`username`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 109 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; -- ---------------------------- -- Records of tb_user -- ---------------------------- INSERT INTO `tb_user` VALUES (1, '柳岩', '湖南省衡陽市'); INSERT INTO `tb_user` VALUES (2, '文二狗', '陝西省西安市'); INSERT INTO `tb_user` VALUES (3, '華沉魚', '湖北省十堰市'); INSERT INTO `tb_user` VALUES (4, '張必沉', '天津市'); INSERT INTO `tb_user` VALUES (5, '鄭爽爽', '遼寧省沈陽市大東區'); INSERT INTO `tb_user` VALUES (6, '範兵兵', '山東省青島市'); SET FOREIGN_KEY_CHECKS = 1;cloud_user.sql
1.3.pom依賴
springcloud-demo
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.itheima</groupId> <artifactId>springcloud-demo</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>order-service</module> <module>user-service</module> </modules> <!-- 繼承springboot --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.9.RELEASE</version> <relativePath/> </parent> <!-- 版本常量 --> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Hoxton.SR10</spring-cloud.version> <mysql.version>5.1.47</mysql.version> <mybatis-plus.version>3.4.0</mybatis-plus.version> <spring-cloud-alibaba.version>2.2.5.RELEASE</spring-cloud-alibaba.version> </properties> <!-- 版本鎖定 --> <dependencyManagement> <dependencies> <!-- 繼承springCloud --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> <!-- 繼承springCloudAlibaba --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>${spring-cloud-alibaba.version}</version> <type>pom</type> <scope>import</scope> </dependency> <!-- mysql驅動 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <!--mybatisPlus 起步依賴--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>${mybatis-plus.version}</version> </dependency> </dependencies> </dependencyManagement> <!--依賴管理--> <dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies> </project>pom.xml
order-service
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>springcloud-demo</artifactId> <groupId>com.itheima</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>order-service</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>pom.xml
user-service
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent>