分层架构下的跨层通信:接口抽象如何解决反向调用

分层架构中的反向通知机制:基于接口的解耦实践

近期写了个小项目有感,这块虽然很简单, 但是值得深挖下设计思想,在后端系统设计中,分层架构是保障代码可维护性的常用模式。以"K8S错峰控制器"为例,我们将系统划分为三层核心模块,通过接口实现严格的单向依赖:

  • ResourceManager(资源层) :封装K8s资源操作,暴露resource.Manager接口。
  • StrategyManager(策略层) :依赖resource.Manager管理错峰策略,对外提供strategy.Manager接口。
  • Dispatcher(调度层) :基于strategy.Manager执行调度逻辑,暴露dispatcher.Dispatcher接口。

三层形成明确的依赖链:ResourceManager → StrategyManager → Dispatcher。每层仅依赖下层接口,确保替换实现时无需修改上层代码。

需求冲突:策略更新需反向通知

当StrategyManager中的策略发生变更时,需即时通知Dispatcher重载配置。若直接在StrategyManager中引入dispatcher.Dispatcher接口,会形成双向依赖(StrategyManager ←→ Dispatcher),破坏分层原则,导致模块耦合度上升、扩展性下降。

解决方案:接口抽象实现反向通信

为在保持分层架构的同时实现反向通知,采用"接口订阅"模式:

  1. 定义通知接口

    在StrategyManager所属的strategy包中,定义ReloadNotifier接口,描述策略更新的通知契约:

    go 复制代码
    // strategy/notifier.go
    type ReloadNotifier interface {
        NotifyReload() // 触发策略重载
    }
  2. 调度层实现接口

    让Dispatcher的具体实现dispatcherImpl同时实现两个接口:

    • 自身业务接口dispatcher.Dispatcher(提供调度能力)
    • 策略层的ReloadNotifier(接收更新通知)
    go 复制代码
    // dispatcher/dispatcher.go
    type dispatcherImpl struct{}
    
    // 实现调度接口
    func (d *dispatcherImpl) ReloadStrategy() { /* 重载逻辑 */ }
    
    // 实现通知接口
    func (d *dispatcherImpl) NotifyReload() {
        d.ReloadStrategy()
    }
  3. 初始化阶段绑定

    系统启动时,将dispatcherImpl实例注册到StrategyManager:

    go 复制代码
    strategyMgr.SetReloadNotifier(dispatcherInstance)

效果:双向通信与单向依赖的平衡

该设计实现了:

  • 保持原有分层依赖链不变,避免双向耦合。
  • StrategyManager通过ReloadNotifier接口完成通知,无需知晓Dispatcher具体实现。
  • 新增通知接收者或替换Dispatcher时,无需修改策略层代码,扩展性显著提升。

这种模式的核心是通过接口抽象隔离反向依赖,让下层模块主动适配上层的通知契约,既满足业务需求,又坚守分层架构的设计原则。

相关推荐
一条泥憨鱼5 小时前
【消息队列】ACK确认了什么:消息队列可靠投递的完整链路
java·后端·kafka·消息队列·rabbitmq
yangmu32036 小时前
编程语言发展简史:从机器指令到智能协作
开发语言
从琳开始9896 小时前
网络原理入门(二)------OSI七层模型?TCP/IP五层(四层)模型原来是这样的
java·网络·tcp/ip·java-ee·php
广凌科技6 小时前
广凌校园物联网中台整体解决方案:三层架构驱动校园数字化智治
物联网·架构
文丑颜不良啊6 小时前
LeetCode1861~1880题目解析
java·leetcode
Flynn Liang6 小时前
AgentScope Java 深度解析:ReActAgent、HarnessAgent 与多智能体编排——JVM 上的自治 Agent 底座
java·大模型·架构设计·ai agent·spring ai·langchain4j·agentscope
Flynn Liang7 小时前
上线后怎么排查 AI 调用?Spring AI Observability:token/延迟/成本埋点与全链路追踪
java·人工智能·spring·监控·可观测性·observability·springai
文丑颜不良啊7 小时前
LeetCode1921~1940题目解析
java·leetcode
Tt有了t7 小时前
设计模式速查
java·python·设计模式
Thomas.Sir7 小时前
第15课:SpringBoot连接池详解:HikariCP配置、调优、监控,4.x连接池新特性
java·spring boot