架构设计

基础设施层设计

基础设施层模块设计与边界。

基础设施层设计

数据访问 (Data)

架构设计

┌─────────────────────────────────────────┐
│          Application Layer               │
│   ┌──────────┐  ┌──────────┐           │
│   │ Service  │  │Repository│           │
│   └─────┬────┘  └─────┬────┘           │
│         │             │                 │
│         ↓             ↓                 │
├─────────────────────────────────────────┤
│       Data Access Layer (Nebula)        │
│   ┌──────────────────────────────┐     │
│   │    Data Access Abstraction    │     │
│   │  ┌────────┐  ┌────────┐      │     │
│   │  │Persistence│ │ Cache │      │     │
│   │  └────────┘  └────────┘      │     │
│   └───────┬──────────┬────────────┘     │
│           │          │                  │
├───────────┼──────────┼──────────────────┤
│           ↓          ↓                  │
│   ┌────────┐    ┌─────────┐           │
│   │ MySQL  │    │  Redis  │  MongoDB  │
│   └────────┘    └─────────┘           │
└─────────────────────────────────────────┘

nebula-data-persistence

特性: - MyBatis-Plus 集成 - 读写分离 - 分库分表 - 多数据源

核心组件

// 1. 基础 Mapper
public interface BaseMapper<T> extends 
    com.baomidou.mybatisplus.core.mapper.BaseMapper<T> {
    // 扩展方法
}

// 2. 基础 Service
public interface BaseService<T> extends 
    IService<T> {
    // 扩展方法
}

// 3. 数据源配置
@Configuration
public class DataSourceConfig {
    @Bean
    public DataSource masterDataSource() { }

    @Bean
    public DataSource slaveDataSource() { }
}

nebula-data-cache

多级缓存架构

请求
  ↓
L1: Caffeine 本地缓存 (1-10ms)
  ↓ 未命中
L2: Redis 分布式缓存 (10-50ms)
  ↓ 未命中
L3: 数据库 (50-200ms)
  ↓
响应

核心接口

public interface CacheService {
    // 基础操作
    void set(String key, Object value, int ttl);
    <T> T get(String key, Class<T> type);
    void delete(String key);

    // 批量操作
    void multiSet(Map<String, Object> map, int ttl);
    <T> Map<String, T> multiGet(List<String> keys, Class<T> type);

    // 高级操作
    <T> T getOrLoad(String key, Supplier<T> loader, int ttl);
}

票务场景应用

// 票务信息缓存(热点数据)
@Cacheable(value = "ticket", key = "#id")
public Ticket getTicketById(Long id) {
    return ticketMapper.selectById(id);
}

// 座位状态缓存(实时数据)
String key = "showtime:seats:" + showtimeId;
List<Seat> seats = cacheService.get(key, List.class);
if (seats == null) {
    seats = seatService.getAvailableSeats(showtimeId);
    cacheService.set(key, seats, 10); // 10秒过期
}

消息传递 (Messaging)

架构设计

┌──────────────────────────────────────────┐
│         Application Layer                 │
│   ┌────────────┐    ┌─────────────┐     │
│   │  Producer  │    │  Consumer   │     │
│   └──────┬─────┘    └──────┬──────┘     │
│          │                 │             │
├──────────┼─────────────────┼─────────────┤
│          ↓                 ↓             │
│   ┌─────────────────────────────────┐   │
│   │  Messaging Abstraction Layer    │   │
│   │  (nebula-messaging-core)        │   │
│   └─────────────┬───────────────────┘   │
│                 │                        │
├─────────────────┼────────────────────────┤
│                 ↓                        │
│   ┌────────────────────────┐           │
│   │  RabbitMQ / Kafka      │           │
│   └────────────────────────┘           │
└──────────────────────────────────────────┘

核心接口

// 消息生产者
public interface MessageProducer {
    void send(String topic, Object message);
    void sendAsync(String topic, Object message);
    void sendDelayed(String topic, Object message, long delayMs);
}

// 消息消费者
@MessageHandler(topic = "order.created")
public void handleOrderCreated(OrderMessage message) {
    // 处理订单创建消息
}

票务场景应用

// 1. 订单创建后发送消息
Order order = orderService.create(orderDto);
messageProducer.send("order.created", order);

// 2. 异步处理订单
@MessageHandler(topic = "order.created")
public void handleOrderCreated(Order order) {
    // 生成电子票
    ticketService.generateETicket(order);

    // 发送通知
    notificationService.sendOrderNotification(order);
}

// 3. 延时取消订单
messageProducer.sendDelayed("order.timeout", orderId, 15 * 60 * 1000); // 15分钟后

RPC 通信 (RPC)

架构设计

┌──────────────────────────────────────────┐
│         Application Layer                 │
│   ┌────────────┐    ┌─────────────┐     │
│   │  RPC Client │    │ RPC Server  │     │
│   └──────┬─────┘    └──────┬──────┘     │
│          │                 │             │
├──────────┼─────────────────┼─────────────┤
│          ↓                 ↓             │
│   ┌─────────────────────────────────┐   │
│   │    RPC Abstraction Layer        │   │
│   │    (nebula-rpc-core)            │   │
│   └─────┬───────────────┬───────────┘   │
│         │               │                │
│         ↓               ↓                │
│   ┌──────────┐    ┌──────────┐         │
│   │   HTTP   │    │   gRPC   │         │
│   └──────────┘    └──────────┘         │
└──────────────────────────────────────────┘

协议选择

场景 推荐协议 原因
内部服务通信 gRPC 高性能、强类型
外部API HTTP 通用、易集成
跨语言 HTTP或gRPC 都支持多语言

票务场景应用

// gRPC 服务定义
service UserService {
    rpc GetUser(UserIdRequest) returns (UserResponse);
}

// gRPC 客户端调用
@GrpcClient("user-service")
private UserServiceStub userService;

public User getUserInfo(Long userId) {
    UserIdRequest request = UserIdRequest.newBuilder()
        .setUserId(userId)
        .build();
    UserResponse response = userService.getUser(request);
    return convert(response);
}

服务发现 (Discovery)

架构设计

┌────────────────────────────────────────┐
│         Service Instances               │
│  ┌──────┐  ┌──────┐  ┌──────┐        │
│  │Service│  │Service│  │Service│        │
│  │  A   │  │  B   │  │  C   │        │
│  └──┬───┘  └──┬───┘  └──┬───┘        │
│     │  注册   │  注册   │  注册        │
├─────┼────────┼────────┼───────────────┤
│     ↓        ↓        ↓               │
│  ┌────────────────────────────┐      │
│  │    Nacos Server            │      │
│  │  - 服务注册                 │      │
│  │  - 服务发现                 │      │
│  │  - 健康检查                 │      │
│  │  - 配置管理                 │      │
│  └────────────────────────────┘      │
└────────────────────────────────────────┘

核心功能: - 服务注册 - 服务发现 - 健康检查 - 负载均衡 - 配置管理

票务场景应用

```yaml