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

 

目录

 

一、准备工作

1、导入数据库

2、启动nginx

解决方法:

方法一

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

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

方法二:

2、启动后端

3、前后端联动测试

二、认识架构

1、单体架构

2、微服务架构

三、开始拆分

1、项目拆分原则

模块化拆分

单一职责原则

可独立部署

技术栈隔离

数据边界清晰

依赖管理

团队协作适配

演进式拆分

2、拆分商品服务

(1)新建item-service模块

 (2)改造item-service

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

(4)拷贝三层架构

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值