1、儲存設計
在上一章中,我們已經完成了基本業務流程的梳理和服務模組的劃分,接下來,開始設計資料儲存。
雖然在微服務的理論中,沒有對資料庫定強制性的規範,但一般,服務拆分之後,資料庫也會對應的拆分。
這種結合業務來進行拆分的方式是資料庫拆分中的垂直拆分。
資料庫設計偷個懶,就不再用比較重的Power Designer,直接拿Navicat開幹。
根據服務的拆分,分別建立資料庫如下:
- 使用者庫(shop_user):
建表語句:
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for shop_user
-- ----------------------------
DROP TABLE IF EXISTS `shop_user`;
CREATE TABLE `shop_user` (
`user_id` int(16) NOT NULL AUTO_INCREMENT,
`user_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '使用者名稱',
`sex` tinyint(4) NULL DEFAULT 2 COMMENT '使用者性別:0:女 1:男 2:未知',
`phone` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '手機號',
`email` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '郵箱',
`address` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地址',
`count` int(64) NULL DEFAULT NULL COMMENT '積分',
`level` int(32) NULL DEFAULT 0 COMMENT '等級',
`create_user` int(16) NULL DEFAULT NULL COMMENT '建立使用者',
`create_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '建立時間',
`update_user` int(16) NULL DEFAULT NULL COMMENT '更新使用者',
`update_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新時間',
`status` tinyint(4) NULL DEFAULT 1 COMMENT '狀態',
PRIMARY KEY (`user_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '使用者表' ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
- 商品庫(shop_goods):
建表語句:
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for shop_goods
-- ----------------------------
DROP TABLE IF EXISTS `shop_goods`;
CREATE TABLE `shop_goods` (
`goods_id` int(16) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
`goods_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '商品名稱',
`price` decimal(10, 2) NULL DEFAULT NULL COMMENT '價格',
`description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '商品介紹',
`create_user` int(16) NULL DEFAULT NULL COMMENT '建立使用者',
`create_time` datetime(0) NULL DEFAULT NULL COMMENT '建立時間',
`update_user` int(16) NULL DEFAULT NULL COMMENT '更新使用者',
`update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新時間',
`status` tinyint(4) NULL DEFAULT 0 COMMENT '狀態',
PRIMARY KEY (`goods_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
- 訂單庫(shop_order):
建表語句:
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for shop_order
-- ----------------------------
DROP TABLE IF EXISTS `shop_order`;
CREATE TABLE `shop_order` (
`order_id` int(16) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
`order_amount` decimal(10, 2) NULL DEFAULT NULL COMMENT '訂單金額',
`user_id` int(16) NULL DEFAULT NULL COMMENT '使用者id',
`order_status` tinyint(4) NULL DEFAULT NULL COMMENT '訂單狀態: 1:待付款 2:已支付 3:已發貨 4:已完成 5:已關閉',
`comment` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '評價',
`create_user` int(16) NULL DEFAULT NULL COMMENT '建立使用者',
`create_time` datetime(0) NULL DEFAULT NULL COMMENT '建立時間',
`update_user` int(16) NULL DEFAULT NULL COMMENT '更新使用者',
`update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新時間',
`status` tinyint(4) NULL DEFAULT NULL COMMENT '狀態',
PRIMARY KEY (`order_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for shop_order_detail
-- ----------------------------
DROP TABLE IF EXISTS `shop_order_detail`;
CREATE TABLE `shop_order_detail` (
`order_detail_id` int(16) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
`order_id` int(16) NULL DEFAULT NULL COMMENT '訂單表主鍵',
`goods_id` int(16) NULL DEFAULT NULL COMMENT '商品表主鍵',
`goods_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '商品名稱',
`price` decimal(10, 2) NULL DEFAULT NULL COMMENT '商品價格',
`goods_count` int(32) NULL DEFAULT NULL COMMENT '商品數量',
`create_user` int(16) NULL DEFAULT NULL COMMENT '建立使用者',
`create_time` datetime(0) NULL DEFAULT NULL COMMENT '建立時間',
`update_user` int(16) NULL DEFAULT NULL COMMENT '更新使用者',
`update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新時間',
`status` tinyint(4) NULL DEFAULT 0 COMMENT '狀態',
PRIMARY KEY (`order_detail_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
庫存庫(shop_stock):
建表語句:
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for shop_stock
-- ----------------------------
DROP TABLE IF EXISTS `shop_stock`;
CREATE TABLE `shop_stock` (
`stock_id` int(16) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
`goods_id` int(16) NULL DEFAULT NULL COMMENT '商品表主鍵',
`inventory` int(64) NULL DEFAULT NULL COMMENT '庫存量',
`create_user` int(16) NULL DEFAULT NULL COMMENT '建立使用者',
`create_time` datetime(0) NULL DEFAULT NULL COMMENT '建立時間',
`update_user` int(11) NULL DEFAULT NULL COMMENT '更新使用者',
`update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新時間',
`status` tinyint(4) NULL DEFAULT 0,
PRIMARY KEY (`stock_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
支付庫(shop_finance):
建表語句:
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for shop_payment_record
-- ----------------------------
DROP TABLE IF EXISTS `shop_payment_record`;
CREATE TABLE `shop_payment_record` (
`payment_record_id` int(16) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
`order_id` int(16) NULL DEFAULT NULL COMMENT '訂單表主鍵',
`user_id` int(16) NULL DEFAULT NULL COMMENT '支付人',
`fee` decimal(16, 2) NULL DEFAULT NULL COMMENT '支付金額',
`pay_type` tinyint(4) NULL DEFAULT NULL COMMENT '支付方式 1:支付寶 2:微信支付',
`create_user` int(16) NULL DEFAULT NULL COMMENT '建立使用者',
`create_time` datetime(0) NULL DEFAULT NULL COMMENT '建立時間',
`update_user` int(11) NULL DEFAULT NULL COMMENT '更新使用者',
`update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新時間',
`status` tinyint(4) NULL DEFAULT 0 COMMENT '狀態',
PRIMARY KEY (`payment_record_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
2、基礎架構設計
我們首先看一下SpringCloud 官方的一些元件,有些元件不再維護升級,有些新的元件重新承擔起相應的責任。zuul之後推出了gateway元件,eureka之後推出了zookeeper相容。
我們接著看一下SpringCloud Alibaba的主要元件。
Dubbo是在國內應用非常廣泛的一款高效能 Java RPC 框架。
nacos作為易於構建雲原生應用的動態服務發現、配置管理和服務管理平臺。
hystrix停止開發後,交由官方Resilience4j替代來完成使命,而sentinel以更簡單輕便的方式實現類比hystrix的功能,與dubbo生態更契合。
分散式事務一直是個非常令人頭疼的問題,seata是比較易用的高效能微服務分散式事務解決方案。
我們要做的例項的一個粗略的架構圖如下,接下來,我們會圍繞SpringCloud/SpringCloud Alibaba的體系來進行我們的專案實戰。
"簡單的事情重複做,重複的事情認真做,認真的事情有創造性地做!"——
我是三分惡,可以叫我老三/三分/三哥/三子,一個能文能武的全棧開發,我們們下期見!
參考:
【1】:小專欄 SpringCloudAlibaba微服務實戰
【2】:電商系統之訂單設計篇