3. 总体架构设计:分层架构与微服务选型

大家好,我是老张。今天咱们聊聊储能电站监控系统的总体架构。说实话,这个环节是整栋大楼的骨架,骨架歪了,后面装修得再漂亮也白搭。

我参与过好几个大型储能项目,从几十兆瓦时到几百兆瓦时的都有。每次做架构设计,我都会问自己一个问题:这套系统能不能扛住未来3-5年的业务变化?如果答案是否定的,那说明架构设计还没到位。

3.1 分层架构设计:四层模型

储能电站监控系统,我习惯把它拆成四层。为什么是四层?说白了,每一层都有它存在的理由。

核心原则:每一层只关心自己的事,层与层之间通过标准接口通信。这样哪一层出了问题,不会牵连到其他层。

3.1.1 感知层

这一层是系统的「眼睛和耳朵」。它负责采集电池、PCS、BMS、温控系统等设备的数据。

  • 数据采集:电压、电流、温度、SOC、SOH等
  • 协议适配:Modbus、IEC 61850、CAN、MQTT
  • 边缘计算:数据预处理、异常检测、本地缓存

我记得有个项目,现场设备用的协议五花八门。有的用Modbus RTU,有的用Modbus TCP,还有几个老设备走的是自定义协议。那段时间我天天跟协议转换打交道,头都大了。后来我学乖了——在感知层统一加一个协议适配网关,所有设备先过网关,再往上送数据。这个做法后来成了我们团队的标准方案。

我的经验:感知层不要只做数据透传。加一点边缘计算能力,比如数据清洗、异常过滤,能大大减轻上层压力。

3.1.2 网络层

网络层是系统的「神经网络」。它负责把感知层的数据安全、可靠地传到平台层。

  • 通信方式:有线(光纤、以太网)、无线(4G/5G、LoRa)
  • 安全机制:VPN、TLS加密、设备认证
  • 可靠性:断点续传、数据重发、心跳检测

你想想看,储能电站往往在偏远地区,网络环境不稳定。我曾经遇到过一个项目,现场4G信号时好时坏,数据经常丢包。后来我们加了本地缓存和断点续传机制,网络恢复后自动补传数据。嗯,这个坑踩得值。

3.1.3 平台层

平台层是系统的「大脑」。所有核心业务逻辑都在这一层实现。

  • 数据存储:时序数据库(InfluxDB、TimescaleDB)+ 关系型数据库(PostgreSQL)
  • 数据处理:实时流处理(Kafka + Flink)、批量分析(Spark)
  • 服务治理:服务注册发现、配置中心、负载均衡

我个人习惯把平台层再拆成两个子层:数据服务层业务服务层。数据服务层负责数据的存取和计算,业务服务层负责具体的业务逻辑。这样拆的好处是,换数据库或者换业务逻辑时,影响范围可控。

3.1.4 应用层

应用层是系统的「脸面」。它直接面向运维人员、管理人员和调度人员。

  • 监控大屏:实时数据展示、告警推送、趋势分析
  • 运维管理:设备管理、巡检计划、工单管理
  • 报表分析:日/周/月报表、收益分析、效率评估

应用层我建议采用前后端分离架构。前端用Vue或React,后端提供RESTful API。这样前端可以独立迭代,不会影响后端服务。

3.2 微服务架构选型

说到微服务,很多人第一反应是「拆」。但我要说:微服务不是拆得越细越好。拆得太细,服务间通信成本高,运维复杂度也上去了。

我建议按业务域来拆分。比如储能电站监控系统,可以拆成以下几个微服务:

服务名称 职责 数据存储
设备管理服务 设备注册、配置、状态管理 PostgreSQL
数据采集服务 接收感知层数据,写入时序库 InfluxDB
告警服务 规则引擎、告警生成、通知推送 Redis + PostgreSQL
报表服务 数据聚合、报表生成、导出 TimescaleDB
用户服务 认证、授权、权限管理 PostgreSQL

注意:微服务之间的通信,我建议优先使用异步消息(Kafka/RabbitMQ),而不是同步RPC。异步通信能降低服务间的耦合度,也更容易应对流量高峰。

3.3 技术栈选型

技术栈选型是个老生常谈的话题。Java、Python、Go,各有各的拥趸。我不站队,只说说我的实际经验。

Java

  • 适合场景:大型企业级应用、复杂业务逻辑、需要长期维护
  • 优势:生态成熟、社区活跃、框架丰富(Spring Cloud、Dubbo)
  • 劣势:启动慢、内存占用高、开发效率相对低

我大部分项目都用Java。为什么?因为储能电站监控系统往往需要对接各种第三方系统,Java的生态能帮我省不少事。Spring Cloud那一套,服务注册、配置中心、熔断降级,开箱即用。

Python

  • 适合场景:数据处理、AI分析、快速原型
  • 优势:开发效率高、数据科学库丰富(Pandas、NumPy、TensorFlow)
  • 劣势:性能瓶颈、GIL限制、不适合高并发场景

Python我主要用在数据分析和AI预测这块。比如电池SOC预测、寿命评估,用Python写模型快得很。但你要是拿Python做高并发的数据采集服务,那就不太合适了。

Go

  • 适合场景:高并发服务、边缘计算、中间件开发
  • 优势:性能高、编译快、部署简单、并发模型优秀
  • 劣势:生态相对年轻、泛型支持晚、框架不如Java丰富

Go是我最近两年开始用的。说实话,真香。尤其是做边缘计算网关,Go编译出来一个二进制文件,扔到嵌入式设备上就能跑,内存占用还低。我有个项目,原来用Java写的采集服务,换成Go之后,内存占用从2G降到了200M。

3.4 架构总览图

下面这张图是我画的一个架构总览。它把四层架构、微服务划分和技术栈选型都串起来了。你仔细看看,应该能对整体设计有个直观的理解。

储能电站监控系统 - 总体架构图 应用层 监控大屏 运维管理 报表分析 告警推送 Vue/React + RESTful API 平台层(微服务) 设备管理服务 数据采集服务 告警服务 报表服务 用户服务 ...其他服务 Spring Cloud / Kafka / PostgreSQL / InfluxDB 网络层 光纤/以太网 4G/5G LoRa VPN/TLS加密 感知层 BMS(电池管理) Modbus/CAN PCS(储能变流器) IEC 61850 温控系统 MQTT 其他设备 自定义协议 技术栈:Java(业务服务)+ Python(数据分析)+ Go(边缘计算)

3.5 我的选型建议

说了这么多,到底怎么选?我给出一个组合建议:

  • 核心业务服务:Java + Spring Cloud。稳定、成熟、好招人。
  • 数据分析和AI:Python + TensorFlow/PyTorch。开发快,模型多。
  • 边缘计算网关:Go。性能好,部署简单,资源占用低。
  • 数据采集服务:Go或Java。看团队技术栈,Go更轻量,Java更稳定。

一个小建议:不要为了用新技术而用新技术。选团队最熟悉的技术栈,比选「最流行」的技术栈更靠谱。我见过太多项目因为技术栈太新,出了问题没人能修,最后烂尾的。

好了,这一章的内容就到这里。架构设计没有标准答案,只有最适合你项目的方案。希望我的经验能给你一些参考。


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