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

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

2023 年,某电商平台因'618 大促'期间单体应用崩溃导致损失千万;而另一家采用微服务架构的竞品,通过'商品服务''订单服务''支付服务'独立扩容,轻松扛住 10 万 QPS。这背后的核心差异,正是微服务架构的强大韧性。
作为 Java 领域最流行的微服务开发框架,Spring Boot 凭借'零配置''开箱即用'的特性,让微服务开发从'复杂工程'变为'简单编码'。本文将通过用户管理系统的完整案例,演示如何从 0 到 1 搭建一个可运行的 Spring Boot 微服务,并掌握部署上线的核心技能。
传统单体应用将所有功能(如用户管理、订单处理、支付)打包成一个 WAR/JAR 文件,虽然开发简单,但存在致命缺陷:
微服务(Microservices)将应用拆分为小而独立的服务单元,每个服务专注单一功能(如用户服务仅处理用户 CRUD),通过轻量级通信(如 HTTP/REST)协作。核心优势:
Spring Boot 通过以下特性,成为微服务开发的'标配':
spring-boot-starter-web 即可引入 Web 开发所有依赖;actuator 模块快速监控服务状态。使用官方提供的 Spring Initializr 快速生成项目骨架(也可通过 IDE 内置工具创建):
| 配置项 | 值 |
|---|---|
| Project | Maven Project(Java) |
| Language | Java |
| Spring Boot Version | 3.2.4(最新 LTS) |
| Group | com.example |
| Artifact | user-service |
| Dependencies | Spring Web(Web 开发)、Spring Data JPA(数据访问)、H2 Database(内存数据库) |
点击'Generate'下载项目压缩包,解压后用 IDE 打开。
生成的项目核心结构如下(仅展示关键目录):
user-service/
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── example/
│ │ │ └── userservice/
│ │ │ ├── UserServiceApplication.java (主应用类)
│ │ │ ├── controller/ (控制器层)
│ │ │ ├── service/ (服务层)
│ │ │ └── repository/(数据访问层)
│ │ └── resources/
│ │ ├── application.properties (核心配置文件)
│ │ └── data.sql (初始化 SQL 脚本,可选)
│ └── test/ (测试代码,本文暂不展开)
└── pom.xml (Maven 依赖管理文件)
在 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 # 控制台访问路径
我们将实现用户的增删改查功能,涉及控制器(接收 HTTP 请求)、服务层(业务逻辑)、数据访问层(操作数据库)三层。
创建 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...
}
创建 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() 等方法
}
创建 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 {
userRepository.deleteById(id);
}
}
创建 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();
ResponseEntity.ok(users);
}
ResponseEntity<User> {
userService.updateUser(id, user);
ResponseEntity.ok(updatedUser);
}
ResponseEntity<Void> {
userService.deleteUser(id);
ResponseEntity.noContent().build();
}
}
运行主类 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 端口。
发送请求体(JSON):
{"username":"张三","age":28}
响应:
{"id":1,"username":"张三","age":28}
状态码:201 Created。
响应:
[{"id":1,"username":"张三","age":28}]
浏览器访问 http://localhost:8081/h2-console,JDBC URL 填写 jdbc:h2:mem:testdb(默认内存数据库名),点击'Connect'进入控制台。执行 SELECT * FROM t_user,可看到刚插入的用户数据。
在项目根目录执行:
mvn clean package # 清理并打包
生成 target/user-service-0.0.1-SNAPSHOT.jar(可执行 JAR,内置 Tomcat)。
将 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
通过本文,你已掌握:
下一步可探索:
微服务架构具有灵活性与扩展性。完成本教程后,即可具备搭建基础微服务的能力。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online