【SpringCloud】1.0 Java21+SpringCloud架構(gòu)初始化

說明:本系列源于已購買正版小滴課堂相關(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ā)速度慢 啟動時間? 依賴龐?


image.png

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ù)治理


image.png

5.0 微服務(wù)全家桶架構(gòu)組成

常?組件

  • ?關(guān)
    • 路由轉(zhuǎn)發(fā) + 過濾器
      • /api/v1/video/ 視頻服務(wù)
      • /api/v1/order/ 訂單服務(wù)
      • /api/v1/user/ ?戶服務(wù)
  • 服務(wù)發(fā)現(xiàn)注冊
    • 調(diào)?和被調(diào)??的信息維護(hù)
  • 配置中?
    • 管理配置,動態(tài)更新 application.properties
  • 鏈路追蹤
    • 分析調(diào)?鏈路耗時
      • 例?:下單-》查詢商品服務(wù)獲取-》商品價格-》查詢?戶信息-》保存數(shù)據(jù)庫
    • 負(fù)載均衡器
      • 分發(fā)流量到多個節(jié)點,降低壓?
    • 熔斷
      • 保護(hù)??和被調(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)框架圖

image.png
image.png

技術(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ù)庫';
image.png
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ù)庫';

其他兩個庫語法類似


image.png

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


image.png

(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");

image.png

?戶服務(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");
image.png

訂單服務(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");
image.png

8.0 Maven聚合?程創(chuàng)建微服務(wù)項?

maven聚合?程

online-edu-common
online-edu-video-service
online-edu-user-service
online-edu-order-service

image.png
image.png

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

image.png
image.png

修改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>

            <!--            &lt;!&ndash; https://mvnrepository.com/artifact/com.baomidou/dynamic-datasource-spring-boot-starter &ndash;&gt;-->
            <!--            <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個子項目:

image.png
image.png

image.png

添加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>
image.png

注意: 有些包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


image.png

綜合案例:下訂單購買視頻

修改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ù):

image.png

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


image.png

驗證能成功跨服務(wù)調(diào)用數(shù)據(jù)。

但存在一下問題:

IP地址在代碼中寫死(getForObject)
服務(wù)之間無法提供負(fù)載均衡
多個服務(wù)直接調(diào)用,維護(hù)復(fù)雜

所以,需要引入服務(wù)治理概念。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容