lolizeppelin
2020-03-11 16:48:17 +08:00
不要纠结微服务的名词, 这里提供一个具体项目的实现给你参考,这个项目就做了类似你说的事
openstack 的 nova, nova 之前也是服务自写数据库,后来拆分出了一个叫 conductor 的服务,后续版本各个服务都通过 conductor 来处理数据。
虽然我没参加过大型的项目开发,但是 openstack 就反馈出了大型项目开发会遇到的问题以及产生的解决办法
这个 conductor 解决的问题就是
大型项目中会产生很多版本迭代,对应的数据表结构会有各种变化
在微服务时代产生的更大的问题是, 大家不能一起升级!!还要一起跑!
举两个例子:
例 1:
比如说服务 A 和服务 B 都要写同一个表, 服务 A 有需求在表上变更的字段
最好的解决办法当然是服务 A、服务 B 同步表结构,但是因为各种问题 B 目前不能更新,这下咋办?
例 2:
有 1000 台服务器在跑服务 A,如果服务 A 升级变更表结构,怎么做到无缝升级?
为了解决问题, openstack 弄了一个叫 versioned objects 的玩意来解决上面的问题
通常的 orm 都是 model 映射到数据库的表,对 model 对象操作直接反馈到表上
而 versioned object 就是 model 上再加了一层(作用并不是简单的类似 java 的那个叫 dao 层的东西)
代码不在操作 model 层转而操作 versioned object 对象
versioned object 对象的操作落地操作就是将 versioned object 对象序列化后,rpc 到数据落地服务,也就是上面说的 conductor, conductor 还原 versioned object 对象再进行 model 的对应操作
versioned object 的主要属性就是 model 字段和对应值,以及 versioned object 的版本号, conductor 会根据 versioned object 版本的不同做对应兼容操作以便正确映射到 model 上, 对不兼容的版本报告错误
这样的结构就解决了上面的问题,兼容了不同版本的服务,也让升级变得平滑
微服务很多做法都是解决大型项目版本迭代而产生的,不一定是为了解决性能问题,从性能上找原因方向就错了