You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

微服务中Observer模式的应用疑问及示例请求

嘿,我来帮你理清这个认知误区~其实你提到的微服务里的消息队列发布订阅,本质上就是Observer模式的分布式落地实现,而不是替代了Observer模式。咱们一步步拆解来看:

你的认知误区在哪里?
  • 混淆了「设计模式思想」和「技术实现载体」:Observer模式的核心是「定义对象间的一对多依赖,当一个对象状态改变时,所有依赖它的对象都会收到通知并自动更新」——这个思想是底层逻辑,而消息队列只是在跨服务、分布式场景下,把这个逻辑从单进程内扩展到了多进程/多服务的环境中,本质还是完全符合Observer模式的定义的。
  • 忽略了进程内Observer模式的广泛应用:除了跨服务场景,单微服务内部的事件驱动逻辑几乎都是用Observer模式实现的,比如前端的状态监听(React的useEffect、Vue的watch)、后端框架里的事件机制(Java Spring Event、Node.js的EventEmitter),这些都是日常开发中高频使用的Observer模式场景,只是你可能没把它们和「Observer设计模式」这个概念绑定起来。
微服务中Observer模式的实际示例

我举两个常见的场景,一个是单微服务内部的Observer应用,另一个是跨微服务的分布式Observer实现:

1. 单微服务内部:用户注册后的多任务触发

假设你有一个用户服务,用户注册成功后需要同时触发「发送欢迎邮件」「初始化用户积分」「记录操作日志」三个独立任务,用Spring Boot的ApplicationEvent实现Observer模式:

定义事件类

// 用户注册成功事件
public class UserRegisteredEvent extends ApplicationEvent {
    private final User user;

    public UserRegisteredEvent(Object source, User user) {
        super(source);
        this.user = user;
    }

    public User getUser() {
        return user;
    }
}

事件发布者(用户注册服务)

@Service
public class UserService {
    private final ApplicationEventPublisher eventPublisher;
    private final UserRepository userRepository;

    // 构造注入事件发布器和数据库仓库
    public UserService(ApplicationEventPublisher eventPublisher, UserRepository userRepository) {
        this.eventPublisher = eventPublisher;
        this.userRepository = userRepository;
    }

    public User registerUser(User user) {
        // 执行注册逻辑:保存用户到数据库
        User savedUser = userRepository.save(user);
        // 发布「用户注册成功」事件
        eventPublisher.publishEvent(new UserRegisteredEvent(this, savedUser));
        return savedUser;
    }
}

事件订阅者(各个任务处理类)

// 订阅者1:发送欢迎邮件
@Component
public class EmailNotificationListener {
    private final EmailService emailService;

    public EmailNotificationListener(EmailService emailService) {
        this.emailService = emailService;
    }

    @EventListener // 监听UserRegisteredEvent事件
    public void handleUserRegistered(UserRegisteredEvent event) {
        User user = event.getUser();
        emailService.sendWelcomeEmail(user.getEmail(), user.getUsername());
    }
}

// 订阅者2:初始化用户积分
@Component
public class PointsInitializationListener {
    private final PointsService pointsService;

    public PointsInitializationListener(PointsService pointsService) {
        this.pointsService = pointsService;
    }

    @EventListener
    public void handleUserRegistered(UserRegisteredEvent event) {
        User user = event.getUser();
        // 给新用户初始化100积分
        pointsService.addPoints(user.getId(), 100);
    }
}

这种实现方式让注册逻辑和后续的各个任务解耦,符合开闭原则——如果以后要加「发送短信通知」的任务,只需要新增一个订阅者类就行,不用修改注册服务的代码。

2. 跨微服务:分布式Observer(结合消息队列)

如果需要把用户注册的事件通知给其他微服务(比如订单服务、统计服务),就可以用消息队列(比如RabbitMQ、Kafka)来实现分布式的Observer模式:

用户服务(事件发布者)

@Service
public class UserService {
    private final RabbitTemplate rabbitTemplate;
    private final UserRepository userRepository;

    public UserService(RabbitTemplate rabbitTemplate, UserRepository userRepository) {
        this.rabbitTemplate = rabbitTemplate;
        this.userRepository = userRepository;
    }

    public User registerUser(User user) {
        User savedUser = userRepository.save(user);
        // 把注册事件发送到消息队列的Exchange
        rabbitTemplate.convertAndSend("user-exchange", "user.registered", savedUser);
        return savedUser;
    }
}

订单服务(订阅者)

@Component
public class OrderServiceSubscriber {
    private final OrderService orderService;

    public OrderServiceSubscriber(OrderService orderService) {
        this.orderService = orderService;
    }

    @RabbitListener(queues = "user-registered-order-queue")
    public void handleUserRegistered(User user) {
        // 为新用户初始化订单模板数据
        orderService.createDefaultOrderTemplate(user.getId());
    }
}

统计服务(订阅者)

@Component
public class StatsServiceSubscriber {
    private final StatsService statsService;

    public StatsServiceSubscriber(StatsService statsService) {
        this.statsService = statsService;
    }

    @RabbitListener(queues = "user-registered-stats-queue")
    public void handleUserRegistered(User user) {
        // 更新平台用户注册统计数据
        statsService.incrementTotalUsers();
    }
}

这里的消息队列Exchange就相当于Observer模式里的「主题(Subject)」,各个微服务的队列就是「观察者(Observer)」,完全符合Observer模式的核心逻辑——主题状态变化(用户注册)时,自动通知所有订阅的观察者(订单、统计服务)。

总结

Observer模式从来没有过时,它是**事件驱动架构(EDA)**的核心思想之一,不管是单进程内的解耦,还是跨服务的分布式通信,都是它的具体应用场景。你觉得它应用不广泛,只是因为很多时候你在使用它的实现,但没把它和「Observer设计模式」这个概念对应起来而已~

内容的提问来源于stack exchange,提问作者J.L

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:55:29