說明:本系列源于已購買正版小滴課堂相關(guān)課程自學(xué)。存在數(shù)據(jù)具有“小滴課堂”相關(guān)示意,實屬正常。
技術(shù)前置
1、掌握Git、java、springMVC(思想)、springboot、maven、mybatis、postgreSQL(mysql)等技術(shù)活工具的使用。
2、掌握idea、navcat、linux服務(wù)器基本運維(Ubuntu)。
分布式核心知識
CAP
-
CAP定理: 指的是在一個分布式系統(tǒng)中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分區(qū)容錯性),三者不可同時獲得
- 一致性(C):所有節(jié)點都可以訪問到最新的數(shù)據(jù)
- 可用性(A):每個請求都是可以得到響應(yīng)的,不管請求是成功還是失敗
- 分區(qū)容錯性(P):除了全部整體網(wǎng)絡(luò)故障,其他故障都不能導(dǎo)致整個系統(tǒng)不可用
-
CAP理論就是說在分布式存儲系統(tǒng)中,最多只能實現(xiàn)上面的兩點。而由于當(dāng)前的網(wǎng)絡(luò)硬件肯定會出現(xiàn)延遲丟包等問題,所以分區(qū)容錯性是我們必須需要實現(xiàn)的。所以我們只能在一致性和可用性之間進(jìn)行權(quán)衡
image.png
- CA: 如果不要求P(不允許分區(qū)),則C(強一致性)和A(可用性)是可以保證的。但放棄P的同時也就意味著放棄了系統(tǒng)的擴(kuò)展性,也就是分布式節(jié)點受限,沒辦法部署子節(jié)點,這是違背分布式系統(tǒng)設(shè)計的初衷的
- CP: 如果不要求A(可用),每個請求都需要在服務(wù)器之間保持強一致,而P(分區(qū))會導(dǎo)致同步時間無限延長(也就是等待數(shù)據(jù)同步完才能正常訪問服務(wù)),一旦發(fā)生網(wǎng)絡(luò)故障或者消息丟失等情況,就要犧牲用戶的體驗,等待所有數(shù)據(jù)全部一致了之后再讓用戶訪問系統(tǒng)
- AP:要高可用并允許分區(qū),則需放棄一致性。一旦分區(qū)發(fā)生,節(jié)點之間可能會失去聯(lián)系,為了高可用,每個節(jié)點只能用本地數(shù)據(jù)提供服務(wù),而這樣會導(dǎo)致全局?jǐn)?shù)據(jù)的不一致性。
常見的分布式核心CAP解決方案
常見注冊中心:zk、eureka、nacos
| Nacos | Eureka | Consul | Zookeeper | |
|---|---|---|---|---|
| 一致性協(xié)議 | CP+AP | AP | CP | CP |
| 健康檢查 | TCP/HTTP/MYSQL/Client Beat | 心跳 | TCP/HTTP/gRPC/Cmd | Keep Alive |
| 雪崩保護(hù) | 有 | 有 | 無 | 無 |
| 訪問協(xié)議 | HTTP/DNS | HTTP | HTTP/DNS | TCP |
| SpringCloud集成 | 支持 | 支持 | 支持 | 支持 |
- Zookeeper:CP設(shè)計,保證了一致性,集群搭建的時候,某個節(jié)點失效,則會進(jìn)行選舉行的leader,或者半數(shù)以上節(jié)點不可用,則無法提供服務(wù),因此可用性沒法滿足
- Eureka:AP原則,無主從節(jié)點,一個節(jié)點掛了,自動切換其他節(jié)點可以使用,去中心化
結(jié)論:
- 分布式系統(tǒng)中P,肯定要滿足,所以只能在CA中二選一
- 沒有最好的選擇,最好的選擇是根據(jù)業(yè)務(wù)場景來進(jìn)行架構(gòu)設(shè)計
- 如果要求一致性,則選擇zookeeper/Nacos,如金融行業(yè) CP
- 如果要求可用性,則Eureka/Nacos,如電商系統(tǒng) AP
- CP : 適合支付、交易類,要求數(shù)據(jù)強一致性,寧可業(yè)務(wù)不可用,也不能出現(xiàn)臟數(shù)據(jù)
- AP: 互聯(lián)網(wǎng)業(yè)務(wù),比如信息流架構(gòu),不要求數(shù)據(jù)強一致,更想要服務(wù)可用
分布式CAP的權(quán)衡結(jié)果——BASE理論
什么是Base理論
- CAP 中的一致性和可用性進(jìn)行一個權(quán)衡的結(jié)果,核心思想就是:我們無法做到強一致,但每個應(yīng)用都可以根據(jù)自身的業(yè)務(wù)特點,采用適當(dāng)?shù)姆绞絹硎瓜到y(tǒng)達(dá)到最終一致性.
Base:
- Basically Available(基本可用)
假設(shè)系統(tǒng),出現(xiàn)了不可預(yù)知的故障,但還是能用, 可能會有性能或者功能上的影響
- Soft state(軟狀態(tài))
允許系統(tǒng)中的數(shù)據(jù)存在中間狀態(tài),并認(rèn)為該狀態(tài)不影響系統(tǒng)的整體可用性,即允許系統(tǒng)在多個不同節(jié)點的數(shù)據(jù)副本存在數(shù)據(jù)延時
- Eventually consistent(最終一致性)
系統(tǒng)能夠保證在沒有其他新的更新操作的情況下,數(shù)據(jù)最終一定能夠達(dá)到一致的狀態(tài),因此所有客戶端對系統(tǒng)的數(shù)據(jù)訪問最終都能夠獲取到最新的值
1. 為什么用SpringCloud+Alibaba Cloud
SpringCloud和AlibabaCloud組件存在很?交集,互相配合
SpringCloud很多組件是基于第三?整合,?前多個已經(jīng)不更新了,?如zuul、eureka、hystrix等
AlibabaCloud 提供?站式微服務(wù)解決?法,已經(jīng)和SpringCloud進(jìn)?了整合,組件互相?持
AlibabaCloud官網(wǎng):https://github.com/alibaba/spring-cloud-alibaba
傳統(tǒng)單機-分布式架構(gòu)
單機架構(gòu)
優(yōu)點: 易于測試 便于集成 ?型項?友好
缺點: 開發(fā)速度慢 啟動時間? 依賴龐?

4.2 分布式架構(gòu)
SOA :Service Oriented Architecture ?向服務(wù)的架構(gòu)
其中包含多個服務(wù), 服務(wù)之間通過相互依賴最終提供?
系列的功能, ?個服務(wù) 通常以獨?的形式存在與操作系
統(tǒng)進(jìn)程中, 各個服務(wù)之間 通過?絡(luò)調(diào)?。
微服務(wù):將?個?的單體應(yīng)?進(jìn)?細(xì)粒度的服務(wù)化拆
分,每個拆分出來的服務(wù)各?獨?打包部署,各個服務(wù)
之間 通過?絡(luò)調(diào)?。
優(yōu)點
易開發(fā)、理解和維護(hù)
獨?的部署和啟動
缺點
分布式系統(tǒng)->分布式事務(wù)問題
需要管理多個服務(wù)->服務(wù)治理

5.0 微服務(wù)全家桶架構(gòu)組成
常?組件
- ?關(guān)
- 路由轉(zhuǎn)發(fā) + 過濾器
- /api/v1/video/ 視頻服務(wù)
- /api/v1/order/ 訂單服務(wù)
- /api/v1/user/ ?戶服務(wù)
- 路由轉(zhuǎn)發(fā) + 過濾器
- 服務(wù)發(fā)現(xiàn)注冊
- 調(diào)?和被調(diào)??的信息維護(hù)
- 配置中?
- 管理配置,動態(tài)更新 application.properties
- 鏈路追蹤
- 分析調(diào)?鏈路耗時
- 例?:下單-》查詢商品服務(wù)獲取-》商品價格-》查詢?戶信息-》保存數(shù)據(jù)庫
- 負(fù)載均衡器
- 分發(fā)流量到多個節(jié)點,降低壓?
- 熔斷
- 保護(hù)??和被調(diào)??
- 分析調(diào)?鏈路耗時
6.0 業(yè)界微服務(wù)架構(gòu)常?解決?案
ServiceComb
華為內(nèi)部的CSE(Cloud Service Engine)框架開源, ?個
微服務(wù)的開源解決?案,社區(qū)相對于下??個?較?
?檔不多,通信領(lǐng)域?較強dubbo
zookeeper + dubbo + springmvc/springboot
官?地址:http://dubbo.apache.org/#!/?lang=zh-cn
配套
通信?式:rpc
注冊中?:zookeper/redis/nacos
配置中?:diamond、nacos
- SpringCloud
全家桶+輕松嵌?第三?組件(Netflix 奈?)
官?:https://spring.io/projects/spring-cloud
配套
通信?式:http restful
注冊中?:eruka(閉源,淘汰)/zipkin
配置中?:config
斷路器:hystrix(不再維護(hù),淘汰)/resilence4j
?關(guān):zuul(不再維護(hù),淘汰)/gateway
分布式追蹤系統(tǒng):sleuth+zipkin
- Spring Alibaba Cloud
全家桶+阿??態(tài)多個組件組合+SpringCloud?持
官? https://spring.io/projects/spring-cloud-alibaba
配套
通信?式:http restful
注冊中?:nacos
配置中?:nacos
斷路器:sentinel
?關(guān):gateway
分布式追蹤系統(tǒng):sleuth+zipkin
6.0 微服務(wù)AlibabaCloud介紹和架構(gòu)環(huán)境準(zhǔn)備
講解AlibabaCloud核?組件介紹
官?介紹
https://spring.io/projects/spring-cloud-alibaba#overview
AlibabaCloud全家桶介紹
https://github.com/alibaba/spring-cloud-alibaba
微服務(wù)架構(gòu)
- SpringCloud
服務(wù)注冊發(fā)現(xiàn):Nacos
服務(wù)限流降級:Sentinel
分布配置中?:Nacos
分布式事務(wù)保證數(shù)據(jù)一致性:Seata
分布式定時任務(wù):Spring Scheduling Tasks
服務(wù)?關(guān):SpringCloud Gateway
異步消息削峰填谷:RocketMQ
服務(wù)之間調(diào)?:OpenFeign、Ribbon
鏈路追蹤:Sleuth+Zipkin
架構(gòu)框架圖


技術(shù)棧版本控制
| 序號 | 名稱 | 版本 | 用途 | 備注 |
|---|---|---|---|---|
| 1 | openJDK | 21 | Java JDK | |
| 2 | postgresSQL | 17.4 | 基礎(chǔ)數(shù)據(jù)庫 | |
| 3 | Maven | 3.9.9 | Java第三方依賴包管理工具 | |
| 4 | springboot | 3.4.3 | Java MVC框架 | |
| 5 | springcloud | 2024.0.1 | 微服務(wù)框架 | |
| 6 | springcloud Alibaba | 2023.0.3.2 | 阿里巴巴微服務(wù)框架擴(kuò)展 |
組件版本控制
| 序號 | 名稱 | 版本 | 用途 | 備注 |
|---|---|---|---|---|
| 1 | Nacos | 2.5.1 | 服務(wù)注冊發(fā)現(xiàn)、分布配置中? | |
| 2 | Sentinel | 1.8.8 | 服務(wù)限流降級 | 面向云原生微服務(wù)的高可用流控防護(hù)組件 |
| 3 | Seata | 2.3.0 | 分布式事務(wù)保證數(shù)據(jù)一致性 |
7.0 案例:在線教育微服務(wù)模塊
7.1 設(shè)計
在線教育模塊劃分
視頻服務(wù) online_edu_video
訂單服務(wù) online_edu_order
?戶服務(wù) online_edu_user
基礎(chǔ)環(huán)境:openJDK21+Maven3.9.9(設(shè)置默認(rèn)倉庫)+idea最新版本+postgresSQL16.x
7.2 數(shù)據(jù)庫
postgresSQL16.x使可以參考如下博文:Postgresql 從小白到高手 四 :表設(shè)計及相關(guān)工具navicat、pgAdmin的使用
采?3個數(shù)據(jù)庫,每個服務(wù)單獨?個庫
CREATE DATABASE online_edu_video
WITH
OWNER = postgres
ENCODING = 'UTF8'
LOCALE_PROVIDER = 'libc'
CONNECTION LIMIT = -1
IS_TEMPLATE = False;
COMMENT ON DATABASE online_edu_video
IS '在線教育-視頻服務(wù)數(shù)據(jù)庫';

CREATE DATABASE online_edu_order
WITH
OWNER = postgres
ENCODING = 'UTF8'
LOCALE_PROVIDER = 'libc'
CONNECTION LIMIT = -1
IS_TEMPLATE = False;
COMMENT ON DATABASE online_edu_video
IS '在線教育-訂單服務(wù)數(shù)據(jù)庫';
CREATE DATABASE online_edu_user
WITH
OWNER = postgres
ENCODING = 'UTF8'
LOCALE_PROVIDER = 'libc'
CONNECTION LIMIT = -1
IS_TEMPLATE = False;
COMMENT ON DATABASE online_edu_video
IS '在線教育-用戶服務(wù)數(shù)據(jù)庫';
其他兩個庫語法類似

視頻服務(wù)數(shù)據(jù)庫 video表

(MySQL)
CREATE TABLE `video` (
`id` int(11) unsigned NOT NULL
AUTO_INCREMENT,
`title` varchar(524) DEFAULT NULL COMMENT '視
頻標(biāo)題',
`summary` varchar(1026) DEFAULT NULL COMMENT
'概述',
`cover_img` varchar(524) DEFAULT NULL COMMENT
'封?圖',
`price` int(11) DEFAULT NULL COMMENT '價格, 分',
`create_time` datetime DEFAULT NULL COMMENT
'創(chuàng)建時間',
`point` double(11,2) DEFAULT '8.70' COMMENT
'默認(rèn)8.7,最?10分',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=48 DEFAULT
CHARSET=utf8;
INSERT INTO `video` (`id`, `title`, `summary`, `cover_img`, `price`, `create_time`, `point`)
VALUES
(30, '互聯(lián)網(wǎng)架構(gòu)之JAVA虛擬機JVM零基礎(chǔ)到高級實戰(zhàn)', 'https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/maven/%E8%AF%A6%E6%83%85%E5%9B%BE.png', 'https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/maven/%E5%AE%98%E7%BD%91%E4%B8%BB%E5%9B%BE-mawen.png', 3980, '2021-06-24 22:14:00', 9.10),
(40, '全新微信小程序零基礎(chǔ)到項目實戰(zhàn)', 'https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/%E8%AF%A6%E6%83%85%E5%9B%BE.png', 'https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/%E5%AE%98%E7%BD%91%E4%B8%BB%E5%9B%BE-%E5%B0%8F%E7%A8%8B%E5%BA%8F.png', 5980, '2021-01-18 22:14:00', 9.10),
(41, '玩轉(zhuǎn)搜索框架ElasticSearch7.x實戰(zhàn)', 'https://xd-video-pc-img.oss-cn-beijing.aliyuncs.com/xdclass_pro/video/2019_backend/elasticsearch7_detail.jpeg', 'https://xd-video-pc-img.oss-cn-beijing.aliyuncs.com/xdclass_pro/video/2019_backend/elasticsearch7.png', 4880, '2021-01-10 22:14:00', 8.70),
(45, 'Docker實戰(zhàn)視頻教程入門到高級dockerfile/compose-Harbor', 'https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/Docker/%E8%AF%A6%E6%83%85%E5%9B%BE.jpeg', 'https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/Docker/%E5%AE%98%E7%BD%91%E4%B8%BB%E5%9B%BE-docker.png', 5980, '2021-01-10 22:14:00', 9.30),
(46, '新版javase零基礎(chǔ)到高級教程小白自學(xué)編程', 'https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/%E6%96%B0%E7%89%88javase/%E8%AF%A6%E6%83%85%E5%9B%BE.png', 'https://file.xdclass.net/video/2020/%E6%96%B0%E7%89%88javase/%E5%AE%98%E7%BD%91%E4%B8%BB%E5%9B%BE-javase.png', 3980, '2021-01-24 22:14:00', 8.80),
(47, 'Nodejs教程零基礎(chǔ)入門到項目實戰(zhàn)前端視頻教程', 'https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/node/%E5%AE%98%E7%BD%91%E8%AF%A6%E6%83%85%E5%9B%BE-node.png', 'https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/node/%E5%AE%98%E7%BD%91%E4%B8%BB%E5%9B%BE-node.png', 6980, '2021-01-24 22:14:00', 8.90);
(postgresSQL)
CREATE TABLE "public"."video" (
"id" int8 NOT NULL,
"title" varchar(524) COLLATE "pg_catalog"."default",
"summary" varchar(1026) COLLATE "pg_catalog"."default",
"cover_img" varchar(524) COLLATE "pg_catalog"."default",
"price" int8,
"create_time" date,
"point" float8
)
;
COMMENT ON COLUMN "public"."video"."id" IS '主鍵';
COMMENT ON COLUMN "public"."video"."title" IS '視
頻標(biāo)題';
COMMENT ON COLUMN "public"."video"."summary" IS '概述';
COMMENT ON COLUMN "public"."video"."cover_img" IS '封?圖';
COMMENT ON COLUMN "public"."video"."price" IS '價格, 分';
COMMENT ON COLUMN "public"."video"."create_time" IS '創(chuàng)建時間';
COMMENT ON COLUMN "public"."video"."point" IS '默認(rèn)8.7,最?10分';
-- ----------------------------
-- Records of video
-- ----------------------------
INSERT INTO "public"."video" VALUES (30, '互聯(lián)網(wǎng)架構(gòu)之JAVA虛擬機JVM零基礎(chǔ)到高級實戰(zhàn)', 'https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/maven/%E8%AF%A6%E6%83%85%E5%9B%BE.png', 'https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/maven/%E5%AE%98%E7%BD%91%E4%B8%BB%E5%9B%BE-mawen.png', 3980, '2021-06-24', 9.1);
INSERT INTO "public"."video" VALUES (40, '全新微信小程序零基礎(chǔ)到項目實戰(zhàn)', 'https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/%E8%AF%A6%E6%83%85%E5%9B%BE.png', 'https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/%E5%AE%98%E7%BD%91%E4%B8%BB%E5%9B%BE-%E5%B0%8F%E7%A8%8B%E5%BA%8F.png', 5980, '2021-01-18', 9.1);
INSERT INTO "public"."video" VALUES (41, '玩轉(zhuǎn)搜索框架ElasticSearch7.x實戰(zhàn)', 'https://xd-video-pc-img.oss-cn-beijing.aliyuncs.com/xdclass_pro/video/2019_backend/elasticsearch7_detail.jpeg', 'https://xd-video-pc-img.oss-cn-beijing.aliyuncs.com/xdclass_pro/video/2019_backend/elasticsearch7.png', 4880, '2021-01-10', 8.7);
INSERT INTO "public"."video" VALUES (45, 'Docker實戰(zhàn)視頻教程入門到高級dockerfile/compose-Harbor', 'https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/Docker/%E8%AF%A6%E6%83%85%E5%9B%BE.jpeg', 'https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/Docker/%E5%AE%98%E7%BD%91%E4%B8%BB%E5%9B%BE-docker.png', 5980, '2021-01-10', 9.3);
INSERT INTO "public"."video" VALUES (46, '新版javase零基礎(chǔ)到高級教程小白自學(xué)編程', 'https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/%E6%96%B0%E7%89%88javase/%E8%AF%A6%E6%83%85%E5%9B%BE.png', 'https://file.xdclass.net/video/2020/%E6%96%B0%E7%89%88javase/%E5%AE%98%E7%BD%91%E4%B8%BB%E5%9B%BE-javase.png', 3980, '2021-01-24', 8.8);
INSERT INTO "public"."video" VALUES (47, 'Nodejs教程零基礎(chǔ)入門到項目實戰(zhàn)前端視頻教程', 'https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/node/%E5%AE%98%E7%BD%91%E8%AF%A6%E6%83%85%E5%9B%BE-node.png', 'https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/node/%E5%AE%98%E7%BD%91%E4%B8%BB%E5%9B%BE-node.png', 6980, '2021-01-24', 8.9);
-- ----------------------------
-- Primary Key structure for table video
-- ----------------------------
ALTER TABLE "public"."video" ADD CONSTRAINT "video_pkey" PRIMARY KEY ("id");

?戶服務(wù)數(shù)據(jù)庫 user表、
MySQL:
CREATE TABLE `user` (
`id` int(11) unsigned NOT NULL
AUTO_INCREMENT,
`phone` varchar(32) DEFAULT NULL,
`pwd` varchar(128) DEFAULT NULL,
`sex` int(2) DEFAULT NULL,
`img` varchar(128) DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
`role` int(11) DEFAULT NULL COMMENT '1是普通?
戶,2是管理員',
`username` varchar(128) DEFAULT NULL,
`wechat` varchar(128) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT
CHARSET=utf8mb4;
INSERT INTO `user` (`id`, `phone`, `pwd`,
`sex`, `img`, `create_time`, `role`,
`username`, `wechat`)
VALUES
(1, '123', '666', 1, 'xdclass.net', '2021-09-
09 00:00:00', 1, 'jack', 'xdclass6'),
(2, '2323432', '794666918', 1, 'wwwww',
'2020-05-20 04:54:01', 1, '?滴Anna姐姐',
'xdclass-anna'),
(3, '2323432', 'xdclass-lw', 1, 'wwwww',
'2020-05-20 04:54:42', 1, '?當(dāng)家?D',
'xdclass1'),
(4, '2323432', '3232323', 1, 'wwwww', '2020-
05-20 04:55:07', 1, '?王', 'xdclass-lw')
postgresSQL:
CREATE TABLE "public"."user" (
"id" int8 NOT NULL,
"phone" varchar(32) COLLATE "pg_catalog"."default",
"pwd" varchar(128) COLLATE "pg_catalog"."default",
"sex" int2,
"img" varchar(128) COLLATE "pg_catalog"."default",
"create_time" date,
"role" int8,
"username" varchar(128) COLLATE "pg_catalog"."default",
"wechat" varchar(128) COLLATE "pg_catalog"."default"
)
;
COMMENT ON COLUMN "public"."user"."id" IS '主鍵';
COMMENT ON COLUMN "public"."user"."phone" IS '電話/賬號';
COMMENT ON COLUMN "public"."user"."pwd" IS '密碼';
COMMENT ON COLUMN "public"."user"."sex" IS '性別,1男2女';
COMMENT ON COLUMN "public"."user"."img" IS '頭像';
COMMENT ON COLUMN "public"."user"."create_time" IS '創(chuàng)建時間';
COMMENT ON COLUMN "public"."user"."role" IS '1是普通用戶,2是管理員';
COMMENT ON COLUMN "public"."user"."username" IS '用戶名';
COMMENT ON COLUMN "public"."user"."wechat" IS '微信';
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO "public"."user" VALUES (1, '123', '666', 1, 'xdclass.net', '2021-09-09', 1, 'jack', 'xdclass6');
INSERT INTO "public"."user" VALUES (2, '2323432', '794666918', 1, 'wwwww', '2020-05-20', 1, '小滴Anna姐姐', 'xdclass-anna');
INSERT INTO "public"."user" VALUES (3, '2323432', 'xdclass-lw', 1, 'wwwww', '2020-05-20', 1, '二當(dāng)家小D', 'xdclass1');
INSERT INTO "public"."user" VALUES (4, '2323432', '3232323', 1, 'wwwww', '2020-05-20', 1, '老王', 'xdclass-lw');
-- ----------------------------
-- Primary Key structure for table user
-- ----------------------------
ALTER TABLE "public"."user" ADD CONSTRAINT "user_pkey" PRIMARY KEY ("id");

訂單服務(wù)數(shù)據(jù)庫video_order表
mysql
CREATE TABLE `video_order` (
`id` int(11) unsigned NOT NULL
AUTO_INCREMENT,
`out_trade_no` varchar(64) DEFAULT NULL
COMMENT '訂單唯?標(biāo)識',
`state` int(11) DEFAULT NULL COMMENT '0表示未
?付,1表示已?付',
`create_time` datetime DEFAULT NULL COMMENT
'訂單?成時間',
`total_fee` int(11) DEFAULT NULL COMMENT '?付
?額,單位分',
`video_id` int(11) DEFAULT NULL COMMENT '視頻
主鍵',
`video_title` varchar(256) DEFAULT NULL
COMMENT '視頻標(biāo)題',
`video_img` varchar(256) DEFAULT NULL COMMENT
'視頻圖?',
`user_id` int(12) DEFAULT NULL COMMENT '?戶
id',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=42 DEFAULT
CHARSET=utf8;
postgresSQL:
CREATE TABLE "public"."video_order" (
"id" int8 NOT NULL,
"out_trade_no" varchar(64) COLLATE "pg_catalog"."default",
"state" int8,
"create_time" date,
"total_fee" int8,
"video_id" int8,
"video_title" varchar(256) COLLATE "pg_catalog"."default",
"video_img" varchar(256) COLLATE "pg_catalog"."default",
"video_order_id" int8
)
;
COMMENT ON COLUMN "public"."video_order"."id" IS '主鍵';
COMMENT ON COLUMN "public"."video_order"."out_trade_no" IS '訂單唯?標(biāo)識';
COMMENT ON COLUMN "public"."video_order"."state" IS '0表示未
?付,1表示已?付';
COMMENT ON COLUMN "public"."video_order"."create_time" IS '訂單?成時間';
COMMENT ON COLUMN "public"."video_order"."total_fee" IS '?付
?額,單位分';
COMMENT ON COLUMN "public"."video_order"."video_id" IS '視頻
主鍵';
COMMENT ON COLUMN "public"."video_order"."video_title" IS '視頻標(biāo)題';
COMMENT ON COLUMN "public"."video_order"."video_img" IS '視頻圖?';
COMMENT ON COLUMN "public"."video_order"."video_order_id" IS '?戶
id';
-- ----------------------------
-- Records of video_order
-- ----------------------------
-- ----------------------------
-- Primary Key structure for table video_order
-- ----------------------------
ALTER TABLE "public"."video_order" ADD CONSTRAINT "video_order_pkey" PRIMARY KEY ("id");

8.0 Maven聚合?程創(chuàng)建微服務(wù)項?
maven聚合?程
online-edu-common
online-edu-video-service
online-edu-user-service
online-edu-order-service


刪除src目錄,聚合項目不需要寫任何代碼。


修改pom.xml
<?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>org.online_edu</groupId>
<artifactId>online-edu</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>online-edu-common</module>
<module>online-edu-video-service</module>
<module>online-edu-user-service</module>
<module>online-edu-order-service</module>
<module>online-edu-generator</module>
</modules>
<!-- 一般來說父級項目的packaging都為pom,packaging默認(rèn)類型jar類型-->
<packaging>pom</packaging>
<properties>
<java.version>21</java.version>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!--鎖定版本-->
<dependencyManagement>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-dependencies -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>3.3.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-dependencies -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2023.0.3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-alibaba-dependencies -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2023.0.1.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Lombok庫,用于自動生成Java的getter、setter、構(gòu)造函數(shù)等,標(biāo)記為可選依賴 -->
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.34</version>
<scope>provided</scope>
</dependency>
<!-- MyBatis-Plus啟動器,增強版MyBatis,提供更高效的操作和動態(tài)SQL能力 -->
<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-spring-boot3-starter -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.7</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-generator -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.7</version>
</dependency>
<!-- 模板引擎 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.freemarker/freemarker -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.33</version>
</dependency>
<!-- PostgreSQL的JDBC驅(qū)動 -->
<!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.7.3</version>
</dependency>
<!-- 阿里巴巴的Druid數(shù)據(jù)庫連接池,提供高性能的數(shù)據(jù)庫連接管理和監(jiān)控 -->
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<!-- <dependency>-->
<!-- <groupId>com.alibaba</groupId>-->
<!-- <artifactId>druid</artifactId>-->
<!-- <version>1.2.23</version>-->
<!-- </dependency>-->
<!-- Druid組件 -->
<!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-3-starter -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-3-starter</artifactId>
<version>1.2.23</version>
</dependency>
<!-- <!– https://mvnrepository.com/artifact/com.baomidou/dynamic-datasource-spring-boot-starter –>-->
<!-- <dependency>-->
<!-- <groupId>com.baomidou</groupId>-->
<!-- <artifactId>dynamic-datasource-spring-boot-starter</artifactId>-->
<!-- <version>4.3.1</version>-->
<!-- </dependency>-->
<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter -->
<!-- <dependency>-->
<!-- <groupId>com.github.pagehelper</groupId>-->
<!-- <artifactId>pagehelper-spring-boot-starter</artifactId>-->
<!-- <version>2.1.0</version>-->
<!-- </dependency>-->
<!-- Spring Boot的測試啟動器,包括JUnit、Spring Test等測試工具 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<addResources>true</addResources>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
創(chuàng)建3個子項目:



添加3個子項目依賴(online-edu-common不需要)
<?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>
<parent>
<groupId>org.onlineEdu</groupId>
<artifactId>online-edu</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>online-edu-order-service</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.onlineEdu</groupId>
<artifactId>online-edu-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>

注意: 有些包maven下載慢,等待下載如果失敗
刪除本地倉庫spring相關(guān)的包,重新執(zhí)行 mvn install
引入需要用到的依賴。
online-edu總項目下的pom.xml
<?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>org.online_edu</groupId>
<artifactId>online-edu</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>online-edu-common</module>
<module>online-edu-video-service</module>
<module>online-edu-user-service</module>
<module>online-edu-order-service</module>
<module>online-edu-generator</module>
</modules>
<!-- 一般來說父級項目的packaging都為pom,packaging默認(rèn)類型jar類型-->
<packaging>pom</packaging>
<properties>
<java.version>21</java.version>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- **************************** 分布式核心 **************************** -->
<spring-boot-dependencies.version>3.3.4</spring-boot-dependencies.version>
<spring-cloud-dependencies.version>2023.0.5</spring-cloud-dependencies.version>
<spring-cloud-alibaba-dependencies.version>2023.0.3.2</spring-cloud-alibaba-dependencies.version>
<spring-cloud-starter-loadbalancer.version>4.2.1</spring-cloud-starter-loadbalancer.version>
<spring-cloud-starter-openfeign.version>4.2.1</spring-cloud-starter-openfeign.version>
<!-- **************************** 分布式核心 **************************** -->
<!-- **************************** 數(shù)據(jù)庫依賴 **************************** -->
<mybatis-plus-spring-boot3-starter.version>3.5.10.1</mybatis-plus-spring-boot3-starter.version>
<mybatis-plus-generator.version>${mybatis-plus-spring-boot3-starter.version}</mybatis-plus-generator.version>
<postgresql.version>42.7.5</postgresql.version>
<druid-spring-boot-3-starter.version>1.2.24</druid-spring-boot-3-starter.version>
<pagehelper-spring-boot-starter.version>2.1.0</pagehelper-spring-boot-starter.version>
<!-- **************************** 數(shù)據(jù)庫依賴 **************************** -->
<!-- **************************** 工具類 **************************** -->
<org.mapstruct.version>1.6.0</org.mapstruct.version>
<commons-collections4.version>4.5.0-M3</commons-collections4.version>
<guava.version>33.4.5-jre</guava.version>
<hutool-all.version>5.8.36</hutool-all.version>
<!-- **************************** 工具類 **************************** -->
</properties>
<!--鎖定版本-->
<dependencyManagement>
<dependencies>
<!-- **************************** 分布式核心 **************************** -->
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-dependencies -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot-dependencies.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-dependencies -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud-dependencies.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-alibaba-dependencies -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba-dependencies.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-loadbalancer -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
<version>${spring-cloud-starter-loadbalancer.version}</version>
</dependency>
<!-- 負(fù)載均衡-openfeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>${spring-cloud-starter-openfeign.version}</version>
</dependency>
<!-- **************************** 分布式核心 **************************** -->
<!-- **************************** 數(shù)據(jù)庫依賴 **************************** -->
<!-- MyBatis-Plus啟動器,增強版MyBatis,提供更高效的操作和動態(tài)SQL能力 -->
<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-spring-boot3-starter -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>${mybatis-plus-spring-boot3-starter.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-generator -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>${mybatis-plus-generator.version}</version>
</dependency>
<!-- PostgreSQL的JDBC驅(qū)動 -->
<!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>${postgresql.version}</version>
</dependency>
<!-- Druid組件 -->
<!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-3-starter -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-3-starter</artifactId>
<version>${druid-spring-boot-3-starter.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>${pagehelper-spring-boot-starter.version}</version>
</dependency>
<!-- **************************** 數(shù)據(jù)庫依賴 **************************** -->
<!-- **************************** 工具類 **************************** -->
<!-- 一個用于在 Java Bean 之間轉(zhuǎn)換的代碼生成工具。-->
<!-- 官網(wǎng):https://mapstruct.org/ -->
<!-- https://mvnrepository.com/artifact/org.mapstruct/mapstruct -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mapstruct/mapstruct-processor -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
<!-- commons-lang3: 通用的、可復(fù)用的 Java 組件,已其他包引入-->
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<!--(Map、List、Set集合全覆蓋)集合開發(fā)工具-->
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>${commons-collections4.version}</version>
</dependency>
<!-- Java增強器,像Java Next版本-->
<!-- 集合 [collections] 、緩存 [caching] 、原生類型支持 [primitives support] 、
并發(fā)庫 [concurrency libraries] 、通用注解 [common annotations] 、
字符串處理 [string processing] 、I/O 等等-->
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>${guava.version}</version>
</dependency>
<!-- Java必備工具庫 -->
<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool-all.version}</version>
</dependency>
<!-- JSON序列化和反序列化 :已由別的包引入-->
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<!-- **************************** 工具類 **************************** -->
</dependencies>
</dependencyManagement>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
online-edu-common的pom.xml
<?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>
<parent>
<groupId>org.online_edu</groupId>
<artifactId>online-edu</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>online-edu-common</artifactId>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
</project>
online-edu-user-service的pom.xml:
<?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>
<parent>
<groupId>org.online_edu</groupId>
<artifactId>online-edu</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>online-edu-user-service</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.online_edu</groupId>
<artifactId>online-edu-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.alibaba.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>-->
<!-- </dependency>-->
<!-- 添加nacos客戶端——服務(wù)注冊 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
</dependency>
<!-- PostgreSQL的JDBC驅(qū)動 -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-3-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
</dependency>
</dependencies>
</project>
online-edu-order-service的pom.xml:
<?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>
<parent>
<groupId>org.online_edu</groupId>
<artifactId>online-edu</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>online-edu-order-service</artifactId>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.online_edu</groupId>
<artifactId>online-edu-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.alibaba.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>-->
<!-- </dependency>-->
<!-- 添加nacos客戶端——服務(wù)注冊 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
</dependency>
<!-- PostgreSQL的JDBC驅(qū)動 -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-3-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
</dependency>
</dependencies>
</project>
online-edu-video-service的pom.xml
<?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>
<parent>
<groupId>org.online_edu</groupId>
<artifactId>online-edu</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>online-edu-video-service</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.online_edu</groupId>
<artifactId>online-edu-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.alibaba.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>-->
<!-- </dependency>-->
<!-- 添加nacos客戶端——服務(wù)注冊 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
</dependency>
<!-- PostgreSQL的JDBC驅(qū)動 -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-3-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
</dependency>
</dependencies>
</project>
MySQL的jdbc依賴,網(wǎng)上資料一大片,這里不做研究。
9.common項目創(chuàng)建實體類
放在這里是,因為其他項目都會依賴到。
刪掉common項目原有的文件路徑,新建如下:
修改online-edu-video-service/src/main/resources/application.yml
10. Mybatis依賴導(dǎo)入+數(shù)據(jù)配置
server:
port: 9000
spring:
application:
name: online-edu-video-service
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:postgresql://localhost:5432/online_edu_video?currentSchema=public
username: postgres
password: 123456
driver-class-name: org.postgresql.Driver
druid:
# 數(shù)據(jù)庫
# 連接池-初始化大小
initial-size: 10
# 連接池-最大連接數(shù)
max-active: 100
# 最大等待時間
max-wait: 60000
# 連接池-最小空閑數(shù)
min-idle: 10
# 檢測空閑連接
test-while-idle: true
# 最小空閑時間
min-evictable-idle-time-millis: 300000
mybatis-plus:
# Mapper XML文件路徑
mapper-locations: classpath:/mapper/**/*.xml
# 實體類別名包路徑
type-aliases-package: org.online_edu.domain
configuration:
# MyBatis底層日志實現(xiàn)
# 控制臺輸出sql、下劃線轉(zhuǎn)駝峰
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true
# PageHelper分頁插件
pagehelper:
# 數(shù)據(jù)庫類型
helperDialect: postgresql
# 是否合理處理count查詢
reasonable: true
# 支持通過Map傳入分頁參數(shù)
supportMethodsArguments: true
# 自定義參數(shù)
params: count=countSql
運行:
測試數(shù)據(jù)庫連接
online-edu-video-service/src/main/java/org/online_edu/controller/VideoController.java
package org.online_edu.controller;
import org.online_edu.domain.Video;
import org.online_edu.service.VideoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("api/v1/video")
public class VideoController {
@Autowired
private VideoService videoService;
@RequestMapping("/find_by_id")
public Video findById(@RequestParam(name="videoId") int videoId) {
return videoService.findById(videoId);
}
}
online-edu-video-service/src/main/java/org/online_edu/VideoApplication.java
package org.online_edu;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication()
@MapperScan("org.online_edu.dao")
public class VideoApplication {
public static void main(String[] args) {
SpringApplication.run(VideoApplication.class, args);
}
}
online-edu-video-service/src/main/java/org/online_edu/service/VideoService.java
package org.online_edu.service;
import org.online_edu.domain.Video;
public interface VideoService {
Video findById(int videoId);
}
online-edu-video-service/src/main/java/org/online_edu/service/impl/VideoServiceImpl.java
package org.online_edu.service.impl;
import org.online_edu.dao.VideoMapper;
import org.online_edu.domain.Video;
import org.online_edu.service.VideoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class VideoServiceImpl implements VideoService {
@Autowired
private VideoMapper videoMapper;
@Override
public Video findById(int videoId) {
return videoMapper.findById(videoId);
}
}
online-edu-video-service/src/main/java/org/online_edu/dao/VideoMapper.java
package org.online_edu.dao;
import org.apache.ibatis.annotations.Select;
import org.online_edu.domain.Video;
import org.springframework.stereotype.Repository;
@Repository
public interface VideoMapper {
@Select("select * from video where id=#{videoId}")
Video findById(int videoId);
}
運行online-edu-video-service項目,瀏覽器打開
localhost:9000/api/v1/video/find_by_id?videoId=30

綜合案例:下訂單購買視頻
修改online-edu-order-service項目。
online-edu-order-service/src/main/resources/application.yml
server:
port: 8000
spring:
application:
name: online-edu-order-service
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:postgresql://localhost:5432/online_edu_order?currentSchema=public
username: postgres
password: 123456
driver-class-name: org.postgresql.Driver
druid:
# 數(shù)據(jù)庫
# 連接池-初始化大小
initial-size: 10
# 連接池-最大連接數(shù)
max-active: 100
# 最大等待時間
max-wait: 60000
# 連接池-最小空閑數(shù)
min-idle: 10
# 檢測空閑連接
test-while-idle: true
# 最小空閑時間
min-evictable-idle-time-millis: 300000
mybatis-plus:
# Mapper XML文件路徑
mapper-locations: classpath:/mapper/**/*.xml
# 實體類別名包路徑
type-aliases-package: org.online_edu.domain
configuration:
# MyBatis底層日志實現(xiàn)
# 控制臺輸出sql、下劃線轉(zhuǎn)駝峰
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true
# PageHelper分頁插件
pagehelper:
# 數(shù)據(jù)庫類型
helperDialect: postgresql
# 是否合理處理count查詢
reasonable: true
# 支持通過Map傳入分頁參數(shù)
supportMethodsArguments: true
# 自定義參數(shù)
params: count=countSql
online-edu-order-service/src/main/java/org/online_edu/OrderApplication.java
package org.online_edu;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
/**
* @Author: bobokaka
* @Date: 2024-08-23 00:18:14
* @LastEditors: bobokaka
* @Description: desc
**/
@SpringBootApplication()
@MapperScan("org.online_edu.dao")
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
@Bean
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
online-edu-order-service/src/main/java/org/online_edu/controller/VideoOrderController.java
package org.online_edu.controller;
import org.online_edu.domain.Video;
import org.online_edu.domain.VideoOrder;
import org.online_edu.service.VideoOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import java.util.Date;
/**
* (VideoOrder)表控制層
*
* @author makejava
* @since 2024-08-30 23:00:25
*/
@RestController
@RequestMapping("/api/v1/video_order")
public class VideoOrderController {
/**
* 服務(wù)對象
*/
@Autowired
private VideoOrderService videoOrderService;
@Autowired
private RestTemplate restTemplate;
@RequestMapping("save")
public Object save(@RequestParam(name="videoId") int videoId) {
Video video = restTemplate.getForObject(
"http://localhost:9000/api/v1/video/find_by_id?videoId=" + videoId, Video.class);
VideoOrder videoOrder = new VideoOrder();
if (video != null) {
videoOrder.setVideoId(video.getId());
videoOrder.setVideoTitle(video.getTitle());
videoOrder.setCreateTime(new Date());
}
return videoOrder;
}
}
創(chuàng)建dao包(文件夾)防止報錯,運行2個服務(wù):

用類似postman軟件發(fā)起請求:

驗證能成功跨服務(wù)調(diào)用數(shù)據(jù)。
但存在一下問題:
IP地址在代碼中寫死(
getForObject)
服務(wù)之間無法提供負(fù)載均衡
多個服務(wù)直接調(diào)用,維護(hù)復(fù)雜
所以,需要引入服務(wù)治理概念。
