一、技术选型说明
本文将基于以下技术栈构建完整的微服务解决方案:
- 基础环境:JDK 21 + Maven 3.9+
- 核心框架:Spring Boot 3.1.5
- 服务治理:Dubbo 3.2.7 + Nacos 2.2.3
- 数据存储:MySQL 8.0 + MyBatis-Plus 3.5.5
- 消息队列:RocketMQ 5.1.3
- 缓存系统:Redis 7.0.12
- 容器化部署:Docker 24.0+
二、项目结构搭建
1. Maven父工程配置
xml
<?xml version="1.0" encoding="UTF-8"?>
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>cloud-platform</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<modules>
<module>api</module>
<module>provider</module>
<module>consumer</module>
</modules>
<properties>
<java.version>21</java.version>
<spring-boot.version>3.1.5</spring-boot.version>
<dubbo.version>3.2.7</dubbo.version>
<nacos.version>2022.0.0.0</nacos.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- Spring Boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Dubbo -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-bom</artifactId>
<version>${dubbo.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
2. API模块(接口定义)
kotlin
// UserService.java
public interface UserService {
UserDTO getUserById(Long id);
}
// UserDTO.java
@Data
public class UserDTO implements Serializable {
private Long id;
private String username;
private String email;
}
3. Provider模块配置
xml
<!-- provider/pom.xml -->
<dependencies>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.2.3</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.5</version>
</dependency>
</dependencies>
4. 核心配置示例
yaml
# application.yml
dubbo:
application:
name: user-service-provider
protocol:
name: dubbo
port: 20880
registry:
address: nacos://nacos-server:8848
config-center:
address: nacos://nacos-server:8848
spring:
datasource:
url: jdbc:mysql://mysql-server:3306/cloud_db?useSSL=false&serverTimezone=UTC
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
data:
redis:
host: redis-server
port: 6379
三、服务实现示例
1. MyBatis-Plus数据访问层
less
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User>
implements UserService {
@DubboService
@Override
public UserDTO getUserById(Long id) {
User user = getById(id);
return convertToDTO(user);
}
}
2. RocketMQ消息处理
less
@Component
@RocketMQMessageListener(
topic = "ORDER_TOPIC",
consumerGroup = "order-consumer-group"
)
public class OrderMessageListener implements RocketMQListener<OrderMessage> {
@Override
public void onMessage(OrderMessage message) {
// 处理订单消息
}
}
四、容器化部署方案
1. Dockerfile示例
bash
# Provider Dockerfile
FROM openjdk:21-jdk
VOLUME /tmp
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
2. docker-compose.yml编排
yaml
version: '3.8'
services:
nacos-server:
image: nacos/nacos-server:v2.2.3
environment:
- MODE=standalone
ports:
- "8848:8848"
mysql-server:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: cloud_db
volumes:
- mysql_data:/var/lib/mysql
redis-server:
image: redis:7.0.12-alpine
ports:
- "6379:6379"
rocketmq:
image: apache/rocketmq:5.1.3
ports:
- "9876:9876"
- "10909:10909"
- "10911:10911"
user-service:
build: ./provider
depends_on:
- nacos-server
- mysql-server
environment:
- SPRING_PROFILES_ACTIVE=prod
volumes:
mysql_data:
五、系统构建与运行
- 编译项目:
go
mvn clean package -DskipTests
-
构建Docker镜像:
docker-compose build
-
启动所有服务:
docker-compose up -d
六、关键技术点解析
-
服务发现机制:
- Dubbo3使用Nacos2作为注册中心,采用应用级服务发现模型
- 服务提供者启动时自动注册元数据信息
- 消费者通过订阅机制动态获取服务列表
-
数据一致性保障:
- RocketMQ事务消息保证分布式事务最终一致性
- Redis分布式锁控制并发操作
typescriptpublic void deductStock(Long productId) { String lockKey = "product_lock:" + productId; Boolean success = redisTemplate.opsForValue() .setIfAbsent(lockKey, "locked", 30, TimeUnit.SECONDS); if (Boolean.TRUE.equals(success)) { try { // 执行库存扣减 } finally { redisTemplate.delete(lockKey); } } }
-
性能优化策略:
- MyBatis-Plus二级缓存整合Redis
- Dubbo服务调用使用Triple协议(HTTP/3)
- RocketMQ消息批量发送与消费
七、常见问题排查
-
Nacos连接失败:
- 检查8848端口是否开放
- 确认Nacos容器日志无异常
- 验证网络策略是否允许容器间通信
-
Dubbo服务未注册:
- 检查@DubboService注解是否正确使用
- 确认Nacos配置地址格式为nacos://host:port
- 查看Dubbo启动日志中的注册信息
-
Redis连接超时:
- 检查Redis密码配置
- 确认防火墙设置
- 测试使用redis-cli连接验证
本方案通过整合当前主流的技术组件,构建了高可用、易扩展的微服务架构体系。实际生产部署时,建议根据业务需求调整以下配置:
- Nacos集群部署
- RocketMQ多副本配置
- Redis哨兵模式或集群方案
- MySQL主从复制架构
- 容器编排使用Kubernetes替代Docker Compose