重生之我在暑假学习微服务第六天《微服务之拆分项目篇》

重生之我在暑假学习微服务第一天《MybatisPlus-上篇》-CSDN博客
重生之我在暑假学习微服务第二天《MybatisPlus-下篇》-CSDN博客
重生之我在暑假学习微服务第三天《Docker-上篇》-CSDN博客
重生之我在暑假学习微服务第四天《Docker-下篇》-CSDN博客
重生之我在暑假学习微服务第五天《Docker部署项目篇》-CSDN博客
未完待续
[微服务系列文章专栏]
  • 时间:每天12点前准时更新

目录

一、准备工作

1、导入数据库

2、启动nginx

解决方法:

方法一

(1)查看80端口有哪些进程

[(2) 开始逐个终止进程​编辑](#(2) 开始逐个终止进程编辑)

方法二:

2、启动后端

3、前后端联动测试

二、认识架构

1、单体架构

2、微服务架构

三、开始拆分

1、项目拆分原则

模块化拆分

单一职责原则

可独立部署

技术栈隔离

数据边界清晰

依赖管理

团队协作适配

演进式拆分

2、拆分商品服务

(1)新建item-service模块

(2)改造item-service

(3)拷贝domain中商品相关的

(4)拷贝三层架构

[(5) 启动项目进行测试](#(5) 启动项目进行测试)


一、准备工作

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点了,明天在解决吧