1。微服务架构简介微服务架构(MicroserviceArchitecture)是一种架构概念,旨在通过将功能分解为离散的服务来解耦解决方案。您可以将其视为在架构级别而不是获取服务的类应用许多SOLID原则。微服务架构是一个非常有趣的概念。其主要作用是将功能分解为离散的服务,从而降低系统的耦合度,提供更灵活的服务支持。概念:将一个大型的单一应用程序和服务拆分成几个甚至几十个支持性的微服务,这样可以扩展单个组件而不是整个应用程序堆栈以满足服务级别协议。定义:围绕可以独立开发、管理和迭代的业务领域组件创建应用程序。在去中心化的组件中使用云架构和平台式部署、管理和服务能力使产品交付更加容易。本质:用一些功能更清晰、业务更精细的服务来解决更大更实际的问题。2、微服务(Microservice)概念的产生和发展出现于2012年,作为一种加快Web和移动应用开发进程的方法,2014年开始受到各方关注,2015年可以说微服务是2019元年;越来越多的论坛、社区、博客、互联网行业巨头开始讨论和实践微服务。可以说,这进一步推动了微服务的发展和创新。而微服务的流行,MartinFowler功不可没。这位老者是个奇人,尤其擅长抽象归纳和概念创造。特别是像微服务这样的新名词,有一个特点:一解释就懂,一问就不懂,一讨论就打起来。MartinFowler是国际知名的OO专家,敏捷开发方法的创始人之一,现任ThoughtWorks首席科学家。面向对象分析与设计、UML、模式、软件开发方法论、XP、重构等领域的世界顶级专家,现任ThoughtWorks首席科学家。ThoughtWorks是一家从事企业应用程序开发和集成的公司。早在20世纪80年代,福勒就提倡使用对象技术构建多层企业应用程序。着有几本经典著作:《企业应用架构模式》、《UML精粹》、?等。————百度百科3、传统开发模式与微服务的区别我们先来看看传统的web开发模式。通过对比更容易理解什么是微服务架构。对应Microservice,这种方式一般称为Monolithic(单体开发)。所有功能都打包在一个WAR包中,基本没有外部依赖(容器除外),部署在一个JEE容器(Tomcat、JBoss、WebLogic)中,包括DO/DAO、Service、UI等所有逻辑。优点:①开发简单,集中管理②基本没有重复开发③功能都是本地的,没有分布式管理和调用消耗缺点:1.效率低:开发是在同一个项目改代码,互相等待,冲突不断2.难维护:代码功能耦合在一起,新手无从下手3.不灵活:构建时间长,任何一个小的修改都需要重构整个项目,很费时间4.稳定性差:一个小问题,全May导致整个应用挂掉5.扩展性不足:无法满足高并发下的业务需求常见系统架构遵循的三大标准和业务驱动:1.Improveragility:及时响应业务需求,推动企业发展2.改善用户体验:提升用户体验,减少用户流失3.降低成本:降低添加产品、客户或业务解决方案的成本基于微服务架构设计:目的:有效拆分应用,实现微服务的敏捷开发和部署可视化表达:X轴:运行多个负载均衡器后的运行实例Y轴:将应用进一步分解为微服务(分库)Z轴:当有是数据量大,把服务分区(分表)4.微服务官方定义的具体特点:1.一系列独立的服务共同组成一个系统2.独立部署,运行在自己的进程中3.每个服务是为一个独立的业务开发的4.分布式管理5.强调隔离大致标准:1.由分布式服务组成的系统2.按业务划分组织,不按技术划分3.做有生命的产品,不做项目4.强服务个体弱沟通(Smartendpointsanddumbpipes)5.自动化运维(DevOps)6.高容错7.快速演化与迭代五、SOA与微服务的区别1、SOA喜欢复用,微服务喜欢重写SOA。一起。说到SOA,就不得不说ESB(EnterpriseServiceBus)。什么是ESB?将ESB视为连接所有企业级服务的脚手架。通过服务代理,它可以将不同的数据格式或模型转换为规范格式,将XML输入转换为CSV并将其发送到遗留服务,将SOAP1.1服务转换为SOAP1.2等。它还可以将一个服务路由到另一个服务,并集中业务逻辑、规则、验证等。它还具有消息队列和事件驱动消息传递的重要功能,例如将JMS服务转换为SOAP协议。服务之间可能存在复杂的依赖关系。微服务通常从重写一个模块开始。重写整个单体应用程序是有风险的,而且不一定是必要的。当我们迁移到微服务时,通常会从耦合度最低的模块或扩展性要求最高的模块开始,将它们一个一个地剥离出来并敏捷地重写,尝试最新的技术、语言和框架,以及然后分别部署它们。它通常不依赖于其他服务。微服务中常用的APIGateway模式的主要目的不是为了重用代码,而是为了减少客户端和服务之间的通信。API网关模式不等同于Facade模式。我们可以使用future之类的调用,甚至返回不完整的数据。2、SOA喜欢横向服务,微服务喜欢纵向服务。SOA设计喜欢对服务进行分层(比如ServiceLayers模式)。我们经常会看到一个Entity服务层的设计,这个层叫做DataAccessLayer。这种设计要求所有服务都通过Entity服务层获取数据。这种设计非常不灵活。例如,数据层的每一次变化都可能影响所有业务层的服务。而且每个微服务通常都有自己独立的数据存储。我们在拆分数据库的时候,可以适当的做一些反规范化(denormalization),让它不需要依赖其他服务的数据。微服务通常直接面向用户,每个微服务通常直接为用户提供某种功能。类似的功能可能有一种服务用于手机,另一种服务用于机顶盒。在SOA设计模式中,这种情况通常使用Multi-ChannelEndpoint模式来返回一个考虑到所有客户端需求的大而全面的结果。3、SOA喜欢自上而下,微服务喜欢自下而上SOA架构在设计之初都会先定义服务契约(servicecontract)。它喜欢集中管理所有服务,包括集中管理业务逻辑、数据、流程、模式等。它使用EnterpriseInventory和ServiceComposition等方法来集中管理服务。SOA架构通常预先定义了各个模块的服务接口。模块系统之间的通信必须遵循这些接口,每个服务都是针对它们的调用者的。SOA架构适用于像TOGAF这样的架构方法。微服务更加敏捷。只要用户能用,先把这个服务挖出来。然后有针对性的快速确认业务需求,快速开发迭代。6.如何实践微服务为了真正应用微服务,我们需要解决四个问题:1.客户端如何访问这些服务?2、各个服务之间如何通信?3.这么多服务如何实现?4.服务宕机了,怎么解决?(备份方案、应急处理机制)1、客户端如何访问这些服务。独创的Monolithic开发方式,所有服务都在本地,直接调用UI即可。现在,它们按照功能拆分成独立的服务,运行在独立的通用虚拟机上,两者都是Java进程。客户端UI如何访问他的?后台有N个服务,前台需要记住管理N个服务。当一个服务下线/更新/升级时,前台必须重新部署。这显然不符合我们的拆分概念,尤其是当前台是移动应用程序时。业务变化的步伐通常更快。另外,N个小服务的调用也是一个很大的网络开销。系统内部还有通用的微服务,通常是无状态的。用户登录信息和权限管理(OAuth)最好有一个统一的地方。所以后台的N个服务和UI之间通常会有代理或者APIGateway。其功能包括:①提供统一的服务入口,让微服务对前台透明②聚合后台服务,节省流量,提升性能③提供安全、过滤、流量控制等API管理功能。其实这个APIGateway可以有很多广义的实现。可以是一个软硬件一体的盒子,也可以是一个简单的MVC框架,甚至是一个Node.js服务器。.它们最重要的作用是为前台(通常是移动应用)提供后台服务的聚合,提供统一的服务出口,实现解耦。但是,APIGateway也可能成为单点故障或性能瓶颈。用过淘宝开放平台(TaobaoOpenPlatform)的人很容易理解,TAO就是APIGateway。2、各个服务之间如何通信所有的微服务都是独立的Java进程运行在独立的虚拟机上,所以服务之间的通信就是IPC(进程间通信),有很多成熟的解决方案。现在有两种最基本最常用的方式:同步调用:①REST(JAX-RS,SpringBoot)SpringBoot最全的基础教程:https://github.com/javastacks/spring-boot-best-practice②RPC(Thrift,Dubbo)异步消息调用(Kafka,Notify,MetaQ)同步和异步的区别:同步调用一般比较简单,一致性强,但是容易出现调用问题,性能体验会很差,尤其是当有很多调用级别时。RESTful和RPC的比较也是一个很有意思的话题。一般来说,REST是基于HTTP的,更容易实现,也更容易被接受。服务器端实现技术也更加灵活。可以支持所有语言,可以跨客户端。对客户没有特殊要求。SDK只要封装了HTTP就可以调用,所以使用比较广泛。RPC也有自己的优势。传输协议更高效,安全更可控。尤其是在一个公司内部,如果有统一的开发规范和统一的服务框架,其开发效率优势更加明显。看各自技术积累的实际情况和自己的选择。异步消息方式在分布式系统中应用尤为广泛。既可以降低调用服务之间的耦合度,又可以作为调用之间的缓冲,保证消息的积压不会压垮被调用方,同时保证调用方提供更好的服务体验并继续做下去你应该做什么而不被后台性能减慢。但要付出的代价是一致性的弱化,需要接受数据的最终一致性;另外,后台服务一般需要做到幂等性,因为出于性能的考虑,消息的发送一般都是重复的(保证消息被接收到并且只接收一次,对性能是一个很大的考验);最后,必须引入独立经纪人。如果没有公司内部的技术积累,对于券商分布式管理也是一个不小的挑战。3、那么多的服务是如何实现的?在微服务架构中,每个服务一般都有多个副本用于负载均衡。一个服务随时可能下线,也可能为了应对临时的访问压力而增加新的服务节点。服务如何相互感知?服务是如何管理的?这就是服务发现的问题。通常有两种方法,每种方法都有自己的优点和缺点。基本上,服务注册信息的分布式管理是通过zookeeper等类似技术完成的。服务上线时,服务提供者向ZK(或类似框架)注册自己的服务信息,通过心跳维护长链接,实时更新链接信息。服务调用者通过ZK寻址,根据可定制的算法找到服务,也可以在本地缓存服务信息,提高性能。当服务下线时,ZK会向服务客户端发送通知。客户端:优点是架构简单,扩展灵活,只依赖服务注册中心。缺点是客户端要维护所有调用服务的地址,技术难度大。一般大公司都有成熟的内部框架支持,比如Dubbo。服务端实现:优点是简单,所有服务对前端调用者都是透明的。通常,小型公司使用更多部署在云服务上的应用程序。4、服务宕机,如何解决前面提到,Monolithic开发的一个很大的风险就是把所有的鸡蛋放在一个篮子里,一荣一负。分布式最大的特点就是网络不可靠。这种风险可以通过微服务拆分来降低,但是如果没有特别的保障,结局肯定是一场噩梦。所以当我们的系统是由一系列的服务调用链组成的时候,一定要保证任何一个环节出现问题都不会影响到整个环节。对应的手段有很多:①重试机制②限流③熔断机制④负载均衡⑤降级(本地缓存)这些方法基本清晰通用,比如Netflix的Hystrix:https://github.com/Netflix/Hystrix七、CommondesignPatternsandapplications对微服务架构需要考虑的问题有很好的总结,包括:1.API网关2、服务间调用3、服务发现4、服务容错5、服务部署6、数据调用六种常见的微服务架构设计模式:1.聚合器微服务设计模式这是最常见也是最简单的设计模式:聚合器调用多个服务来实现应用程序需要的功能。它可以是一个简单的网页,用于处理和显示检索到的数据。也可以是更高层的复合微服务,将获取到的数据加入业务逻辑,然后发布到新的微服务中,符合DRY原则。此外,每个服务都有自己的缓存和数据库。如果聚合器是一个复合服务,那么它也有自己的缓存和数据库。聚合器可以沿X轴和Z轴独立扩展。2.代理微服务设计模式这是聚合模式的一种变体,如下图所示:这种情况下,客户端不聚合数据,而是根据业务需求的差异调用不同的微服务。代理可以简单地委托请求,也可以进行数据转换工作。3.链式微服务设计模式这种模式在收到请求后会产生一个合并的响应,如下图所示:这种情况下,服务A收到请求后会与服务B通信,同理,服务B会与服务C通信.所有服务都使用同步消息传递。客户端将阻塞,直到整个调用链完成。因此,服务调用链不宜过长,以免客户端等待时间过长。4.分支微服务设计模式该模式是聚合器模式的扩展,允许同时调用两条微服务链,如下图所示:5.数据共享微服务设计模式Autonomy是设计原则之一微服务,也就是说微服务是全栈服务。但是在重构现有的“单体应用程序”时,SQL数据库非规范化会导致数据重复和不一致。因此,这种设计模式可以用在单体应用向微服务架构的过渡阶段,如下图所示:在这种情况下,一些微服务可能会共享缓存和数据库存储。然而,这只有在两个服务之间存在强耦合关系时才有可能。这是基于微服务的新应用程序的反模式。6、异步消息微服务设计模式虽然REST设计模式很流行,但是它是同步的,会造成阻塞。因此,一些基于微服务的架构可能会选择使用消息队列来代替REST请求/响应,如下图所示:八、优缺点1、微服务的优点:关键点:复杂度可控,独立按需扩展,技术灵活选择、容错、高可用①解决了复杂性问题。它将一个奇怪的单体应用程序分解成一组服务。虽然功能总量保持不变,但应用程序已分解为可管理的块或服务。每个服务都以RPC或消息驱动的API的形式定义了明确的边界;微服务架构模式实现了一定程度的模块化。②这种架构使得每项服务都可以由专门负责该服务的团队独立开发。开发人员可以自由选择任何有用的技术,只要服务符合API合同即可。当然,大多数组织都希望避免完全无政府状态并限制技术选择。然而,这种自由意味着开发人员不再有义务使用新项目开始时存在的潜在过时技术。在编写新服务时,他们可以选择使用当前的技术。此外,由于服务相对较小,使用当前技术重写旧服务变得可行。③微服务架构模式使得每个微服务都可以独立部署。开发人员无需协调更改即可部署本地服务。这些更改可以在测试后尽快部署。例如,UI团队可以执行A|B测试并快速迭代UI更改。微服务架构模式支持持续部署。④微服务架构模式,使得每个服务都可以独立调整。您只能部署满足其容量和可用性限制的每个服务的尽可能多的实例。此外,您可以使用最符合您的服务资源要求的硬件。2、微服务的劣势重点(挑战):系统部署依赖、服务间通信成本、数据一致性、系统集成测试、重复工作、性能监控等①劣势之一是名称本身。微服务一词过于强调服务规模。但重要的是要记住,这是一种手段,而不是主要目标。微服务的目标是充分分解应用程序,以促进应用程序的敏捷开发和部署。②微服务器的另一个主要缺点是分布式系统产生的复杂性。开发者需要选择并实现一种基于消息传递或RPC的进程间通信机制。此外,他们必须编写代码来处理部分故障,因为请求的目的地可能很慢或不可用。③微服务器的另一个挑战是分区数据库架构。更新多个业务实体的业务交易是相当普遍的。但是,在基于微服务器的应用程序中,您需要更新不同服务拥有的多个数据库。使用分布式事务通常不是一种选择,这不仅仅是因为CAP定理。许多当今高度可扩展的NoSQL数据库不支持它们。您最终不得不使用最终一致性方法,这对开发人员来说更具挑战性。④测试微服务应用也比较复杂。类似服务的测试类将需要启动该服务及其依赖的任何服务(或至少为这些服务配置存根)。同样,重要的是不要低估这样做的复杂性。⑤微服务架构模式的另一大挑战是跨多个服务实现变更。例如,假设您正在实现一个需要更改服务A、B和C的故事,其中A依赖于B,B依赖于C。在单体应用程序中,您可以简单地更改相应的模块,集成更改,一次性部署。相比之下,在微服务架构模式中,您需要仔细规划和协调每个服务的变更。例如,您需要更新服务C,然后更新服务B,然后修复A。幸运的是,大多数更改通常只影响一个服务,需要协调的多服务更改相对较少。⑥部署基于微服务的应用也更加复杂。单个应用程序只需部署在传统负载均衡器后面的一组相同服务器上。每个应用程序实例都配置有基础设施服务(例如数据库和消息代理)的位置(主机和端口)。相比之下,微服务应用程序通常由大量服务组成。例如,每个服务将有多个运行时实例。需要配置、部署、扩展和监控更多移动部件。此外,您需要实施一种服务发现机制,使服务能够发现它需要与之通信的任何其他服务的位置(主机和端口)。传统的基于票证的手动方法无法扩展到这种复杂程度。因此,成功部署微服务应用程序需要开发人员对部署方法有更大的控制权,并实现高水平的自动化。9、思维:意识的转变微服务对我们的思考更多的是思维的转变。对于微服务架构:技术上不是问题,意识比工具更重要。微服务的一些设计出发点:1.应用的核心是业务逻辑,根据业务或客户需求组织资源(这个是最难的)2.做一个有生命的产品而不是一个项目3.狼队,Full-stack4.后台服务实现了SingleResponsibilityPrinciple(单一职责原则)5.VM->Docker(toPE)6.DevOps(toPE)同时对于开发者来说,有那么多的中间件和强大的PE支持当然是好事,但是我们也需要深入了解这些中间件背后的原理,知道为什么,在技术资源有限的情况下如何通过开源技术实现微服务?最后,普遍提到微服务离不开DevOps和Docker。理解微服务架构是核心,devops和docker是工具和手段。
