博客地址git
在单体到微服务架构的迁移过程当中,咱们常常会问一个问题:在什么状况下我须要从单体中剥离一部分出来将其做为一个微服务?答案有不少,其中有一个答案就是:我发现好多单体都有类似的功能,我以为能够把它抽出来作一个公共服务。github
那么何为公共服务?公共服务就是那些专门为其余服务提供服务的服务,它的业务具备高度普适性和可复用性。好比用户服务、订单服务就是这样一类服务。数据库
那咱们怎样才能达成这一目标呢?下面举个例子说明:segmentfault
咱们发现单体A、B、C中的具备高度类似的功能F,通过初步研究发现能够抽取出一个公共服务P,因而立刻安排人员开发,而后上线、迁移。
一切彷佛会很顺利,可是等等,这里有太多风险和未经验证的东西。那咱们应该怎么作?架构
第一步:识别不兼容运维
咱们须要深刻到单体A、B、C的功能F的细节中去考察,虽然功能F在各个单体中的看起来差很少,可是细节是魔鬼。
毕竟这三个单体是独立演进的,若是深刻细节,就会发现AF、BF、CF总有一些不兼容的地方,具体表现形式能够是数据schema不一致、接口不一致,还有更糟糕的——部分业务逻辑不一致。分布式
这些不兼容若是一开始不识别出来,那最有可能的结果是开发人员从单体A中抽取功能F开发公共服务P,结果公共服务P只能给单体A使用,单体B、C彻底没法使用。微服务
第二步:设计并导入概念post
识别出了不兼容,那么咱们就须要做出一套兼容单体A、B、C的功能F的设计,在设计过程当中咱们须要和单体A、B、C的产品经理、需求设计人员、开发人员作详尽的沟通。
作这些沟通最主要的目的就是将新的功能F的设计导入到相关人员的脑中,即所谓的概念导入。加密
概念导入是很是重要的一步,道理很简单,若是你们对同一件事情的认知是同样的,那么这件事情就好办了,不然在推行过程当中极可能出现不可预料的阻力。
第三步:开发类库
好了,我们设计也作了,思想也统一了,为何不直接开始开发服务P呢?这是由于虽然咱们在第二步已经统一了思想,可是在真正落地的时候极可能还会存在乎想不到的困难。
所以咱们要把这些困难在早期趟平,用的办法就是提供功能F的公共类库,将其替换掉原来单体A、B、C中的代码。
这一工做完成后我能可以获得的成果有:
也就是说,咱们作到了表里一致,有了这个基础,开发公共服务P才有了真正坚实的基础。
第四步:微服务架构设计
公共类库的思路毕竟仍是单体应用的思路,只是作到了代码层面的复用。当你要作公共服务P的时候就须要额外考虑一些额外的设计,好比:
固然以上这些并非说要一次性所有作到,能够一开始只实现一部分,以后经过迭代不断地完善。
第五步:迁移
好了,咱们的公共服务P已经上线了,那么如何从公共类库迁移到公共服务P呢?
其实到这一步就很简单了,在制做公共类库的时候咱们应该定义了良好的接口,而且提供了一套基于单体架构的实现。
如今咱们只需提供一套基于公共服务的实现而后替换上去就能够了。举个例子,公共类库有一个接口叫作UserRepository
,它有一个实现是查询本地数据库的,咱们只需提供另外一个实现是查询RESTful接口的就能够了。
固然,这个查询RESTful接口的实现最好也由公共服务P的开发团队提供,这样能够避免单体A、B、C开发团队的重复劳动。
第六步:没有第六步
到此为止大功告成。