陣列排序、去重
隨著網際網路行業的發展,對服務的要求也越來越高,服務架構也從單體架構逐漸演變為現在流行的微服務架構。這些架構之間有怎樣的差別呢?瞭解微服務架構的優缺點
單體架構:將業務的所有功能集中在一個專案中開發,打成一個包部署。
優點:
-
架構簡單
-
部署成本低
缺點:
-
耦合度高(維護困難、升級困難)
分散式架構:根據業務功能對系統做拆分,每個業務功能模組作為獨立專案開發,稱為一個服務。
優點:
-
降低服務耦合
-
有利於服務升級和拓展
缺點:
-
服務呼叫關係錯綜複雜
分散式架構雖然降低了服務耦合,但是服務拆分時也有很多問題需要思考:
-
服務拆分的粒度如何界定?
-
服務之間如何呼叫?
-
服務的呼叫關係如何管理?
人們需要制定一套行之有效的標準來約束分散式架構。
微服務的架構特徵:
-
單一職責:微服務拆分粒度更小,每一個服務都對應唯一的業務能力,做到單一職責
-
自治:團隊獨立、技術獨立、資料獨立,獨立部署和交付
-
面向服務:服務提供統一標準的介面,與語言和技術無關
-
隔離性強:服務呼叫做好隔離、容錯、降級,避免出現級聯問題
微服務的上述特性其實是在給分散式架構制定一個標準,進一步降低服務之間的耦合度,提供服務的獨立性和靈活性。做到高內聚,低耦合。
但方案該怎麼落地?選用什麼樣的技術棧?全球的網際網路公司都在積極嘗試自己的微服務落地方案。
其中在Java領域最引人注目的就是SpringCloud提供的方案了。
SpringCloud是目前國內使用最廣泛的微服務框架。官網地址:https://spring.io/projects/spring-cloud。
SpringCloud集成了各種微服務功能元件,並基於SpringBoot實現了這些元件的自動裝配,從而提供了良好的開箱即用體驗。
其中常見的元件包括:
另外,SpringCloud底層是依賴於SpringBoot的,並且有版本的相容關係,如下:
-
單體架構:簡單方便,高度耦合,擴充套件性差,適合小型專案。例如:學生管理系統
-
分散式架構:鬆耦合,擴充套件性好,但架構複雜,難度大。適合大型網際網路專案,例如:京東、淘寶
-
微服務:一種良好的分散式架構方案
①優點:拆分粒度更小、服務更獨立、耦合度更低
②缺點:架構非常複雜,運維、監控、部署難度提高
-
SpringCloud是微服務架構的一站式解決方案,集成了各種優秀微服務功能元件
任何分散式架構都離不開服務的拆分,微服務也是一樣。
2.1.服務拆分原則
這裡我總結了微服務拆分時的幾個原則:
-
不同微服務,不要重複開發相同業務
-
微服務資料獨立,不要訪問其它微服務的資料庫
-
微服務可以將自己的業務暴露為介面,供其它微服務呼叫
資料中的微服務cloud-demo為例,其結構如下:
-
order-service:訂單微服務,負責訂單相關業務
-
user-service:使用者微服務,負責使用者相關業務
要求:
-
訂單微服務和使用者微服務都必須有各自的資料庫,相互獨立
-
訂單服務和使用者服務都對外暴露Restful的介面
-
訂單服務如果需要查詢使用者資訊,只能呼叫使用者服務的Restful介面,不能查詢使用者資料庫
/* 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 */ 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;
/* 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 */ 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表中初始資料如下:
cloud-order表中初始資料如下:
cloud-order表中持有cloud-user表中的id欄位。
專案結構如下:
匯入後,會在IDEA右下角出現彈窗:
點選彈窗,然後按下圖選擇:
會出現這樣的選單:
配置下專案使用的JDK:
在order-service服務中,有一個根據id查詢訂單的介面:
根據id查詢訂單,返回值是Order物件,如圖:
其中的user為null