微服务理论与实践现代互联网的发展方向•当企业发展到一定规模后,一定是大规模、云计算和大数据的三者的结合,从而形成平台,么微服务就是基于此而提出的。什么是微服务•集中式架构也是单块应用最常使用的架构模式。•分布式架构,最常见的应用是将一个大的任务拆分到不同的机器中进行计算,最终有一台服务器合并计算结果。•第三种就是微服务架构。什么是微服务•Themicroservicearchitecturalstyleisanapproachtodevelopingasingleapplicationasasuiteofsmallservices,eachrunninginitsownprocessandcommunicatingwithlightweightmechanisms,oftenanHTTPresourceAPI.Theseservicesarebuiltaroundbusinesscapabilitiesandindependentlydeployablebyfullyautomateddeploymentmachinery.Thereisabareminimumofcentralizedmanagementoftheseservices,whichmaybewrittenindifferentprogramminglanguagesandusedifferentdatastoragetechnologies.•–JamesLewisandMartinFowler微服务特性•一些列的独立的服务共同组成系统•单独部署,跑在自己的进程里•每个服务为独立的业务开发•分布式的管理微服务和SOA的区别•、•微服务只是一种为经过良好架构设计的SOA解决方案,是面向服务的交付方案。•微服务更趋向于以自治的方式产生价值。•微服务与敏捷开发的思想高度结合在一起,服务的定义更加清晰,同时减少了企业ESB开发的复杂性。•微服务是soa思想的一种提炼!•SOA是重ESB,微服务是轻网关。微服务定义小结微服务的建模•1、松耦合和高内聚•松耦合:修改一个服务不需要同时修改另一个,每个微服务都可以单独修改和布署。•高内聚:把相关的事务放在一起,把不相关的排除出去,聚集在一起的事务只能干同一件事。微服务的建模•2、限界上下文•限界:划分规定界限、边界•上下文:业务的整个流程。•当我们检查已有的系统时,经常会发现系统中存在混杂在一起的模型,模型之间的边界是非常模糊的。此时应该为整个系统绘制一个边界,然后将其归纳在大范围之内。微服务的建模•3、逐步上下文•划分方法:一开始识别粗粒度的限界上下文、这些粗粒度的上下文可能包括一些套嵌的限界上下文,这些套嵌的上下文不直接对外可见。•暴露原则:使用粗粒度上下文还是套嵌上下文暴露服务,哪个更合理,应该由组织结构来决定。微服务的建模订单处理,货物接收和库存管理三个模块在项目研发初期被归集到了仓库服务中,财务服务要获取库存管理的数据,直接访问仓库服务的库存管理接口就可以了。随着三个模块的不断演进和壮大,单个服务已经不能满足业务和团队发展的需求,这时候将三个模块分别拆分演变成右图的结构,订单管理,货物接收和库存管理分别以服务的形式对应不同的团队,财务服务只需请求库存管理服务就可以得到相应的数据。微服务集成•1、集成原则•微服务的集成做得好,可以保持自治性、可以独立发布修改和发布。•避免破坏性修改服务的修改不能导致该服务的消费方发生改变。•保证API与技术的无关性•保证API的易用性•隐藏内部实现细节微服务集成•2、编排与协同•编排:同步调用一组服务,等待各个服务的返回结果。优点是知道业务流程中每一步跨服务调用结果,缺点是容易承担太多的调用,太耗时,导致调用方的不稳定性。微服务集成•2、编排与协同(发布-订阅模式实现松耦合)•协同:异步调用一组服务或服务调用加入队列中,降低服务之间的耦合度,带来的额外工作是业务流程跨服务的监控,但可通过消费方处理完成后,回调服务方告知处理结果。微服务集成•3、版本管理•尽可能推迟破坏性修改宽进严出的原则•尽早发现破坏性的修改按照契约,通过测试及早发现是服务方还是消费方破坏性的修改•不同的接口版本共存最好共存两个版本微服务架构的设计模式聚合器微服务设计模式•这是最常用也最简单的设计模式:聚合器微服务设计模式•聚合器调用多个服务实现应用程序所需的功能。•它可以是一个简单的Web页面,将检索到的数据进行处理展示。它也可以是一个更高层次的组合微服务,对检索到的数据增加业务逻辑后进一步发布成一个新的微服务,这符合DRY原则。•每个服务都有自己的缓存和数据库。如果聚合器是一个组合服务,那么它也有自己的缓存和数据库。聚合器可以沿X轴和Z轴独立扩展。代理微服务设计模式•在这种情况下,客户端并不聚合数据,但会根据业务需求的差别调用不同的微服务。代理可以仅仅委派请求,也可以进行数据转换工作。链式微服务设计模式•这种模式在接收到请求后会产生一个经过合并的响应•服务A接收到请求后会与服务B进行通信,类似地,服务B会同服务C进行通信。所有服务都使用同步消息传递。在整个链式调用完成之前,客户端会一直阻塞。因此,服务调用链不宜过长,以免客户端长时间等待。分支微服务设计模式•这种模式是聚合器模式的扩展,允许同时调用两个微服务链分数据共享微服务设计模式•自治是微服务的设计原则之一,就是说微服务是全栈式服务。但在重构现有的“单体应用(monolithicapplication)”时,SQL数据库反规范化可能会导致数据重复和不一致。因此,在单体应用到微服务架构的过渡阶段,可以使用这种设计模式。•在这种情况下,部分微服务可能会共享缓存和数据库存储。不过,这只有在两个服务之间存在强耦合关系时才可以。对于基于微服务的新建应用程序而言,这是一种反模式。分数据共享微服务设计模式异步消息传递微服务设计模式•REST设计模式非常流行,但它是同步的,会造成阻塞。因此部分基于微服务的架构可能会选择使用消息队列代替REST请求/响应。案例分析•案例一:如何拆分单块系统结构案例一:如何拆分单块系统结构•对于一个单块系统,往往首先要从数据库入手进行拆分,规划好哪些是财务代码的表,哪些是客户代码的表,将二者进行分离。•这时单块系统的应用结构并没有拆分,这还需要我们在进行设计单块系统的时候,客户代表和财务代码的表字段不能混在一起,要设计成不同的表才能方便将来拆分,虽然系统是在一起的,但是却为未来作了拆分准备。•最后将应用系统拆分独立布署,这个过程就结束了。案例分析•案例二:如何跨系统访问数据表案例二:如何跨系统访问数据表•有两个服务,分别是产品目录和财务,左图的场景是财务服务直接调用产品目录的数据表进行数据获取。•这种跨服务的数据获取方式是有问题的,首先无法把控财务服务是如何获取数据的,是否对数据表造成影响,其次从设计的角度来说无疑又增长了系统之间调用的耦合度,系统之间的依赖增强了。•因此演变成右图这样,左图只需提供服务接口给右图调用即可。案例分析•案例三:服务设计中的不良习惯案例二:如何跨系统访问数据表•在此系统中,ABCD四个系统进行了串联,这样就要求这四个系统分别都是高可用的,如果其中任何一个系统挂了或者发生问题,都会直接影响其他所有系统。•所以设计微服务架构的时候要尽量避免这种集中式的架构。如何大规模使用微服务•真正使用微服务,有很多需要关注的点:•1、故障无所不在•网络是不可靠,只能尽力限制引起故障的因数,达到一定规模后,故障不可避免。•2、跨功能需求•服务吞吐量、可用性和数据持久性等这些需求需要持续测量,并保证服务满足可接受的目标。•3、功能降级•构建弹性系统,因微服务功能分散,在有可能down机的微服务上,能够安全的降级以保证弹性如何大规模使用微服务•4、反服务脆弱•为了不会引起严重级联影响,需要正确的设置超时、实现舱壁隔离或断路层等以避免在第一时间调用一个不健康的服务。•超时•设置超时时间对于调用下游服务十分重要,超时时间设置太长有可能把下游系统拖慢,设置太短可能下游服务未处理完成。最好设置一个默认的超时时间,当超时发生时后,记录到日志里看看发生了什么,并且做响应的调整。•断路器•使用断路器,当请求下游服务发生一定数量的失败后,短路器打开,接下来的请求快速失败。一断时间后,查看下游服务是否已服务,重置断路器。如何大规模使用微服务•舱壁•为每个下游服务建立单独的连接池。超时和断路器资源受限时释放资源,舱壁第一时间确保它不成为限制。还有一个拒绝请求的舱壁,用以避免资源饱和,称之为减载。•隔离•当下游服务离线,上游服务不受影响。设置成为服务间隔离。•5、幂等•幂等操作,多次执行所产生的影响,均与一次执行影响相同。可以把某些特定业务操作设计成幂等的,比如客户下单送积分。如何大规模使用微服务•6、扩展•增加负载、减少延迟。•更强大的主机:垂直扩展,更好的机器。•拆分负载:按业务拆分成不同的微服务•分散风险:数据跨机房,异地备份等•负载均衡:避免服务单点故障•作业分离:Job独立服务执行•重新设计:一般设计系统需要考虑10倍容量增长。重新设计系统应对规模化,是成功的标志。如何大规模使用微服务•7、扩展数据库•服务的可用性•服务的持久性:多副本•读取数据扩展:读写分离•写操作扩展:分表分库•共享数据库设施:容易形成单点故障•CQRS:命令查询职责分离如何大规模使用微服务•8、缓存的使用•9、自动伸缩•响应型伸缩、预测型伸缩•10、CAP定理•在分布式系统中有三方面需要彼此权衡:一致性、可用性和分区容忍性。这个定理告之我们最多只能能保证三个中的两个。