Spring Boot3.3 架构巅峰对决:整洁架构 vs 垂直切片架构(VSA)

开发 架构
整洁架构注重模块化、职责分离,适合大型企业级应用;垂直切片架构独立性强,适合模块化程度高的系统。根据需求选择合适的架构,将为项目带来更高的可维护性和开发效率!

前言

随着软件系统复杂度的提升,选择适合的架构风格对于项目的可维护性和可扩展性至关重要。本文将通过代码示例,详细对比 整洁架构 和 垂直切片架构(Vertical Slice Architecture, VSA)在 Spring Boot3.3 项目中的应用场景和实现方式。前后端代码集成使用 Thymeleaf 模板 + jQuery + Bootstrap,展示两种架构的不同特点及实现方法。

整洁架构

整洁架构(Clean Architecture) 是一种强调分层与职责分离的软件架构风格,其核心思想是将代码按照职责划分为不同的层次,通过明确的依赖规则,保证代码的高内聚和低耦合。整洁架构通常包含以下层次:

  • 控制器层(Controller Layer):负责处理用户请求,调用服务层完成业务逻辑,并返回结果。
  • 服务层(Service Layer):包含核心业务逻辑,负责协调数据访问和业务规则。
  • 数据访问层(Repository Layer):负责与数据库或外部数据源的交互。
  • 实体层(Entity Layer):定义核心数据模型,通常为持久化对象。

整洁架构的优点:

  1. 模块化:每一层有明确的职责,便于理解和维护。
  2. 可测试性:每一层的逻辑独立,便于单元测试。
  3. 可扩展性:新增功能或更换技术栈对其他层影响较小。

适用场景:复杂度较高、需要长期维护的大型系统。

垂直切片架构(Vertical Slice Architecture, VSA)

垂直切片架构 是一种按功能模块划分的软件架构风格。与传统的分层架构不同,VSA 将一个功能的所有代码(如控制器、服务、数据访问等)放在同一个模块中,模块之间相互独立,避免了跨模块依赖。

VSA 的核心思想是以业务功能为单位,将代码组织为多个“切片”(Slice),每个切片封装一个完整的功能:

  • 独立性强:每个切片自成体系,不依赖其他模块。
  • 简化开发:减少跨模块依赖,开发者只需关注单一功能。
  • 快速迭代:新增功能仅需添加新的切片,不会影响现有系统。

VSA 的优点:

  1. 灵活性:便于快速开发新功能或修改现有功能。
  2. 隔离性:模块独立性强,减少变更的影响范围。
  3. 适应微服务:垂直切片架构可直接迁移到微服务架构中。

适用场景:业务功能明确、需要快速迭代的中小型系统或模块化较强的项目。

整洁架构实现

整洁架构通过层次划分(控制器、服务层、数据访问层),注重职责分离和模块化。以下以用户管理模块为例展示实现。

项目目录结构:

src/main/java/com/icoderoad
  ├── controller
  │     └── UserController.java
  ├── service
  │     ├── UserService.java
  │     └── UserServiceImpl.java
  ├── repository
  │     └── UserRepository.java
  ├── entity
  │     └── User.java

实体类:

package com.icoderoad.entity;


import jakarta.persistence.*;
import lombok.Data;


@Data
@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;


    @Column(nullable = false, unique = true)
    private String username;


    @Column(nullable = false)
    private String password;


    @Column(nullable = false)
    private String email;
}

数据访问层:

package com.icoderoad.repository;


import org.springframework.data.jpa.repository.JpaRepository;
import com.icoderoad.entity.User;


public interface UserRepository extends JpaRepository<User, Long> {
}

服务层接口定义:

package com.icoderoad.service;


import com.icoderoad.entity.User;


import java.util.List;


public interface UserService {
    List<User> getAllUsers();
    User createUser(User user);
}

接口实现:

package com.icoderoad.service;


import org.springframework.stereotype.Service;
import com.icoderoad.entity.User;
import com.icoderoad.repository.UserRepository;


import java.util.List;


@Service
public class UserServiceImpl implements UserService {


    private final UserRepository userRepository;


    public UserServiceImpl(UserRepository userRepository) {
        this.userRepository = userRepository;
    }


    @Override
    public List<User> getAllUsers() {
        return userRepository.findAll();
    }


    @Override
    public User createUser(User user) {
        return userRepository.save(user);
    }
}

控制器:

package com.icoderoad.controller;


import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import com.icoderoad.service.UserService;
import com.icoderoad.entity.User;


import java.util.List;


@Controller
public class UserController {


    private final UserService userService;


    public UserController(UserService userService) {
        this.userService = userService;
    }


    @GetMapping("/users")
    public String listUsers(Model model) {
        List<User> users = userService.getAllUsers();
        model.addAttribute("users", users);
        return "user-list";
    }


    @PostMapping("/users")
    public String createUser(User user) {
        userService.createUser(user);
        return "redirect:/users";
    }
}

垂直切片架构实现

垂直切片架构将功能模块作为独立的切片,模块内包含该功能的所有逻辑。

项目目录结构:

src/main/java/com/icoderoad/usermanagement
  ├── User.java
  ├── UserController.java
  ├── UserService.java
  ├── UserRepository.java

实体类:

package com.icoderoad.usermanagement;


import jakarta.persistence.*;
import lombok.Data;


@Data
@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;


    @Column(nullable = false, unique = true)
    private String username;


    @Column(nullable = false)
    private String password;


    @Column(nullable = false)
    private String email;
}

数据访问层:

package com.icoderoad.usermanagement;


import org.springframework.data.jpa.repository.JpaRepository;


public interface UserRepository extends JpaRepository<User, Long> {
}

服务层:

package com.icoderoad.usermanagement;


import org.springframework.stereotype.Service;


import java.util.List;


@Service
public class UserService {


    private final UserRepository userRepository;


    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }


    public List<User> getAllUsers() {
        return userRepository.findAll();
    }


    public User createUser(User user) {
        return userRepository.save(user);
    }
}

控制器

package com.icoderoad.usermanagement;


import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;


import java.util.List;


@Controller
public class UserController {


    private final UserService userService;


    public UserController(UserService userService) {
        this.userService = userService;
    }


    @GetMapping("/users")
    public String listUsers(Model model) {
        List<User> users = userService.getAllUsers();
        model.addAttribute("users", users);
        return "user-list";
    }


    @PostMapping("/users")
    public String createUser(User user) {
        userService.createUser(user);
        return "redirect:/users";
    }
}

前端实现

整洁架构与垂直切片架构共用相同的前端实现。

user-list.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>用户列表</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
<div class="container mt-5">
    <h1>用户列表</h1>
    <table class="table table-bordered">
        <thead>
        <tr>
            <th>ID</th>
            <th>用户名</th>
            <th>邮箱</th>
        </tr>
        </thead>
        <tbody>
        <tr th:each="user : ${users}">
            <td th:text="${user.id}"></td>
            <td th:text="${user.username}"></td>
            <td th:text="${user.email}"></td>
        </tr>
        </tbody>
    </table>
</div>
</body>
</html>

总结

整洁架构注重模块化、职责分离,适合大型企业级应用;垂直切片架构独立性强,适合模块化程度高的系统。根据需求选择合适的架构,将为项目带来更高的可维护性和开发效率!

责任编辑:武晓燕 来源: 路条编程
相关推荐

2011-07-07 09:36:15

2021-06-09 08:09:05

架构软件整洁

2022-09-14 09:27:49

CSS架构代码

2019-10-11 10:44:30

Go语言数据库软件

2022-04-18 09:41:14

Go架构设计

2024-08-26 09:15:55

RedissonMyBatisSpring

2023-06-07 15:34:21

架构层次结构

2024-08-29 08:23:22

EasyOCRSpring文字识别

2023-08-17 10:12:04

前端整洁架构

2024-11-18 00:19:44

2024-10-14 13:26:42

2022-08-08 13:24:28

整洁架构架构前端

2023-11-01 11:17:26

单体架构微服务架构

2024-09-02 08:12:32

Spring策略MyBatis

2020-06-10 10:20:24

微服务架构WEB2.0

2015-04-03 10:24:26

2023-12-25 09:49:01

Golang架构Go-Kit

2017-11-27 09:35:21

DubboSpring Clou微服务

2011-07-14 16:55:03

甲骨文虚拟桌面

2019-05-14 09:31:16

架构整洁软件编程范式
点赞
收藏

51CTO技术栈公众号