一、核心概念
微服务(Microservices)是一种将单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,使用轻量级通信机制(通常是 HTTP REST API 或消息队列)进行交互。这些服务围绕业务能力构建,可以独立部署、独立扩展,并可由不同的团队使用不同的技术栈开发。
1. 核心原则
- 单一职责原则 (SRP): 每个微服务专注于一个明确的业务领域或能力(如用户管理、订单处理、支付)。
- 独立部署: 服务可以独立于其他服务进行构建、测试和部署,实现快速迭代和持续交付。
- 技术异构性: 不同的服务可以使用最适合其需求的编程语言、数据库和框架。
- 弹性 (Resilience): 服务应能处理其依赖服务的故障(如超时、熔断、降级)。
- 去中心化治理: 团队拥有服务的全生命周期,包括技术选型、部署和运维。
- 基础设施自动化: 依赖 CI/CD 管道、容器化(Docker)和编排(Kubernetes)实现自动化部署和管理。
- 服务发现 (Service Discovery): 服务需要一种机制来动态发现和调用其他服务的实例(因为实例的网络位置是动态的)。
- 配置中心 (Configuration Center): 集中管理所有服务的配置,支持动态更新。
- API 网关 (API Gateway): 作为系统的统一入口,负责路由请求、认证授权、限流、监控等。
- 分布式追踪 (Distributed Tracing): 跟踪一个请求在多个服务间的流转路径,用于性能分析和故障排查。
- 断路器 (Circuit Breaker): 防止一个服务的故障导致整个系统雪崩。
2. 关键技术栈 (Java 生态)
- Spring Boot: 快速构建独立、生产级别的 Spring 应用的基础。
- Spring Cloud: 一套用于构建微服务架构的工具集,提供服务发现、配置中心、API 网关、负载均衡、熔断器等实现。
- 服务注册与发现:
Eureka
,Consul
,Nacos
,Zookeeper
。 - 配置中心:
Spring Cloud Config Server
,Nacos
,Consul
,Apollo
。 - API 网关:
Spring Cloud Gateway
,Zuul
(已过时)。 - 负载均衡:
Ribbon
(已过时),Spring Cloud LoadBalancer
。 - 熔断与容错:
Hystrix
(已进入维护模式),Resilience4j
,Sentinel
。 - 远程调用 (RPC):
Feign
(声明式 HTTP 客户端),OpenFeign
,RestTemplate
(已过时),WebClient
(响应式)。 - 消息驱动:
Spring Cloud Stream
(集成Kafka
,RabbitMQ
)。 - 分布式追踪:
Spring Cloud Sleuth
+Zipkin
/Jaeger
。 - 容器化:
Docker
。 - 编排:
Kubernetes (K8s)
。 - 数据库: 通常每个服务拥有独立的数据库(可以是不同类型的数据库,如 MySQL, PostgreSQL, MongoDB, Redis),避免共享数据库导致的紧耦合。
二、操作步骤(非常详细 - 基于 Spring Cloud Alibaba + Nacos)
我们将构建一个简单的电商系统,包含 user-service
和 order-service
。
步骤 1:环境准备
- 安装 Java: 确保安装 JDK 8 或更高版本。
java -version
。 - 安装 Maven:
mvn -version
。 - 安装 Docker (可选但推荐): 用于运行 Nacos Server。
- 安装 Nacos Server:
- 方式一 (Docker):
访问docker run -d --name nacos-standalone -p 8848:8848 -e MODE=standalone nacos/nacos-server:v2.4.0
http://localhost:8848/nacos
(用户名/密码: nacos/nacos)。 - 方式二 (下载解压): 从 Nacos GitHub Releases 下载,解压后进入
bin
目录,执行sh startup.sh -m standalone
(Linux/Mac) 或cmd startup.cmd -m standalone
(Windows)。
- 方式一 (Docker):
步骤 2:创建父项目 (Maven)
创建一个 Maven 聚合项目作为父项目。
pom.xml
(父项目):
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>microservice-demo</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>user-service</module>
<module>order-service</module>
<module>api-gateway</module>
</modules>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring-boot.version>2.7.18</spring-boot.version> <!-- 选择与 Spring Cloud Alibaba 兼容的版本 -->
<spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- Spring Boot BOM -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Spring Cloud Alibaba BOM -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
</plugin>
</plugins>
</build>
</project>
步骤 3:创建用户服务 (user-service
)
创建模块:
- 在父项目目录下创建
user-service
文件夹。 - 创建
user-service/pom.xml
。
user-service/pom.xml
:<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <groupId>com.example</groupId> <artifactId>microservice-demo</artifactId> <version>1.0.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>user-service</artifactId> <dependencies> <!-- Spring Boot Web Starter --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Spring Cloud Alibaba Nacos Discovery --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!-- Spring Cloud Alibaba Nacos Config (可选,如果需要动态配置) --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <!-- Lombok (简化代码) --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>provided</scope> </dependency> </dependencies> </project>
- 在父项目目录下创建
创建主类:
- 创建
src/main/java/com/example/userservice/UserServiceApplication.java
。
package com.example.userservice; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient // 启用服务发现客户端 public class UserServiceApplication { public static void main(String[] args) { SpringApplication.run(UserServiceApplication.class, args); } }
- 创建
创建配置文件:
- 创建
src/main/resources/application.yml
。
server: port: 8081 # 用户服务端口 spring: application: name: user-service # 服务名称,注册到 Nacos cloud: nacos: discovery: server-addr: 127.0.0.1:8848 # Nacos Server 地址 # config: # 如果使用 Nacos Config # server-addr: 127.0.0.1:8848 # file-extension: yaml
- 创建
创建简单业务:
- 创建
User
实体类 (src/main/java/com/example/userservice/entity/User.java
)。 - 创建
UserController
(src/main/java/com/example/userservice/controller/UserController.java
)。
// User.java package com.example.userservice.entity; import lombok.Data; @Data public class User { private Long id; private String name; private String email; }
// UserController.java package com.example.userservice.controller; import com.example.userservice.entity.User; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.HashMap; import java.util.Map; @RestController @RequestMapping("/users") public class UserController { // 模拟数据存储 private static final Map<Long, User> users = new HashMap<>(); static { User user1 = new User(); user1.setId(1L); user1.setName("Alice"); user1.setEmail("alice@example.com"); users.put(1L, user1); User user2 = new User(); user2.setId(2L); user2.setName("Bob"); user2.setEmail("bob@example.com"); users.put(2L, user2); } @GetMapping("/{id}") public User getUserById(@PathVariable Long id) { return users.get(id); } }
- 创建
步骤 4:创建订单服务 (order-service
)
创建模块: 类似
user-service
,创建order-service
文件夹和pom.xml
。order-service/pom.xml
(与 user-service 类似,注意 artifactId):<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <groupId>com.example</groupId> <artifactId>microservice-demo</artifactId> <version>1.0.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>order-service</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!-- OpenFeign for service-to-service communication --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>provided</scope> </dependency> </dependencies> </project>
创建主类:
- 创建
src/main/java/com/example/orderservice/OrderServiceApplication.java
。
package com.example.orderservice; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.openfeign.EnableFeignClients; // 启用 Feign 客户端 @SpringBootApplication @EnableDiscoveryClient @EnableFeignClients // 扫描并创建 Feign 客户端 public class OrderServiceApplication { public static void main(String[] args) { SpringApplication.run(OrderServiceApplication.class, args); } }
- 创建
创建配置文件:
- 创建
src/main/resources/application.yml
。
server: port: 8082 # 订单服务端口 spring: application: name: order-service cloud: nacos: discovery: server-addr: 127.0.0.1:8848
- 创建
创建 Feign Client:
- 创建
src/main/java/com/example/orderservice/client/UserClient.java
。
package com.example.orderservice.client; import com.example.orderservice.entity.User; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; // 声明要调用的服务名称 @FeignClient(name = "user-service") public interface UserClient { // 复制 user-service 中的 API 签名 @GetMapping("/users/{id}") User getUserById(@PathVariable("id") Long id); }
- 创建
创建业务逻辑:
- 创建
Order
实体类 (src/main/java/com/example/orderservice/entity/Order.java
)。 - 创建
OrderController
(src/main/java/com/example/orderservice/controller/OrderController.java
)。
// Order.java package com.example.orderservice.entity; import lombok.Data; @Data public class Order { private Long id; private Long userId; private String itemName; private Double price; private User user; // 包含用户信息 }
// OrderController.java package com.example.orderservice.controller; import com.example.orderservice.client.UserClient; import com.example.orderservice.entity.Order; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.HashMap; import java.util.Map; @RestController @RequestMapping("/orders") public class OrderController { private final UserClient userClient; // 注入 Feign Client public OrderController(UserClient userClient) { this.userClient = userClient; } // 模拟数据存储 private static final Map<Long, Order> orders = new HashMap<>(); static { Order order1 = new Order(); order1.setId(1L); order1.setUserId(1L); order1.setItemName("Laptop"); order1.setPrice(999.99); orders.put(1L, order1); } @GetMapping("/{id}") public Order getOrderWithUser(@PathVariable Long id) { Order order = orders.get(id); if (order != null) { // 使用 Feign 调用 user-service 获取用户信息 try { order.setUser(userClient.getUserById(order.getUserId())); } catch (Exception e) { // 处理调用失败,例如设置默认用户或返回错误信息 // 这里简化处理,实际应用中应更健壮 System.err.println("Failed to fetch user: " + e.getMessage()); } } return order; } }
- 创建
步骤 5:创建 API 网关 (api-gateway
)
创建模块: 创建
api-gateway
文件夹和pom.xml
。api-gateway/pom.xml
:<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <groupId>com.example</groupId> <artifactId>microservice-demo</artifactId> <version>1.0.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>api-gateway</artifactId> <dependencies> <!-- Spring Cloud Gateway Starter --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <!-- Spring Cloud Alibaba Nacos Discovery --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!-- WebFlux for reactive programming (Gateway is reactive) --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> </dependencies> </project>
创建主类:
- 创建
src/main/java/com/example/apigateway/ApiGatewayApplication.java
。
package com.example.apigateway; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient // Gateway 也需要注册到服务发现 public class ApiGatewayApplication { public static void main(String[] args) { SpringApplication.run(ApiGatewayApplication.class, args); } }
- 创建
创建配置文件 (路由配置):
- 创建
src/main/resources/application.yml
。
server: port: 8080 # 网关端口 spring: application: name: api-gateway cloud: nacos: discovery: server-addr: 127.0.0.1:8848 gateway: discovery: locator: enabled: true # 开启服务发现路由,自动为注册的服务创建路由 lower-case-service-id: true # 路由路径使用小写服务名 # routes: # 也可以手动配置路由 (与 locator 二选一,通常用 locator 更方便) # - id: user_route # uri: lb://user-service # lb:// 表示使用负载均衡 # predicates: # - Path=/users/** # - id: order_route # uri: lb://order-service # predicates: # - Path=/orders/**
- 创建
步骤 6:启动与验证
- 确保 Nacos Server 已启动。
- 依次启动服务:
cd user-service && mvn spring-boot:run
cd order-service && mvn spring-boot:run
cd api-gateway && mvn spring-boot:run
- 验证服务注册:
- 访问
http://localhost:8848/nacos
-> 服务管理 -> 服务列表。 - 应能看到
user-service
,order-service
,api-gateway
三个服务,状态为UP
。
- 访问
- 通过 API 网关访问:
- 获取用户:
curl http://localhost:8080/user-service/users/1
- 获取订单 (包含用户信息):
curl http://localhost:8080/order-service/orders/1
- 注意: 由于网关
discovery.locator.enabled=true
,路由规则是/{service-name}/**
->lb://service-name/**
。所以访问路径是/user-service/users/1
和/order-service/orders/1
。
- 获取用户:
三、常见错误
服务无法注册到 Nacos:
- 原因 1: Nacos Server 未启动或地址 (
server-addr
) 配置错误。 - 解决: 检查 Nacos 状态和配置。
- 原因 2: 服务
spring.application.name
重复或配置错误。 - 解决: 确保服务名唯一且正确。
- 原因 3: 网络问题(如防火墙)。
- 解决: 检查网络连接。
- 原因 1: Nacos Server 未启动或地址 (
服务间调用失败 (Feign):
- 原因 1:
@EnableFeignClients
注解缺失。 - 解决: 确保在主类上添加。
- 原因 2:
@FeignClient(name = "xxx")
中的服务名与 Nacos 中注册的spring.application.name
不一致。 - 解决: 检查服务名拼写和大小写。
- 原因 3: 目标服务未启动或未注册。
- 解决: 检查 Nacos 控制台。
- 原因 4: Feign Client 接口方法签名与目标服务 API 不匹配(URL, HTTP 方法, 参数)。
- 解决: 仔细核对。
- 原因 1:
API 网关路由失败:
- 原因 1:
discovery.locator.enabled=true
未配置,且未手动配置routes
。 - 解决: 配置
discovery.locator.enabled=true
或手动添加路由规则。 - 原因 2: 访问路径错误。例如,网关端口是 8080,但访问了 8081。
- 解决: 确认网关端口和访问路径格式(
/{service-name}/**
)。 - 原因 3: 网关未注册到服务发现,无法获取服务实例列表。
- 解决: 确保网关
application.yml
配置了nacos.discovery.server-addr
。
- 原因 1:
ClassNotFoundException
/NoSuchBeanDefinitionException
:- 原因: 依赖未正确引入或版本不兼容。
- 解决: 检查
pom.xml
,确保依赖正确,版本兼容(使用 BOM 管理)。
端口冲突:
- 原因: 多个服务配置了相同的
server.port
。 - 解决: 为每个服务配置不同的端口。
- 原因: 多个服务配置了相同的
循环依赖:
- 问题:
serviceA
调用serviceB
,serviceB
又调用serviceA
。 - 解决: 重新设计服务边界,避免循环调用,或使用消息队列解耦。
- 问题:
四、注意事项
- 服务粒度: 粒度不宜过细(管理成本高)也不宜过粗(失去微服务优势)。从业务领域出发,遵循单一职责。
- 数据库设计: 强烈建议每个微服务拥有独立的数据库。避免服务间直接访问对方数据库,破坏封装性。通过 API 进行数据交互。
- 事务管理: 跨服务的事务是分布式事务,非常复杂。优先考虑最终一致性(通过消息队列、Saga 模式等)而非强一致性(如 2PC)。
- API 设计: 使用清晰、一致的 RESTful API 设计规范。考虑版本化(如
/v1/users
)。 - 错误处理: 定义统一的错误响应格式。在 Feign 调用中处理
FeignException
。 - 安全性: 在 API 网关或服务层实现认证(如 JWT)和授权。传输使用 HTTPS。
- 日志: 使用集中式日志系统(如 ELK, EFK)。在日志中加入
TraceId
便于分布式追踪。 - 监控: 集成 Prometheus + Grafana 监控服务的健康状况、请求量、延迟、错误率等。
- 文档: 使用 Swagger/OpenAPI 自动生成 API 文档。
- 配置管理: 生产环境务必使用配置中心(如 Nacos Config),避免将配置写死在代码或本地文件中。
五、使用技巧
- 使用 Spring Initializr: 快速生成项目骨架。
- 利用 Nacos Config: 将
application.yml
中的配置(如数据库连接、开关)移到 Nacos 配置中心,实现动态更新。 - Feign 自定义配置: 可以为特定
@FeignClient
配置超时、日志级别、编码器/解码器。 - Gateway 过滤器: 使用
GlobalFilter
或GatewayFilter
实现通用功能,如添加请求头、权限校验、日志记录。 - 健康检查: Spring Boot Actuator 提供
/actuator/health
端点,Nacos 会定期检查。 - 服务元数据: 可以在 Nacos 注册服务时添加元数据(如版本号),用于灰度发布等场景。
- 使用 Docker Compose: 编写
docker-compose.yml
文件,一键启动 Nacos 和所有微服务。 - 集成 Resilience4j: 在
order-service
中为UserClient
添加熔断、限流、重试。 - 集成 Sleuth + Zipkin: 在所有服务中引入
spring-cloud-starter-sleuth
和spring-cloud-sleuth-zipkin
,实现分布式追踪。 - 使用 Kubernetes: 将服务打包成 Docker 镜像,使用 K8s 进行部署、扩缩容、服务发现和负载均衡。
六、最佳实践
- 领域驱动设计 (DDD): 使用 DDD 的战略设计(限界上下文)来划分微服务边界。
- 演进式设计: 从单体应用开始,逐步拆分出微服务,避免“大爆炸”式拆分。
- 契约优先: 使用 OpenAPI (Swagger) 定义服务间的 API 契约,促进团队协作。
- 自动化: 建立完善的 CI/CD 流水线(Jenkins, GitLab CI, GitHub Actions)。
- 基础设施即代码 (IaC): 使用 Terraform, Ansible 等管理基础设施。
- 混沌工程: 主动注入故障(如网络延迟、服务宕机),测试系统的弹性。
- 可观测性 (Observability): 结合日志 (Logging)、指标 (Metrics)、追踪 (Tracing) 三位一体,全面了解系统运行状况。
- 蓝绿部署/金丝雀发布: 使用网关或服务网格实现平滑发布,降低风险。
- 服务网格 (Service Mesh): 对于复杂场景,考虑引入 Istio, Linkerd 等服务网格,将通信、安全、观测等功能下沉到基础设施层。
- 团队自治: 每个微服务由一个小型、跨职能的团队拥有和负责。
七、性能优化
- API 网关优化:
- 缓存: 对于不常变的 GET 请求,可以在网关层缓存响应。
- 限流: 使用
GatewayFilter
实现请求限流,防止后端服务被压垮。 - 压缩: 启用 GZIP 压缩。
- 服务间通信优化:
- 连接池: 为 Feign/RestTemplate 配置 HTTP 连接池(如 Apache HttpClient, OkHttp)。
- 超时设置: 为 Feign 调用设置合理的
connectTimeout
和readTimeout
。 - 异步调用: 对于非关键路径或耗时调用,考虑使用
WebClient
(响应式) 或消息队列。 - 批量接口: 提供批量查询/操作的 API,减少网络往返次数。
- 数据库优化:
- 索引: 为查询字段建立合适的索引。
- 分库分表: 数据量巨大时考虑分库分表。
- 读写分离: 使用主从复制,将读请求分发到从库。
- 缓存: 使用 Redis 等缓存热点数据,减少数据库压力。
- JVM 优化:
- 合理设置堆大小 (
-Xms
,-Xmx
)。 - 选择合适的垃圾回收器 (GC): 如 G1GC, ZGC (低延迟)。
- 监控 GC 日志。
- 合理设置堆大小 (
- 水平扩展:
- 无状态服务: 确保服务是无状态的(状态存储在外部,如数据库、Redis),便于水平扩展。
- Kubernetes HPA: 使用 K8s 的 Horizontal Pod Autoscaler 根据 CPU/内存使用率自动扩缩容。
- 减少序列化开销:
- 使用高效的序列化协议(如 Protobuf, Avro)替代 JSON(在性能要求极高且服务间协议统一的场景)。
- 避免传输不必要的大字段。
- 异步化与解耦:
- 将非实时、耗时操作(如发邮件、生成报表)通过消息队列(Kafka, RabbitMQ)异步处理。
- 监控与分析:
- APM 工具: 使用 SkyWalking, Pinpoint 等 APM 工具深入分析性能瓶颈。
- Profiling: 在生产环境谨慎使用 Profiling 工具(如 Async-Profiler)定位热点代码。
- 资源隔离: 使用 K8s 的 Resource Quotas 和 Limit/Requests 限制每个 Pod 的资源使用,防止资源争抢。
- 预热: 对于有缓存的服务,启动后进行预热,避免冷启动导致的高延迟。
总结: 构建 Java 微服务是一个系统工程。核心是服务拆分、独立部署、服务发现、远程调用和 API 网关。Spring Boot + Spring Cloud Alibaba (Nacos) 是一个成熟且易上手的技术栈。务必遵循最佳实践,特别是独立数据库、配置中心、可观测性和自动化。从简单示例开始,逐步引入熔断、追踪、消息队列等高级特性,并最终迈向容器化和云原生部署。