当前位置: 首页 > 科技观察

微服务架构下的系统集成

时间:2023-03-17 23:17:28 科技观察

微服务架构相对于单体架构的优势可以列举很多方面:服务个体更小,内聚性更强,业务职责更清晰,复用性更强。独立部署发布等;从软件开发的角度来看,灵活性和效率都会有很大的提升。。。但是,微服务架构本质上是一个分布式系统架构,各个服务需要互相配合,配合完成产品需求,业务数据等。服务需要集成才能完成协同工作,那么问题来了,应该用什么方法来集成呢?应该遵循什么原则?如何设计保证不同服务间数据的一致性?混沌实现微服务架构下,推荐使用REST作为服务间同步通信的方式。对于非实时需求,可以基于事件实现异步协作。这个原则很简单,也很容易实现,但是仅仅遵循这个原则,我们就很难在微服务的道路上走下去。对于一些号称微服务架构的系统,服务拆分一开始并没有太大的问题,但是随着逻辑的不断扩展和跨服务数据交换场景的增多,这个简单的原则很难指导日常的决策,并且甚至会引发一些新的问题,举几个例子:服务循环依赖在某些场景下,服务A依赖服务B,会调用服务B的API,而在其他场景下,服务B也需要服务A的数据,并且服务也会调用AAPI来实现。单从实现的角度来说,按需获取数据非常方便,可以达到业务想要的效果;但从长远来看,两种服务的耦合度越来越紧,未来实现新需求的成本会越来越高。技术债越高,第三方系统集成到业务服务中。在某些业务场景中,当前产品所需的业务数据需要从多个第三方系统中获取,并经过一些计算后整合甚至使用。之前的一些项目在最初的实现中,都是从第三方系统获取数据后,处理后直接写入业务数据库,集成代码直接写入业务服务。好像没什么大问题,只要把代码隔离好就行。向上。但实际上后来出现了一些棘手的问题,不得不做出改变:一些定时集成任务一次只会在一个服务实例上运行,可能会有大量的数据读取、计算、更新和插入等操作会在短时间内大量占用当前服务实例的资源。严重的时候,当前服务实例甚至无法正常对外提供服务。从多个第三方系统获取,业务服务变得臃肿集成商的一些变更直接影响到业务服务,比如API升级,此类变更必须重新升级部署业务服务才能完成集成接口不是幂等的,不考虑第三方party在系统集成和调用内部服务的过程中,不幂等的接口会造成数据不一致。最典型的场景是服务A调用服务B的接口更新或写入数据,服务B处理成功,但是由于网络原因,服务A收不到服务B的响应,服务A重试调用接口,此时,服务B由于接口不幂等,返回异常响应,业务流程无法继续顺畅进行,随着项目人员的更替、交付压力大、人员能力不足等,架构开始逐渐向内移动每个人都没有想到的方向,技术债务很高。攻城狮们一边精疲力竭地追赶进度,一边只能望着债务叹息。一体化原则出现问题,架构师可以立马站出来说设计太烂了,怎么能这样;后知后觉是我们积累经验的重要手段,从高额的技术债,从我们苦苦救火线上问题,我们接到新的需求却找不到合理的解决方案……我们一直在总结经验。为了避免再次跌倒在同一个地方,我们可以遵循哪些架构设计原则?单向依赖每个服务的上下游关系在微服务拆分之初就定义好了。我们可以这样定义上下游服务的依赖关系:下游服务可以直接依赖上游服务,下游服务可以通过上游服务提供的API与上游服务同步。服务的数据被读取和写入。上游服务不依赖于下游服务。如果上游服务数据的状态变化会影响到下游服务,可以释放领域事件,下游系统监听该事件做出相应的操作。只有冗余的引用信息微服务服务之间领域实体之间存在各种关系。域实体A在依赖域实体B的信息时,通常需要在域实体A中保留一部分域实体B的副本信息。在这个副本信息中,包含了哪些信息?例如,域实体A是订单,域实体B是客户。客户每次查询订单信息时,都需要同时查出客户的姓名、性别、手机号码。在订单中冗余这三个关键信息服务可以轻松满足需求,一切听起来都那么美好。但是,如果这三个关键信息都可以改变,那么问题就来了。如果领域实体B中的信息更新了,那么领域实体A中的信息是否也应该更新?否则会造成数据不一致。如果更新不合理,增加了复杂度,并且极有可能出现循环依赖。因此,当无法确定数据变化的具体情况时,副本中只保留参考信息是最安全的,需要完整信息时可以参考查询相关信息。为第三方系统构建外观服务面对第三方系统集成,我们在系统集成过程中应该考虑得更全面。一般情况下,我们无法控制第三方系统。一旦集成出现问题,我们需要与解决方案沟通并安排开发。联调试验等,修复周期很长。另一个问题是第三方系统通常具有与我们完全不同的技术堆栈或集成。比如可能是一个很老的系统,提供的接口是基于XML的SOAP;再比如,它可能不提供API,只能通过导出文件到某个SFTP或者发送邮件的方式来集成……为了让第三方系统集成的影响尽可能小。我们倾向于构建门面服务来隐藏第三方系统的实现细节,通过门面服务对第三方系统的功能进行封装,提供与当前系统更加一致的集成方式。我们可以把外观服务和第三方系统看成一个整体,所以第三方系统的集成对于当前系统中的服务可以和内部服务一样处理。而第三方系统集成相关的细节都隔离在外观服务中,第三方系统集成的变更只需要修改外观服务即可。在集成接口的实现中考虑幂等性原则是很简单的,但是在实现过程中却很容易被忽略。如果不在设计的测试用例中,测试过程中很难发现问题;在大多数情况下,它是在线的,用户使用问题只是在现实场景中才发现,到那时业务影响已经发生。所以在涉及集成的接口中,需要特别注意业务是否需要接口的幂等性,接口不幂等时业务是否能正常流转。契约测试服务提供的接口通常有多个消费者,不同消费者关心的信息可能不同。随着服务数量的增加,在没有契约测试的情况下,很有可能某个需求修改了当前服务接口的实现,影响了其他已有的功能。而往往这个问题要等到全回归才能完全发现,甚至会出现变化范围小,回归不够,上线前很难发现的情况。契约测试可以很好的解决这个问题。测试一方面是预测试,尽早提供反馈,另一方面也起到架构守卫的作用。总结系统集成是分布式系统必须要讨论的问题,而且是个大问题,因为它直接影响到现在的系统架构。一个微不足道的改动很可能会破坏整个系统架构的原则,久而久之这些原则就会变得毫无用处。微服务架构也不例外。在没有架构约束的情况下,仅仅短期的实施往往会毁掉微服务的优势。微小的、不合理的改动会逐渐破坏整个架构建筑。所谓千里之堤,崩于蚁巢,就是这个道理。因此,在微服务架构设计之初,我们需要在团队内部确立一些原则,明确一些系统间集成需要遵循的规范,并在实践过程中定期回顾。如果有必要,我们可以使用一些辅助工具来进行架构保护。保护架构的健康。