目录
一、准备工作
1、导入数据库
指令:
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
-v /root/mysql/data:/var/lib/mysql \
-v /root/mysql/conf:/etc/mysql/conf.d \
-v /root/mysql/init:/docker-entrypoint-initdb.d \
--network VON\
mysql
可以用本地图形化界面连接一下
不会连接的可以参考:重生之我在暑假学习微服务第三天《Docker-上篇》-CSDN博客
2、启动nginx
直接双击exe文件即可
2025/07/31 21:46:53 [emerg] 15844#64876: bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forbidden by its access permissions)
我这里在启动的时候遇到了一个错误,这段话的意思是由于 Nginx 尝试绑定到 80 端口时没有足够的权限导致的。
解决方法:
方法一
(1)查看80端口有哪些进程
注:这里打开命令行的时候要管理员模式去打开
(2) 开始逐个终止进程
不出意外这样就可以了,我这里不知道为什么进程老删除不干净,所以我直接更换端口了
方法二:
就是上面说到的更换端口
我这里准备更换到800端口,可以看到800端口没有进程
在配置文件中修改端口 (修改完成后记得保存)
显示这个就应该没问题了
成功运行了(任务管理器可以右键最下面的导航栏打开 )
可以看到前端访问成功了
2、启动后端
这里在启动之前要将启动文件换成本地
这个本地的yaml文件也要改一下
准备好后启动项目
能够访问成功就行了
3、前后端联动测试
果不其然又出错了,出来了一大片错误,大概意思就是版本不对应
知道哪里错了就开始改呗,这里的java版本全部改成11
这里又又又错了,不过问了下豆包这里不是大问题,咱们先不管它
搜索到商品了,说明运行成功了,也是十分的不容易啊
二、认识架构
1、单体架构
单体架构是一种传统的软件设计模式,整个应用程序作为一个单一的、紧密集成的单元开发和部署。所有功能模块(如用户界面、业务逻辑、数据访问层等)都打包在一个代码库中,通常共享同一个数据库。这种架构通常使用单一技术栈,便于开发、测试和部署。
优点包括开发简单、部署便捷、初期性能较高,适合小型项目或团队。但随着业务规模扩大,代码库会变得臃肿,难以维护和扩展。任何小的修改都可能需要重新部署整个应用,且技术栈升级困难。
2、微服务架构
微服务架构将应用程序拆分为一组小型、独立的服务,每个服务运行在自己的进程中,通过轻量级通信机制(如HTTP/REST或消息队列)交互。每个微服务专注于单一业务功能,可以独立开发、部署和扩展,通常拥有自己的数据库。
优点包括模块化程度高、技术栈灵活、可独立扩展和部署,适合复杂系统或大型团队。但微服务架构引入了分布式系统的复杂性,如服务发现、负载均衡、数据一致性等问题,运维和监控成本较高。
三、开始拆分
1、项目拆分原则
模块化拆分
将项目按照功能或业务模块进行划分,确保每个模块具有明确的职责和边界。模块之间通过清晰的接口进行通信,避免紧耦合。例如,电商系统可拆分为用户管理、商品管理、订单管理、支付管理等模块。
单一职责原则
每个子项目或组件应仅负责一项核心功能,避免功能混杂。例如日志记录、权限校验等跨模块功能应独立为公共组件,而非分散在各业务模块中。
可独立部署
拆分的模块应具备独立部署能力,支持灰度发布或AB测试。微服务架构中通常每个服务拥有独立数据库和运行时环境,通过API网关聚合服务。
技术栈隔离
根据技术特性划分项目,如前端与后端分离、数据处理与分析模块独立。混合技术栈(如Python+Java)时,通过RPC或消息队列解耦。
数据边界清晰
数据库按业务域拆分,避免全库共享。采用分库分表或读写分离策略,例如用户数据与订单数据分属不同数据库实例。
依赖管理
使用依赖倒置原则(DIP),高层模块不直接依赖低层模块。通过Maven/Gradle/NPM等工具管理依赖版本,循环依赖需重构为单向依赖。
团队协作适配
拆分粒度需匹配团队结构,康威定律指出组织架构会反映在系统设计中。独立团队可负责完整子项目,减少跨团队协调成本。
演进式拆分
初期可采用单体架构,随业务复杂度上升逐步拆分。监控性能瓶颈(如数据库QPS)和服务调用链,针对性优化拆分策略。
2、拆分商品服务
(1)新建item-service模块
新建的时候会发现目前的idea最低版本是java17,可是我们要求的是11,别慌,更改一下脚手架镜像就行了
解决方法:
确定之后别忘了改为11
不好意思看错了,我们创建的是maven项目
按照我这样添加就可以
直接将hm-service中的依赖拷贝过去,不需要的删除就行了
<dependencies>
<!--common-->
<dependency>
<groupId>com.heima</groupId>
<artifactId>hm-common</artifactId>
<version>1.0.0</version>
</dependency>
<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-rsa</artifactId>
<version>1.0.9.RELEASE</version>
</dependency>
<!--数据库-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--mybatis-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
(2)改造item-service
先将文件拷贝过去然后在加以修改
修改后的启动类文件
package com.hmall.item;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@MapperScan("com.hmall.item.mapper")
@SpringBootApplication
public class itemApplication {
public static void main(String[] args) {
SpringApplication.run(itemApplication.class, args);
}
}
按照我这样改就行了
因为我们这里用apifox进行接口测试即可(postman也行)
这里不需要加密,所以加密相关的也不需要
server:
port: 8081
spring:
application:
name: item-service
profiles:
active: dev
datasource:
url: jdbc:mysql://${hm.db.host}:3306/hm-item?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: ${hm.db.pw}
mybatis-plus:
configuration:
default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler
global-config:
db-config:
update-strategy: not_null
id-type: auto
logging:
level:
com.hmall: debug
pattern:
dateformat: HH:mm:ss:SSS
file:
path: "logs/${spring.application.name}"
(3)拷贝domain中商品相关的
这些都是从总项目中拷贝过来的
(4)拷贝三层架构
将有关商品的都拷贝过来
(5) 启动项目进行测试
还是和上面一样,设置成本地
设置完成后就可以启动了
这里按照规定我将首字母设置成大写了
不知道为什么这里老是报错,不知不觉已经凌晨2点了,明天在解决吧