2. 系统架构设计:分层架构、微服务与单体、高可用设计原则

好,咱们进入正题。这一章聊的是系统架构,说白了就是整个储能监控运维体系的骨架。骨架搭不好,后面功能再多也白搭。我这些年见过太多项目,前期图省事搞了个大泥球架构,后期改一个功能牵一发动全身,运维同学天天半夜被告警电话叫醒。

所以这一章,我会把分层架构、微服务与单体的选型、高可用设计原则,掰开揉碎了讲清楚。嗯,咱们开始。

2.1 分层架构:四层模型详解

储能监控系统,我习惯把它拆成四层:感知层、网络层、平台层、应用层。每一层各司其职,层与层之间通过标准接口通信。这样做的好处是,哪一层出了问题,只影响那一层,不会把整个系统拖垮。

核心原则:上层依赖下层,下层不依赖上层。下层为上层提供能力,上层调用下层的结果。

2.1.1 感知层

这一层是系统的「眼睛和耳朵」。说白了,就是各种传感器、电表、BMS(电池管理系统)、PCS(储能变流器)等硬件设备。它们负责采集电压、电流、温度、SOC(荷电状态)等原始数据。

我在项目中遇到过一个问题:某厂商的BMS上报的SOC值,在低温环境下会跳变。如果感知层不做数据预处理,直接把原始数据往上送,平台层做策略控制时就会误判。所以,感知层最好做一层简单的数据清洗和滤波。

避坑指南:我曾经因为感知层没有做数据有效性校验,导致一条异常数据(比如电压突变为0V)直接触发了保护停机。后来我强制要求:感知层必须做「数据合理性判断」,比如电压值是否在0.5V~5V范围内,超出则标记为无效。

2.1.2 网络层

网络层负责把感知层的数据,安全、可靠地传到平台层。常见的通信方式有:4G/5G、以太网、RS485、CAN总线等。这里有个关键点:储能站通常部署在偏远地区,网络不稳定是常态。

我个人习惯在网络层做两件事:一是数据缓存,网络断了数据不丢;二是断点续传,网络恢复后自动补传。你想想看,如果因为网络抖动丢了一天的数据,那运维分析还有什么意义?

2.1.3 平台层

平台层是系统的「大脑」。它负责数据存储、计算、分析、告警、策略下发等核心功能。这一层通常部署在云端或本地服务器上。

这里要注意:平台层不能是「黑盒」。我见过一些系统,平台层处理逻辑不透明,出了问题只能重启。我建议平台层要有完整的日志链路,每一步处理都能追溯。

2.1.4 应用层

应用层是系统的「脸面」。它面向运维人员、管理人员、甚至终端用户。包括Web界面、手机App、大屏展示等。这一层要关注的是:交互体验、数据可视化、权限管理。

嗯,这里有个小技巧:应用层不要直接查询数据库,而是通过平台层提供的API接口获取数据。这样即使应用层挂了,平台层还能继续运行,不影响数据采集和告警。

分层架构的核心价值:每一层都可以独立演进、独立部署、独立扩缩容。比如感知层换了新设备,只要接口协议不变,上层完全无感知。

2.2 微服务与单体架构选型

这是很多团队纠结的问题。我直接说结论:没有银弹,只有适合。

2.2.1 单体架构

单体架构就是把所有功能打包成一个应用。优点是开发简单、部署方便、调试容易。适合小规模项目、团队人数少、业务逻辑不复杂的场景。

但单体架构有个致命问题:牵一发而动全身。我曾经维护过一个单体系统,改一个告警阈值配置,结果把整个数据上报模块搞崩了。因为所有代码都在一个进程里,内存泄漏、线程阻塞都会互相影响。

2.2.2 微服务架构

微服务架构把系统拆成多个独立服务,每个服务负责一个业务领域。比如:数据采集服务、告警服务、策略控制服务、报表服务等。服务之间通过REST API或消息队列通信。

微服务的优势很明显:独立部署、独立扩缩容、技术栈可以不同。比如告警服务可以用Go写,追求高性能;报表服务可以用Python写,方便数据分析。

注意:微服务不是免费的午餐。它带来了分布式事务、服务发现、配置管理、链路追踪等复杂性。如果团队没有足够的DevOps能力,建议先从单体架构开始,等业务复杂到单体扛不住了,再逐步拆分。

2.2.3 我的选型建议

场景 推荐架构 原因
小型储能站(<5MW) 单体架构 设备少、数据量小、团队小
中型储能站(5-50MW) 模块化单体 按功能模块分包,为后续拆分做准备
大型储能站(>50MW)或集群 微服务架构 高并发、高可用、多团队协作

个人经验:我建议从「模块化单体」起步。就是把代码按功能拆成独立的包或模块,但部署时还是一个进程。这样既保留了单体的简单性,又为未来拆微服务留了后路。我上一个项目就是这么干的,后来拆微服务时,只花了两周就完成了。

2.3 高可用设计原则

储能监控系统,说白了就是不能停。一旦系统挂了,电池过充、过放、温度失控,后果很严重。所以高可用是硬性要求。

2.3.1 冗余设计

关键组件必须冗余。比如:数据库主从、服务多副本、网络双链路。我习惯用「N+1」原则:实际需要N个实例,就部署N+1个,多出来的那个用于故障切换。

2.3.2 故障自动转移

光有冗余还不够,还得能自动切换。比如数据库主库挂了,从库要能自动升为主库。服务实例挂了,负载均衡器要能自动剔除故障节点。

我曾经遇到过一个案例:数据库主库宕机了,但运维人员正在休假,没人手动切换。结果系统停了4个小时。后来我强制要求:所有关键组件必须配置自动故障转移,并且每季度做一次故障演练。

2.3.3 限流与熔断

当流量突增时,系统要有自我保护机制。比如:某个服务响应变慢,熔断器要能快速切断对该服务的调用,避免雪崩效应。

嗯,这里要注意:限流和熔断不是不处理请求,而是优雅地拒绝。比如返回一个「系统繁忙,请稍后重试」的提示,而不是直接超时或报错。

2.3.4 数据备份与恢复

数据是系统的生命线。我建议:全量备份每天一次,增量备份每小时一次。备份数据要异地存储,防止单点故障。

另外,恢复演练也很重要。我见过一个团队,备份做了三年,但从没恢复过。结果真出问题时,发现备份文件损坏了。所以,每月至少做一次恢复演练,确保备份可用。

高可用设计口诀:冗余是基础,自动是保障,限流是底线,备份是后手。

2.4 架构图:四层模型与微服务关系

下面这张图,是我自己画的。它展示了四层架构与微服务之间的关系。你可以看到,平台层内部拆成了多个微服务,每个服务独立部署、独立运行。

应用层 Web管理界面 手机App 大屏展示 API网关 平台层(微服务集群) 数据采集服务 告警服务 策略控制服务 报表服务 用户管理服务 日志服务 配置管理服务 网络层 4G/5G 以太网 RS485/CAN 感知层 BMS电池管理系统 PCS储能变流器 温湿度传感器 电表

这张图里,平台层的微服务之间通过消息队列(比如Kafka)异步通信,避免同步调用带来的耦合。每个服务都有自己的数据库,数据通过事件驱动的方式同步。

一个小建议:微服务之间的通信,尽量用异步消息,少用同步RPC。同步调用一旦链路长了,任何一个节点慢都会拖垮整个请求。我吃过这个亏,后来全改成异步了,系统稳定性提升了一个量级。

2.5 本章小结

这一章我们聊了分层架构的四个层次、微服务与单体的选型策略、以及高可用的设计原则。说白了,架构设计就是做权衡:简单 vs 灵活、成本 vs 可靠性。没有标准答案,只有最适合你当前场景的方案。

嗯,记住一点:架构是演进的,不是一蹴而就的。先跑起来,再优化,别一开始就想着搞个大而全的完美架构。


公众号:蓝海资料掘金营,微信deep3321