【SpringCloud】1.0 Java21+SpringCloud架构初始化

说明:本系列源于已购买正版小滴课堂相关课程自学。存在数据具有“小滴课堂”相关示意,实属正常。

技术前置

1、掌握Git、java、springMVC(思想)、springboot、maven、mybatis、postgreSQL(mysql)等技术活工具的使用。
2、掌握idea、navcat、linux服务器基本运维(Ubuntu)。

分布式核心知识

CAP

  • CAP定理: 指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可同时获得

    • 一致性(C):所有节点都可以访问到最新的数据
    • 可用性(A):每个请求都是可以得到响应的,不管请求是成功还是失败
    • 分区容错性(P):除了全部整体网络故障,其他故障都不能导致整个系统不可用
  • CAP理论就是说在分布式存储系统中,最多只能实现上面的两点。而由于当前的网络硬件肯定会出现延迟丢包等问题,所以分区容错性是我们必须需要实现的。所以我们只能在一致性和可用性之间进行权衡


    image.png
  • CA: 如果不要求P(不允许分区),则C(强一致性)和A(可用性)是可以保证的。但放弃P的同时也就意味着放弃了系统的扩展性,也就是分布式节点受限,没办法部署子节点,这是违背分布式系统设计的初衷的
  • CP: 如果不要求A(可用),每个请求都需要在服务器之间保持强一致,而P(分区)会导致同步时间无限延长(也就是等待数据同步完才能正常访问服务),一旦发生网络故障或者消息丢失等情况,就要牺牲用户的体验,等待所有数据全部一致了之后再让用户访问系统
  • AP:要高可用并允许分区,则需放弃一致性。一旦分区发生,节点之间可能会失去联系,为了高可用,每个节点只能用本地数据提供服务,而这样会导致全局数据的不一致性。

常见的分布式核心CAP解决方案

常见注册中心:zk、eureka、nacos

Nacos Eureka Consul Zookeeper
一致性协议 CP+AP AP CP CP
健康检查 TCP/HTTP/MYSQL/Client Beat 心跳 TCP/HTTP/gRPC/Cmd Keep Alive
雪崩保护
访问协议 HTTP/DNS HTTP HTTP/DNS TCP
SpringCloud集成 支持 支持 支持 支持
  • Zookeeper:CP设计,保证了一致性,集群搭建的时候,某个节点失效,则会进行选举行的leader,或者半数以上节点不可用,则无法提供服务,因此可用性没法满足
  • Eureka:AP原则,无主从节点,一个节点挂了,自动切换其他节点可以使用,去中心化

结论:

  • 分布式系统中P,肯定要满足,所以只能在CA中二选一
  • 没有最好的选择,最好的选择是根据业务场景来进行架构设计
  • 如果要求一致性,则选择zookeeper/Nacos,如金融行业 CP
  • 如果要求可用性,则Eureka/Nacos,如电商系统 AP
  • CP : 适合支付、交易类,要求数据强一致性,宁可业务不可用,也不能出现脏数据
  • AP: 互联网业务,比如信息流架构,不要求数据强一致,更想要服务可用

分布式CAP的权衡结果——BASE理论

什么是Base理论

  • CAP 中的一致性和可用性进行一个权衡的结果,核心思想就是:我们无法做到强一致,但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性.
Base:
  • Basically Available(基本可用)

假设系统,出现了不可预知的故障,但还是能用, 可能会有性能或者功能上的影响

  • Soft state(软状态)

允许系统中的数据存在中间状态,并认为该状态不影响系统的整体可用性,即允许系统在多个不同节点的数据副本存在数据延时

  • Eventually consistent(最终一致性)

系统能够保证在没有其他新的更新操作的情况下,数据最终一定能够达到一致的状态,因此所有客户端对系统的数据访问最终都能够获取到最新的值

1. 为什么用SpringCloud+Alibaba Cloud

SpringCloud和AlibabaCloud组件存在很⼤交集,互相配合
SpringCloud很多组件是基于第三⽅整合,⽬前多个已经不更新了,⽐如zuul、eureka、hystrix等
AlibabaCloud 提供⼀站式微服务解决⽅法,已经和SpringCloud进⾏了整合,组件互相⽀持

AlibabaCloud官网:https://github.com/alibaba/spring-cloud-alibaba

传统单机-分布式架构

单机架构

优点: 易于测试 便于集成 ⼩型项⽬友好
缺点: 开发速度慢 启动时间⻓ 依赖庞⼤


image.png

4.2 分布式架构

SOA :Service Oriented Architecture ⾯向服务的架构
其中包含多个服务, 服务之间通过相互依赖最终提供⼀
系列的功能, ⼀个服务 通常以独⽴的形式存在与操作系
统进程中, 各个服务之间 通过⽹络调⽤。

微服务:将⼀个⼤的单体应⽤进⾏细粒度的服务化拆
分,每个拆分出来的服务各⾃独⽴打包部署,各个服务
之间 通过⽹络调⽤。

优点
易开发、理解和维护
独⽴的部署和启动

缺点
分布式系统->分布式事务问题
需要管理多个服务->服务治理


image.png

5.0 微服务全家桶架构组成

常⻅组件

  • ⽹关
    • 路由转发 + 过滤器
      • /api/v1/video/ 视频服务
      • /api/v1/order/ 订单服务
      • /api/v1/user/ ⽤户服务
  • 服务发现注册
    • 调⽤和被调⽤⽅的信息维护
  • 配置中⼼
    • 管理配置,动态更新 application.properties
  • 链路追踪
    • 分析调⽤链路耗时
      • 例⼦:下单-》查询商品服务获取-》商品价格-》查询⽤户信息-》保存数据库
    • 负载均衡器
      • 分发流量到多个节点,降低压⼒
    • 熔断
      • 保护⾃⼰和被调⽤⽅

6.0 业界微服务架构常⻅解决⽅案

  • ServiceComb
    华为内部的CSE(Cloud Service Engine)框架开源, ⼀个
    微服务的开源解决⽅案,社区相对于下⾯⼏个⽐较⼩
    ⽂档不多,通信领域⽐较强

  • 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(不再维护,淘汰)/resilence4j
    ⽹关:zuul(不再维护,淘汰)/gateway
    分布式追踪系统:sleuth+zipkin
  • Spring Alibaba Cloud
    全家桶+阿⾥⽣态多个组件组合+SpringCloud⽀持
    官⽹ https://spring.io/projects/spring-cloud-alibaba
    配套
    通信⽅式:http restful
    注册中⼼:nacos
    配置中⼼:nacos
    断路器:sentinel
    ⽹关:gateway
    分布式追踪系统:sleuth+zipkin

6.0 微服务AlibabaCloud介绍和架构环境准备

讲解AlibabaCloud核⼼组件介绍
官⽹介绍
https://spring.io/projects/spring-cloud-alibaba#overview

AlibabaCloud全家桶介绍
https://github.com/alibaba/spring-cloud-alibaba

微服务架构

  • SpringCloud
    服务注册发现:Nacos
    服务限流降级:Sentinel
    分布配置中⼼:Nacos
    分布式事务保证数据一致性:Seata
    分布式定时任务:Spring Scheduling Tasks
    服务⽹关:SpringCloud Gateway
    异步消息削峰填谷:RocketMQ
    服务之间调⽤:OpenFeign、Ribbon
    链路追踪:Sleuth+Zipkin

架构框架图

image.png
image.png

技术栈版本控制

序号 名称 版本 用途 备注
1 openJDK 21 Java JDK
2 postgresSQL 17.4 基础数据库
3 Maven 3.9.9 Java第三方依赖包管理工具
4 springboot 3.4.3 Java MVC框架
5 springcloud 2024.0.1 微服务框架
6 springcloud Alibaba 2023.0.3.2 阿里巴巴微服务框架扩展

组件版本控制

序号 名称 版本 用途 备注
1 Nacos 2.5.1 服务注册发现、分布配置中⼼
2 Sentinel 1.8.8 服务限流降级 面向云原生微服务的高可用流控防护组件
3 Seata 2.3.0 分布式事务保证数据一致性

7.0 案例:在线教育微服务模块

7.1 设计

在线教育模块划分
视频服务 online_edu_video
订单服务 online_edu_order
⽤户服务 online_edu_user
基础环境:openJDK21+Maven3.9.9(设置默认仓库)+idea最新版本+postgresSQL16.x

7.2 数据库

postgresSQL16.x使可以参考如下博文:Postgresql 从小白到高手 四 :表设计及相关工具navicat、pgAdmin的使用

采⽤3个数据库,每个服务单独⼀个库

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 '在线教育-视频服务数据库';
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 '在线教育-订单服务数据库';

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 '在线教育-用户服务数据库';

其他两个库语法类似


image.png

视频服务数据库 video表


image.png

(MySQL)

CREATE TABLE `video` (
 `id` int(11) unsigned NOT NULL
AUTO_INCREMENT,
 `title` varchar(524) DEFAULT NULL COMMENT '视
频标题',
 `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
'创建时间',
 `point` double(11,2) DEFAULT '8.70' COMMENT
'默认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, '互联网架构之JAVA虚拟机JVM零基础到高级实战', '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, '全新微信小程序零基础到项目实战', '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, '玩转搜索框架ElasticSearch7.x实战', '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实战视频教程入门到高级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零基础到高级教程小白自学编程', '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教程零基础入门到项目实战前端视频教程', '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 '视
频标题';
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 '创建时间';
COMMENT ON COLUMN "public"."video"."point" IS '默认8.7,最⾼10分';

-- ----------------------------
-- Records of video
-- ----------------------------
INSERT INTO "public"."video" VALUES (30, '互联网架构之JAVA虚拟机JVM零基础到高级实战', '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, '全新微信小程序零基础到项目实战', '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, '玩转搜索框架ElasticSearch7.x实战', '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实战视频教程入门到高级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零基础到高级教程小白自学编程', '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教程零基础入门到项目实战前端视频教程', '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

⽤户服务数据库 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',
'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 '创建时间';
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', '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

订单服务数据库video_order表
mysql

CREATE TABLE `video_order` (
 `id` int(11) unsigned NOT NULL
AUTO_INCREMENT,
 `out_trade_no` varchar(64) DEFAULT NULL
COMMENT '订单唯⼀标识',
 `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 '视频标题',
 `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 '订单唯⼀标识';
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 '视频标题';
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聚合⼯程创建微服务项⽬

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默认类型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、构造函数等,标记为可选依赖 -->
            <!-- 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,提供更高效的操作和动态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驱动 -->
            <!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
            <dependency>
                <groupId>org.postgresql</groupId>
                <artifactId>postgresql</artifactId>
                <version>42.7.3</version>
            </dependency>
            <!-- 阿里巴巴的Druid数据库连接池,提供高性能的数据库连接管理和监控 -->
            <!-- 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>

创建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相关的包,重新执行 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默认类型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>
        <!-- **************************** 分布式核心 **************************** -->
        <!-- **************************** 数据库依赖 **************************** -->
        <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>
        <!-- **************************** 数据库依赖 **************************** -->
        <!-- **************************** 工具类 **************************** -->
        <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>
            <!-- 负载均衡-openfeign -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
                <version>${spring-cloud-starter-openfeign.version}</version>
            </dependency>
            <!-- **************************** 分布式核心 **************************** -->

            <!-- **************************** 数据库依赖 **************************** -->
            <!-- MyBatis-Plus启动器,增强版MyBatis,提供更高效的操作和动态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驱动 -->
            <!-- 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>

            <!-- **************************** 数据库依赖 **************************** -->

            <!-- **************************** 工具类 **************************** -->
            <!-- 一个用于在 Java Bean 之间转换的代码生成工具。-->
            <!-- 官网: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:  通用的、可复用的 Java 组件,已其他包引入-->
            <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->

            <!--(Map、List、Set集合全覆盖)集合开发工具-->
            <!-- 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] 、
            并发库 [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客户端——服务注册 -->
        <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驱动 -->
        <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客户端——服务注册 -->
        <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驱动 -->
        <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客户端——服务注册 -->
        <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驱动 -->
        <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依赖,网上资料一大片,这里不做研究。

9.common项目创建实体类

放在这里是,因为其他项目都会依赖到。

删掉common项目原有的文件路径,新建如下:
修改online-edu-video-service/src/main/resources/application.yml

10. Mybatis依赖导入+数据配置

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:
      # 数据库
      # 连接池-初始化大小
      initial-size: 10
      # 连接池-最大连接数
      max-active: 100
      # 最大等待时间
      max-wait: 60000
      # 连接池-最小空闲数
      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底层日志实现
    # 控制台输出sql、下划线转驼峰
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: true

# PageHelper分页插件
pagehelper:
  # 数据库类型
  helperDialect: postgresql
  # 是否合理处理count查询
  reasonable: true
  # 支持通过Map传入分页参数
  supportMethodsArguments: true
  # 自定义参数
  params: count=countSql

运行:

测试数据库连接

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:
      # 数据库
      # 连接池-初始化大小
      initial-size: 10
      # 连接池-最大连接数
      max-active: 100
      # 最大等待时间
      max-wait: 60000
      # 连接池-最小空闲数
      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底层日志实现
    # 控制台输出sql、下划线转驼峰
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: true

# PageHelper分页插件
pagehelper:
  # 数据库类型
  helperDialect: postgresql
  # 是否合理处理count查询
  reasonable: true
  # 支持通过Map传入分页参数
  supportMethodsArguments: true
  # 自定义参数
  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 {

    /**
     * 服务对象
     */
    @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;
    }

}

创建dao包(文件夹)防止报错,运行2个服务:

image.png

用类似postman软件发起请求:


image.png

验证能成功跨服务调用数据。

但存在一下问题:

IP地址在代码中写死(getForObject)
服务之间无法提供负载均衡
多个服务直接调用,维护复杂

所以,需要引入服务治理概念。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。