跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Java 微服务入门:基于 Spring Boot 搭建用户管理系统

介绍微服务架构优势及 Spring Boot 特性,通过用户管理系统案例演示从零搭建微服务。涵盖环境准备、项目创建、分层代码编写(Controller/Service/Repository)、配置优化、本地测试及生产部署流程,帮助开发者掌握 Spring Boot 微服务核心技能。

奇形怪状发布于 2026/3/26更新于 2026/6/130 浏览
Java 微服务入门:基于 Spring Boot 搭建用户管理系统

引言

2023 年,某电商平台因'618 大促'期间单体应用崩溃导致损失千万;而另一家采用微服务架构的竞品,通过'商品服务''订单服务''支付服务'独立扩容,轻松扛住 10 万 QPS。这背后的核心差异,正是微服务架构的强大韧性。

作为 Java 领域最流行的微服务开发框架,Spring Boot 凭借'零配置''开箱即用'的特性,让微服务开发从'复杂工程'变为'简单编码'。本文将通过用户管理系统的完整案例,演示如何从 0 到 1 搭建一个可运行的 Spring Boot 微服务,并掌握部署上线的核心技能。


一、微服务架构:为什么选择它?

1.1 传统单体架构的痛点

传统单体应用将所有功能(如用户管理、订单处理、支付)打包成一个 WAR/JAR 文件,虽然开发简单,但存在致命缺陷:

  • 牵一发动全身:修改一个模块需重新部署整个应用;
  • 扩容不灵活:无法针对高并发模块(如支付)单独扩容;
  • 技术栈固化:所有模块必须使用相同技术(如只能用 MySQL)。
1.2 微服务架构的核心优势

微服务(Microservices)将应用拆分为小而独立的服务单元,每个服务专注单一功能(如用户服务仅处理用户 CRUD),通过轻量级通信(如 HTTP/REST)协作。核心优势:

  • 独立部署:修改用户服务只需重启该服务,不影响其他模块;
  • 弹性扩容:用户服务流量高时,可单独增加实例;
  • 技术异构:用户服务用 Spring Boot,订单服务用 Go 语言,按需选择最优技术。
1.3 Spring Boot 与微服务的'天作之合'

Spring Boot 通过以下特性,成为微服务开发的'标配':

  • 自动配置:内置 100+ 场景配置(如 Web、JPA),无需手动编写 XML;
  • Starters 依赖管理:一个 spring-boot-starter-web 即可引入 Web 开发所有依赖;
  • 内嵌容器:内置 Tomcat/Jetty,无需手动部署到服务器;
  • 健康检查:通过 actuator 模块快速监控服务状态。

二、Spring Boot 微服务搭建:从创建到运行

2.1 环境准备
  • JDK 17+(推荐 LTS 版本,Spring Boot 3.0+ 强制要求);
  • Maven 3.8+ 或 Gradle 7.0+(本文用 Maven);
  • IDE(IntelliJ IDEA 2023+ 或 Eclipse)。
2.2 步骤 1:创建 Spring Boot 项目

使用官方提供的 Spring Initializr 快速生成项目骨架(也可通过 IDE 内置工具创建):

配置项值
ProjectMaven Project(Java)
LanguageJava
Spring Boot Version3.2.4(最新 LTS)
Groupcom.example
Artifact
user-service
DependenciesSpring Web(Web 开发)、Spring Data JPA(数据访问)、H2 Database(内存数据库)

点击'Generate'下载项目压缩包,解压后用 IDE 打开。

2.3 步骤 2:项目结构解析

生成的项目核心结构如下(仅展示关键目录):

user-service/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/
│   │   │       └── example/
│   │   │           └── userservice/
│   │   │               ├── UserServiceApplication.java (主应用类)
│   │   │               ├── controller/ (控制器层)
│   │   │               ├── service/ (服务层)
│   │   │               └── repository/(数据访问层)
│   │   └── resources/
│   │       ├── application.properties (核心配置文件)
│   │       └── data.sql (初始化 SQL 脚本,可选)
│   └── test/ (测试代码,本文暂不展开)
└── pom.xml (Maven 依赖管理文件)
2.4 步骤 3:配置文件优化(application.properties)

在 src/main/resources/application.properties 中添加以下配置,启用 H2 数据库控制台(方便调试):

# 服务基本配置
server.port=8081 # 微服务端口(避免与其他服务冲突)
spring.application.name=user-service # 服务名称(注册中心识别用)

# JPA 配置(自动建表)
spring.jpa.hibernate.ddl-auto=update # 表结构自动更新(开发阶段用,生产环境建议 validate)
spring.jpa.show-sql=true # 打印 SQL 日志(开发调试用)

# H2 数据库配置(内存数据库,无需安装)
spring.h2.console.enabled=true # 启用 H2 控制台
spring.h2.console.path=/h2-console # 控制台访问路径
2.5 步骤 4:添加业务代码(用户管理 CRUD)

我们将实现用户的增删改查功能,涉及控制器(接收 HTTP 请求)、服务层(业务逻辑)、数据访问层(操作数据库)三层。

2.5.1 数据模型(User 实体类)

创建 User.java,定义用户数据结构:

// src/main/java/com/example/userservice/model/User.java
package com.example.userservice.model;

import jakarta.persistence.*;

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

    @Column(nullable = false, length = 50)
    private String username;

    @Column(nullable = false)
    private Integer age;

    // 构造方法、Getter/Setter(省略,IDE 可自动生成)
    public User() {}

    public User(String username, Integer age) {
        this.username = username;
        this.age = age;
    }

    // Getter/Setter...
}
2.5.2 数据访问层(Repository)

创建 UserRepository.java,继承 JpaRepository 自动获得 CRUD 方法:

// src/main/java/com/example/userservice/repository/UserRepository.java
package com.example.userservice.repository;

import com.example.userservice.model.User;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
    // 无需编写代码,自动获得 save()、findById()、findAll() 等方法
}
2.5.3 服务层(Service)

创建 UserService.java,封装业务逻辑(如参数校验):

// src/main/java/com/example/userservice/service/UserService.java
package com.example.userservice.service;

import com.example.userservice.model.User;
import com.example.userservice.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.List;

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    public User createUser(User user) {
        if (!StringUtils.hasText(user.getUsername())) {
            throw new IllegalArgumentException("用户名不能为空");
        }
        return userRepository.save(user);
    }

    public User getUserById(Long id) {
        return userRepository.findById(id).orElseThrow(() -> new RuntimeException("用户不存在"));
    }

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

    public User updateUser(Long id, User user) {
        User existingUser = getUserById(id);
        existingUser.setUsername(user.getUsername());
        existingUser.setAge(user.getAge());
        return userRepository.save(existingUser);
    }

    public void deleteUser(Long id) {
        userRepository.deleteById(id);
    }
}
2.5.4 控制器层(Controller)

创建 UserController.java,处理 HTTP 请求并调用服务层:

// src/main/java/com/example/userservice/controller/UserController.java
package com.example.userservice.controller;

import com.example.userservice.model.User;
import com.example.userservice.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/users")
public class UserController {
    @Autowired
    private UserService userService;

    // 创建用户(POST /api/users)
    @PostMapping
    public ResponseEntity<User> createUser(@RequestBody User user) {
        User savedUser = userService.createUser(user);
        return new ResponseEntity<>(savedUser, HttpStatus.CREATED);
    }

    // 查询单个用户(GET /api/users/1)
    @GetMapping("/{id}")
    public ResponseEntity<User> getUserById(@PathVariable Long id) {
        User user = userService.getUserById(id);
        return ResponseEntity.ok(user);
    }

    // 查询所有用户(GET /api/users)
    @GetMapping
    public ResponseEntity<List<User>> getAllUsers() {
        List<User> users = userService.getAllUsers();
        return ResponseEntity.ok(users);
    }

    // 更新用户(PUT /api/users/1)
    @PutMapping("/{id}")
    public ResponseEntity<User> updateUser(@PathVariable Long id, @RequestBody User user) {
        User updatedUser = userService.updateUser(id, user);
        return ResponseEntity.ok(updatedUser);
    }

    // 删除用户(DELETE /api/users/1)
    @DeleteMapping("/{id}")
    public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
        userService.deleteUser(id);
        return ResponseEntity.noContent().build();
    }
}

三、本地运行与测试

3.1 启动应用

运行主类 UserServiceApplication.java(包含 @SpringBootApplication 注解的类),控制台输出:

2024-06-15 09:30:00.123 INFO 12345 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8081 (http) with context path '' 
2024-06-15 09:30:00.125 INFO 12345 --- [ main] c.e.u.UserServiceApplication : Started UserServiceApplication in 2.3 seconds (process running for 2.5)

表示服务已启动,监听 8081 端口。

3.2 测试接口(用 Postman 或 curl)
测试 1:创建用户(POST /api/users)

发送请求体(JSON):

{"username":"张三","age":28}

响应:

{"id":1,"username":"张三","age":28}

状态码:201 Created。

测试 2:查询所有用户(GET /api/users)

响应:

[{"id":1,"username":"张三","age":28}]
测试 3:访问 H2 控制台(验证数据存储)

浏览器访问 http://localhost:8081/h2-console,JDBC URL 填写 jdbc:h2:mem:testdb(默认内存数据库名),点击'Connect'进入控制台。执行 SELECT * FROM t_user,可看到刚插入的用户数据。


四、部署上线:从本地到生产环境

4.1 打包为可执行 JAR(Maven)

在项目根目录执行:

mvn clean package # 清理并打包

生成 target/user-service-0.0.1-SNAPSHOT.jar(可执行 JAR,内置 Tomcat)。

4.2 服务器部署(Linux 示例)

将 JAR 文件上传到服务器(如通过 scp 命令),执行:

java -jar user-service-0.0.1-SNAPSHOT.jar --server.port=8081 # 指定端口运行

生产环境优化建议:

  • 后台运行:用 nohup java -jar ... > app.log 2>&1 & 避免断开 SSH 后进程终止;
  • 进程管理:用 systemd 或 supervisor 管理服务(自动重启、监控);
  • 配置外部化:通过 --spring.config.location=/etc/user-service/application.properties 加载服务器配置(如数据库密码);

Docker 容器化(推荐):

# Dockerfile
FROM openjdk:17-jdk-slim
COPY target/user-service-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8081
ENTRYPOINT ["java", "-jar", "app.jar"]

构建并运行:

docker build -t user-service .
docker run -p 8081:8081 user-service

五、总结与下一步

通过本文,你已掌握:

  • 微服务架构的核心优势与 Spring Boot 的适配性;
  • Spring Boot 项目的创建、配置与依赖管理;
  • 控制器、服务层、数据访问层的分层开发;
  • 本地测试与生产部署的完整流程。

下一步可探索:

  • 服务注册与发现(集成 Eureka 或 Nacos);
  • 服务间通信(Feign 或 OpenFeign);
  • 分布式配置(Spring Cloud Config);
  • 监控与链路追踪(Spring Boot Actuator + Prometheus + Grafana)。

微服务架构具有灵活性与扩展性。完成本教程后,即可具备搭建基础微服务的能力。

目录

  1. 引言
  2. 一、微服务架构:为什么选择它?
  3. 1.1 传统单体架构的痛点
  4. 1.2 微服务架构的核心优势
  5. 1.3 Spring Boot 与微服务的“天作之合”
  6. 二、Spring Boot 微服务搭建:从创建到运行
  7. 2.1 环境准备
  8. 2.2 步骤 1:创建 Spring Boot 项目
  9. 2.3 步骤 2:项目结构解析
  10. 2.4 步骤 3:配置文件优化(application.properties)
  11. 服务基本配置
  12. JPA 配置(自动建表)
  13. H2 数据库配置(内存数据库,无需安装)
  14. 2.5 步骤 4:添加业务代码(用户管理 CRUD)
  15. 2.5.1 数据模型(User 实体类)
  16. 2.5.2 数据访问层(Repository)
  17. 2.5.3 服务层(Service)
  18. 2.5.4 控制器层(Controller)
  19. 三、本地运行与测试
  20. 3.1 启动应用
  21. 3.2 测试接口(用 Postman 或 curl)
  22. 测试 1:创建用户(POST /api/users)
  23. 测试 2:查询所有用户(GET /api/users)
  24. 测试 3:访问 H2 控制台(验证数据存储)
  25. 四、部署上线:从本地到生产环境
  26. 4.1 打包为可执行 JAR(Maven)
  27. 4.2 服务器部署(Linux 示例)
  28. Dockerfile
  29. 五、总结与下一步
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • AI 产品经理面试高频 100 题及核心解析
  • Mac M系列芯片适配:mlc-llm与llama.cpp对比
  • 大型语言模型能否遵循简单规则:RULES 基准测试分析
  • WebSSH2:基于浏览器的 SSH 终端搭建与配置
  • C++ STL 与 string 类详解:从基础概念到增删查改操作
  • 数据结构:单向链表与双向链表核心操作及实现
  • Git 工业化协作:分支策略、Commit 规范及 Rebase Merge 对比
  • 基于 SpringBoot+Vue+Netty+WebSocket+WebRTC 的视频聊天系统搭建
  • 华为 OD 机考真题:货币单位换算(多语言实现)
  • LazyCraft 开源:全功能智能体构建平台,支持应用编排与模型管理
  • 机器人第一性原理:技术演进的本构逻辑与实现路径
  • 二叉树深度计算与中后序转先序算法解析
  • 堆排序算法原理与实现
  • 9 个提升 Python 代码运行效率的实用技巧
  • 耳机阻抗与前端适配:32Ω、150Ω、300Ω耳机的功放推力分析
  • AI 产品经理必懂:数据标注流程与模型评估
  • 零基础转行网络安全就业前景与技能路径分析
  • Lit 与 Alpine.js:轻量级前端开发的两种路径
  • Java 调用 UniHttp 接口参数乱序导致百度 SN 校验失败解决方案
  • 星辰 RPA 实现小红书自动发文机器人

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online