我搞懂了微服务架构,微服务架构图( 三 )


如果你阅读了Fowler的整篇文章,你会发现,其中的指导建议是非常实用的 。在决定将所有组件组合到一起时,开发人员需要非常确信这些组件都会有所改变,并且规模也会发生变化 。服务粒度越粗,就越难以符合规定原则 。服务粒度越细,就越能够灵活地降低变化和负载所带来的影响 。然而,利弊之间的权衡过程是非常复杂的,我们要在配置和资金模型的基础上考虑到基础设施的成本问题 。
在了解了微服务架构后,我们来分析下微服务架构又哪些缺点和难点 。微服务模块拆分后,各微服务间集成复杂度指数级增加简单举例来说,一个企业已经实施了5个业务系统,业务系统之间有10个接口 。如果全部微服务化则可能设计到50个微服务模块,上100个接口和集成点 。可想而知,在彻底实施微服务后,我们前期架构设计,后期集成和管控的复杂度增加10倍以上 。
这种集成难度会远超大多数人想象,如果拿真实做的项目来说,如果谈业务系统只有3个,而到微服务模块级别则有接近60个,而实际涉及到的集成接口上1000个 。我们做任何一个复杂端到端业务的联调基本就需要花2,3周甚至更长的时间 。互联网企业为何适合做微服务架构,其重要的一个原因就是互联网企业如电商平台,在进行了微服务化后各个模块之间耦合性很低,并不会有太多的集成和协同点 。
或者简单来说,各个微服务模块更多的是向上面的PC端或APP端提供服务能力,而模块横向间接口协同很少 。正是在这种低耦合情况下,协同和集成相对来说容易 。而转回到企业内部你会发现,在微服务模块化后,各个模块之间的集成点相当多,特别是业务系统拆分到模块或组件这一个级别后,很多原有内部的集成和依赖点全部暴露出来了,你都需要去很好的管理 。
由于这里面有大量的横向集成和协同点,因此导致的就是微服务模块间的横向集成异常复杂,远超很多互联网应用,这是实际你会面临的问题 。微服务模块拆分后,各微服务间集成复杂度指数级增加只谈微服务架构的松耦合和高扩展性,而不谈开发和集成复杂度的都是耍流氓 。实际上当前很多企业对微服务架构并没有如此迫切,互联网很多企业推行微服务架构更多的还是考虑到巨大的业务并发量下的系统弹性扩展能力,而实际大多数企业内应用往往并没有如此海量并发 。
其次,即使在并发量增加的情况下通过进行代码本身的优化,数据库调优或者升级硬件服务器资源都可以较好的解决性能问题 。而做这些事情投入的成本远远小于微服务架构带来的开发复杂度增加成本,后期的运维管控成本 。要做到完全微服务模块独立,微服务架构下最大的一个变化就是数据库也拆分开了,原来的一个业务系统如果分为5个微服务模块,那理论上就是5个独立的后台数据库,而且数据库间还不能随便相互连接和访问 。
只有这样微服务模块才能做到独立部署和管理 。由于数据库拆分带来两个问题,其一是我们原来很简单的一个跨表查询操作现在无法做了,我们必须调用两个微服务模块提供的服务,查询到数据后再到逻辑层进行组合 。其次最大的问题就是如果一个业务操作需要同时更新两个微服务模块的数据,由于服务本身无状态,导致了这种分布式事务问题很难解决 。
企业内业务系统很大一个特点就是业务逻辑和规则相对互联网更加复杂,而且有更高的事务一致性要求 。正是由于这个原因,无法解决好分布式事务的问题都将直接导致后续数据不一致和业务错误 。原来通过调用项目内一个API方法就能解决的问题,现在要调用远程WS接口才能解决,这本身就增加了开发和调试的复杂度 。一个微服务模块与外部其它模块的集成和协同越少,你会发现该微服务模块和传统业务系统开发没太大区别,但是当其涉及到完成任何一个功能都需要调用外部微服务模块的服务接口时候,其开发模式和效率上就会带来巨大的变化 。

推荐阅读