课堂练习

发布时间 2023-10-20 16:01:15作者: 无所谓我会徒手接核弹
# JSD2306-DAY01

# 1 第五教学月课程介绍

## 1.1 课程阶段

- luban-demo: demo案例,提取一个电商原型.购物车,订单,库存.
- 特点: 轻业务,重技术,重框架.
- 目的: 学习技术框架.
- 鲁班上门: 真实项目实战
- 特点: 重业务,重技术,重经验
- 目的: 积累工作经验
- 梳理项目逐字稿|**模板**:
- 目的: 整理自定义的项目.

## 1.2 知识点|技术

### 1.2.1 微服务

- spring cloud aliaba 组件集合
- nacos
- dubbo
- sentinel
- rocketmq
- spring cloud gateway 网关

### 1.2.2 工具软件

- mysql
- redis
- 深入扩展的知识点:
- 缓存架构
- 分布式环境的 锁
- rocketmq: 消息队列

# 2 讲师联系方式

- 姓名: 肖旭伟
- 微信联系方式:
- 备注格式: 中心名称+班级+姓名
- 例子: 北京中关村JSD2306王翠花
- 微信号: xiaoxuwei4478

# 3 环境准备

## 3.1 克隆笔记仓库

https://gitee.com/xiaolaoshi2021/jsd2306-notes.git

包含以下内容:

- 每天笔记
- md格式
- pdf格式(主要是看图片)
- 资源文件
- 随着课程推进,需要什么文件,就放什么

## 3.2 克隆luban-demo

原则: 所有的软件 代码 安装和保存的路径 **不能有中文和空格**

## 3.3 替换settings.xml

当前系统中存在|不存在. 一个maven的环境系统配置文件settings.xml.

- 阿里镜像id值和名字 最好和你当前仓库使用的ali的id和名字一致

<img src="JSD2306-DAY01/image-20231020093406875.png" alt="image-20231020093406875" style="zoom:33%;" />

- 对照自己的settings.xml 修改id和name然后替换到 ${user.home}\\.m2 文件夹里.粘贴替换

- 替换之后 maven的对于仓库资源的工作逻辑

<img src="JSD2306-DAY01/image-20231020095150375.png" alt="image-20231020095150375" style="zoom:33%;" />

## 3.4 运行maven生命周期命令

问题: 在运行和使用maven的时候 总是出现一些问题,但是没有提示特别明确的内容.

### 3.4.1 生命周期

作为maven项目 maven软件管理工具 对项目的每一步都有响应的命令.

- clean: 清空 项目本地编译目录
- compile: 主动执行项目编译工作 src/main 输出到 target/classes src/test 会输出到target/test-classes
- test: 运行 在src/test 编写的测试代码 生成测试报告(目前对于后端开发没有太大作用)
- package: 将项目打成jar包.
- install: 将项目 安装到本地仓库(多个项目相互依赖 相互使用时.)

### 3.4.2 运行命令方式

- idea自带插件

<img src="JSD2306-DAY01/image-20231020101852576.png" alt="image-20231020101852576" style="zoom:33%;" />

- 自定义命令

<img src="JSD2306-DAY01/image-20231020101946745.png" alt="image-20231020101946745" style="zoom:33%;" />

<img src="JSD2306-DAY01/image-20231020102056438.png" alt="image-20231020102056438" style="zoom:33%;" />

### 3.4.3 查看maven详细错误

在自定义运行命令 添加一个选项 -X(大写)

例如: mvn clean compile -X

## 3.5 导入项目的sql文件

/doc/sql文件夹 有luban-demo.sql 导入当先windows的本地mysql数据库中.

- idea连接mysql数据库 配置连接
- 找到sql文件,右键运行 run
- 选择一下当前idea配置的数据库 点击确定

## 3.6 luban-demo流程时序图

<img src="JSD2306-DAY01/image-20231020105242793.png" alt="image-20231020105242793" style="zoom:50%;" />

## 3.7 日志配置文件

### 3.7.1 日志框架

市面上有很多日志框架 log4j log4j2 slf4j logback.... springboot中默认使用的日志框架是logback.

不同的日志框架 ,web应用中都可以使用不同**依赖+不同配置xml**实现日志输出和配置.

自行查看 study项目 luban-log-study.

### 3.7.2 自行学习日志框架

原则: 自学途径 官方权威的

- 官方网站: get stated demo example tutorial learn study...... 最终指向都是 doc
- 书籍: 最好 英文翻译的书籍.

## 3.8 启动访问

http://localhost:9000/doc.html 查看swagger接口页面.

- 增加购物车
- 减少库存

注意: 测试接口容易出现的问题. 参数匹配关系要注意.

# 4 单体架构项目的讨论

## 4.1 单体架构

开发一个web应用,将所有接口功能(绝大部分业务接口),都集中管理开发在一个项目中.

这种项目的架构就是单体架构.

例如当前demo案例: 包含的业务接口 横跨 3个大业务 **购物车** **订单** **库存**

思考: 第四阶段的项目 某个运行web应用中是否 满足单体架构的概念描述?

## 4.2 单体架构得优缺点分析

### 4.2.1 优点

- 结构简单,创建和开发成本比较低.
- 运维简单,部署成本低.

穿插知识点: 开发的项目,使用jar包如何运行

```shell
java -jar ****.jar
```

### 4.2.2 缺点

前提: 业务壮大,在发展,在变复杂.(**项目代码的接口多了**)

- 代码在大型系统中臃肿.维护更新很困难.
- 并发流量的木桶原则.

<img src="JSD2306-DAY01/image-20231020115851812.png" alt="image-20231020115851812" style="zoom:33%;" />

### 4.2.3 应用场景

互联网公司项目,面对用户群体比较庞大. **功能多,扩展快**. 不合适单体架构

传统项目,用户体量不大.功能更新扩展不迅速.

例如: 早期公司oa,财务, 养殖,国企项目.



# 5 项目的纵向拆分

## 5.1 纵向拆分的概念

系统结构演变过程 单体架构---分布式架构 纵向拆分是这种演变必要过渡阶段.

将一个系统中 按照**功能**,**逻辑**,划分成多个**独立运行**的单体系统---纵向拆分的过程.

<img src="JSD2306-DAY01/image-20231020141103910.png" alt="image-20231020141103910" style="zoom:33%;" />

将这个项目中依赖关系,根据应用功能,进行纵向拆分.

<img src="JSD2306-DAY01/image-20231020141612760.png" alt="image-20231020141612760" style="zoom:33%;" />

必定导致2个直接的问题出现:

- 拆分的独立系统之间 需要引入解决方案解决沟通问题.
- 如果需要沟通,相互应该传递应用信息.

结果: 在拆分之后,要解决更多新的问题,否则架构不能使用.

## 5.2 纵向拆分练习

### 5.2.1 目标|步骤

- 步骤
- 课上带领拆分出来order业务
- 练习将剩下的cart业务 和stock业务拆分
- 目标:
- 成功拆分
- 成功运行

- 拆分的maven应用模块结构

<img src="JSD2306-DAY01/image-20231020142752621.png" alt="image-20231020142752621" style="zoom:33%;" />

### 5.2.2 如何创建maven项目

- 右键项目任何项目标题 new project

<img src="JSD2306-DAY01/image-20231020143006262.png" alt="image-20231020143006262" style="zoom:33%;" />

- 选中左侧maven项目 next 注意 jdk版本(1.8)

<img src="JSD2306-DAY01/image-20231020143147831.png" alt="image-20231020143147831" style="zoom:33%;" />

- 填写详情信息 注意继承 和项目名称

<img src="JSD2306-DAY01/image-20231020143416613.png" alt="image-20231020143416613" style="zoom:33%;" />

### 5.2.3 创建 子工程 order-api order-main

(略)

### 5.2.4 粘贴和删除代码

拆分出来的order系统 只管理和运行order订单的业务.

- 将原有代码 luban-demo-all-main 粘贴到order-main

​ 直接粘贴src.

- 将所有业务代码和order无关的,都删除
- controller: cartController stockController
- service: cartService stockService
- mapper: cartMapper stockMapper
- 调整订单业务实现OrderServiceImpl

<img src="JSD2306-DAY01/image-20231020145441284.png" alt="image-20231020145441284" style="zoom:33%;" />

### 5.2.5 依赖管理

目标: 根据需求 提供最精简的依赖资源.

例如1: 连接数据库拿到数据库JDBC连接 使用什么依赖 mysql-connector-java

例如2: 在 springboot中整合mybatis需要至少用到哪些依赖 mybatis-spring-boot-starter mysql-connector-java

```xml
<dependencies>
<!--启动web应用 所需 spring-boot-starter-web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--依赖公用 代码资源 protocol和common-->
<dependency>
<groupId>com.tarena.luban.demo</groupId>
<artifactId>luban-demo-protocol</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!--持久层相关-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--持久层框架-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
</dependencies>
```

## 5.3 课堂跟踪练习

练习内容: 仿照课上order的拆分步骤 完成cart和stock拆分.



# 附录

# 1 问题集合

## 1.1 maven的pom文件 过期|灰色|无法识别

### 1.1.1 现象

<img src="JSD2306-DAY01/image-20231020143857693.png" alt="image-20231020143857693" style="zoom:33%;" />

### 1.1.2 原因

当前idea版本 对与删除的(remove-module)maven项目 做了自动忽略ignore操作.

### 1.1.3 解决办法

file-->settings-->搜索maven-->ignore files --> 勾掉忽略的文件.