说明:本系列源于已购买正版小滴课堂相关课程自学。存在数据具有“小滴课堂”相关示意,实属正常。
技术前置
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
传统单机-分布式架构
单机架构
优点: 易于测试 便于集成 ⼩型项⽬友好
缺点: 开发速度慢 启动时间⻓ 依赖庞⼤
4.2 分布式架构
SOA :Service Oriented Architecture ⾯向服务的架构
其中包含多个服务, 服务之间通过相互依赖最终提供⼀
系列的功能, ⼀个服务 通常以独⽴的形式存在与操作系
统进程中, 各个服务之间 通过⽹络调⽤。
微服务:将⼀个⼤的单体应⽤进⾏细粒度的服务化拆
分,每个拆分出来的服务各⾃独⽴打包部署,各个服务
之间 通过⽹络调⽤。
优点
易开发、理解和维护
独⽴的部署和启动
缺点
分布式系统->分布式事务问题
需要管理多个服务->服务治理
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
架构框架图
技术栈版本控制
序号 | 名称 | 版本 | 用途 | 备注 |
---|---|---|---|---|
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 '在线教育-视频服务数据库';
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 '在线教育-用户服务数据库';
其他两个库语法类似
视频服务数据库 video表
(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");
⽤户服务数据库 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");
订单服务数据库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");
8.0 Maven聚合⼯程创建微服务项⽬
maven聚合⼯程
online-edu-common
online-edu-video-service
online-edu-user-service
online-edu-order-service
删除src目录,聚合项目不需要写任何代码。
修改pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.online_edu</groupId>
<artifactId>online-edu</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>online-edu-common</module>
<module>online-edu-video-service</module>
<module>online-edu-user-service</module>
<module>online-edu-order-service</module>
<module>online-edu-generator</module>
</modules>
<!-- 一般来说父级项目的packaging都为pom,packaging默认类型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>
<!-- <!– https://mvnrepository.com/artifact/com.baomidou/dynamic-datasource-spring-boot-starter –>-->
<!-- <dependency>-->
<!-- <groupId>com.baomidou</groupId>-->
<!-- <artifactId>dynamic-datasource-spring-boot-starter</artifactId>-->
<!-- <version>4.3.1</version>-->
<!-- </dependency>-->
<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter -->
<!-- <dependency>-->
<!-- <groupId>com.github.pagehelper</groupId>-->
<!-- <artifactId>pagehelper-spring-boot-starter</artifactId>-->
<!-- <version>2.1.0</version>-->
<!-- </dependency>-->
<!-- Spring Boot的测试启动器,包括JUnit、Spring Test等测试工具 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<addResources>true</addResources>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
创建3个子项目:
添加3个子项目依赖(online-edu-common不需要)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.onlineEdu</groupId>
<artifactId>online-edu</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>online-edu-order-service</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.onlineEdu</groupId>
<artifactId>online-edu-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
注意: 有些包maven下载慢,等待下载如果失败
删除本地仓库spring相关的包,重新执行 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
综合案例:下订单购买视频
修改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个服务:
用类似postman软件发起请求:
验证能成功跨服务调用数据。
但存在一下问题:
IP地址在代码中写死(
getForObject
)
服务之间无法提供负载均衡
多个服务直接调用,维护复杂
所以,需要引入服务治理
概念。