1. SOA概述:从单体架构到SOA的演进
1.1 为什么我们要谈架构演进?
说实话,我刚入行那会儿,做新能源项目最头疼的就是系统耦合。一个充电桩管理平台,充电、计费、监控全揉在一起。改个计费逻辑,充电模块就得跟着重新部署。你想想看,这得多痛苦?
后来我慢慢意识到,这不是代码的问题,是架构的问题。今天我们就从最基础的开始聊——单体架构到SOA的演进。
1.2 单体架构:曾经的“万能药”
单体架构,说白了就是把所有功能都塞进一个进程里。用户管理、订单处理、设备监控……全在一个大包里。
单体架构的特点:
- 开发简单,初期上手快
- 部署方便,一个包搞定
- 测试容易,本地就能跑
但问题也来了。我记得2018年做一个储能系统,单体架构下,业务量一上来,整个系统就卡死。为什么?因为所有模块共享内存和线程池,一个模块出问题,全盘崩溃。
我曾经踩过的坑:单体架构下,充电桩的通信模块因为内存泄漏挂了,结果计费模块也跟着宕机。用户充完电发现扣费失败,投诉电话打爆了。从那以后,我再也不敢把所有鸡蛋放一个篮子里。
1.3 SOA:服务化的觉醒
SOA(面向服务架构)的出现,说白了就是要把大系统拆成小服务。每个服务独立部署、独立运行、独立扩展。
SOA的核心三要素:
| 要素 | 说明 | 我项目中的例子 |
|---|---|---|
| 服务 | 可独立运行的业务功能单元 | 充电桩状态服务、用户认证服务 |
| 契约 | 服务间通信的接口规范 | WSDL、OpenAPI 定义 |
| 协议 | 服务间交互的通信规则 | SOAP、REST、gRPC |
我个人习惯把这三个要素比作“快递服务”:
- 服务 = 快递员(独立干活)
- 契约 = 快递单(写清楚收件人、地址)
- 协议 = 快递流程(怎么揽件、怎么派送)
1.4 服务:SOA的最小单元
服务是什么?不是随便拆个函数就叫服务。我建议你记住这句话:服务是自治的、可复用的业务能力单元。
举个例子,在新能源项目中:
// 不好的服务设计
public class ChargingService {
public void processCharging(String userId, String pileId, double amount) {
// 这里既做认证,又做计费,还做设备控制
}
}
// 好的服务设计
// 认证服务
public class AuthService {
public boolean authenticate(String userId) { ... }
}
// 计费服务
public class BillingService {
public double calculateFee(String userId, double amount) { ... }
}
// 设备控制服务
public class DeviceService {
public boolean startCharging(String pileId) { ... }
}
你看,拆开之后,每个服务只干一件事。认证服务挂了,不影响充电。这就是SOA的魅力。
1.5 契约:服务间的“君子协定”
契约,说白了就是服务之间怎么打招呼。我建议你用OpenAPI(以前叫Swagger)来定义RESTful接口,或者用Protobuf定义gRPC接口。
我的经验:契约一定要版本化。我曾经因为没给接口加版本号,导致充电桩固件升级后,老桩和新服务对不上,整整排查了两天。现在我的每个服务接口都带v1、v2前缀。
1.6 协议:通信的“交通规则”
协议决定了服务之间怎么传数据。新能源场景下,我常用的协议有:
- RESTful HTTP:适合查询类、管理类接口,简单直观
- gRPC:适合高频、低延迟的通信,比如充电桩实时状态上报
- MQTT:适合物联网设备,比如充电桩的远程控制
嗯,这里要注意:不要为了用协议而用协议。我见过有人用gRPC做用户登录,其实HTTP完全够用。选协议要看场景,不是看潮流。
1.7 SOA在新能源领域的价值
说了这么多,SOA到底能给新能源带来什么?我总结了几点:
SOA在新能源的四大价值:
- 系统解耦:充电、储能、光伏各自独立,互不影响
- 弹性扩展:充电桩多了,只扩展充电服务,不用动别的
- 技术异构:计费用Java,设备控制用Go,各取所长
- 快速迭代:改一个服务不影响全局,上线风险低
我记得去年做一个光储充一体化项目,客户要求三个月内上线。如果还是单体架构,根本不可能。但用了SOA,我们同时开了三个团队并行开发——充电团队、储能团队、光伏团队,各干各的,最后集成只花了一周。
避坑指南:SOA不是银弹。如果团队小、业务简单,强行上SOA反而增加复杂度。我建议:先单体,后拆分。等业务复杂度上来了,再逐步服务化。
1.8 小结
今天我们从单体架构聊到了SOA,核心就三件事:
- 服务:独立、自治、可复用
- 契约:接口规范、版本管理
- 协议:选对通信方式,别乱用
下一章,我会带你深入SOA的服务设计原则,聊聊怎么把服务拆得“刚刚好”。
公众号:蓝海资料掘金营,微信deep3321