很多团队在业务起步阶段用的是单体架构,一个工程打包所有功能,部署简单、开发快。但业务量上来之后,代码越来越臃肿,改一个功能要重新部署整个应用,一个模块出问题全线受影响。这时候拆微服务就成了刚需。
微服务架构不是简单地把大项目拆成小项目,而是从业务能力出发,把单体应用按领域边界拆分成独立部署、独立扩展的服务单元。摩尔狮在帮企业做云原生改造时,见过太多拆分不当导致的问题——拆得太碎通信成本暴增,拆得太粗跟没拆一样。
想系统学习云原生技术,云原生培训这块的内容可以重点关注一下,摩尔狮有完整的课程体系。
微服务拆分有4个核心原则。
按业务边界拆分是第一条原则。一个电商系统可以拆成用户服务、商品服务、订单服务、支付服务,每个服务对应一个明确的业务领域。拆的时候参考领域驱动设计(DDD),用通用语言界定边界,别按技术层拆,比如把所有DAO拆成一个服务,那样只会制造耦合。
数据独立是第二条原则。每个微服务拥有自己的数据库,服务之间不共享数据库表。数据要互通就通过API调用,不直接跨库查。这条原则看着简单,执行起来最痛苦,因为很多老系统的数据表之间外键关联一大堆,拆的时候要先把数据关系理清楚。
团队自治是第三条原则。一个微服务由一个小团队负责,从开发到部署到运维全包。团队对服务有完整的控制权,不用跟其他团队协调就能发布。康威定律说系统架构会反映组织结构,团队边界和服务边界要对齐。
渐进式拆分是第四条原则。别想着一个周末把单体拆完,风险太大。先拆出一个边界最清晰的服务,跑通整个流程,验证拆分方案可行,再逐步拆其他的。每拆一个服务,观察一段时间,确认没有引入新的问题。
实际迁移分5步走。
第一步,领域建模。拉上产品和业务方一起梳理业务流程,画领域模型图,识别出核心领域和支撑领域。这一步决定了后面怎么拆,花时间多讨论值得。
第二步,划分服务边界。根据领域模型确定微服务的粒度和职责。粒度太小会导致服务数量爆炸,运维成本飙升;粒度太大会失去独立部署的意义。一般来说,一个团队能独立维护的服务数量在5到10个之间比较合理。
第三步,数据拆分。把共享数据库按服务边界拆开,每个服务建自己的库。拆的时候先做数据复制,新旧库双写,确认数据一致后再切流量。这个阶段最容易出问题,建议在低峰期操作,准备好回滚方案。
第四步,定义服务接口。服务之间通过REST API或gRPC通信。接口设计要遵循向后兼容原则,字段只加不删,版本号管理好。API网关可以做统一入口,处理鉴权、限流、路由转发。
第五步,灰度迁移。新服务上线后先接一小部分流量,观察日志和监控数据,确认无异常再逐步放量到全量。老单体里的对应模块等流量完全切走后再下线,不要急着删代码。
容器化是微服务部署的基础设施,这篇Docker容器化部署入门指南讲了5个核心概念和上手路径。服务多了之后还需要K8s来管理,Kubernetes集群管理入门里提到的高频排坑经验也很实用。
微服务拆分是个系统工程,拆分原则要守、迁移节奏要稳、基础设施要跟上。急于求成只会把单体大泥球变成分布式大泥球,更难维护。
更多阿里云认证资讯,请关注公众号:摩尔狮云证通