如何快速搭建一个微服务架构

什么是微服务?java

微服务(Microservices Architecture)是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每一个微服务仅关注于完成一件任务并很好地完成该任务。在全部状况下,每一个任务表明着一个小的业务能力。web

微服务的概念源于2014年3月Martin Fowler所写的文章“Microservices” martinfowler.com/articles/mi…spring

单体架构(Monolithic Architecture )数据库

企业级的应用通常都会面临各类各样的业务需求,而常见的方式是把大量功能堆积到同一个单体架构中去。好比:常见的ERP、CRM等系统都以单体架构的方式运行,同时因为提供了大量的业务功能,随着功能的升级,整个研发、发布、定位问题,扩展,升级这样一个“怪物”系统会变得愈来愈困难。编程

这种架构模式就是把应用总体打包部署,具体的样式依赖自己应用采用的语言,若是采用java语言,天然你会打包成war包,部署在Tomcat或者Jetty这样的应用服务器上,若是你使用spring boot还能够打包成jar包部署。其余还有Rails和Node.js应用以目录层次的形式打包设计模式

clipboard.png

上图:单体架构安全

大部分企业经过SOA来解决上述问题,SOA的思路是把应用中相近的功能聚合到一块儿,以服务的形式提供出去。所以基于SOA架构的应用能够理解为一批服务的组合。SOA带来的问题是,引入了大量的服务、消息格式定义和规范。服务器

多数状况下,SOA的服务直接相互独立,可是部署在同一个运行环境中(相似于一个Tomcat实例下,运行了不少web应用)。和单体架构相似,随着业务功能的增多SOA的服务会变得愈来愈复杂,本质上看没有由于使用SOA而变的更好。图1,是一个包含多种服务的在线零售网站,全部的服务部署在一个运行环境中,是一个典型的单体架构。网络

单体架构的应用通常有如下特色:架构

  • 设计、开发、部署为一个单独的单元。
  • 会变得愈来愈复杂,最后致使维护、升级、新增功能变得异常困难
  • 很难以敏捷研发模式进行开发和发布
  • 部分更新,都须要从新部署整个应用
  • 水平扩展:必须以应用为单位进行扩展,在资源需求有冲突时扩展变得比较困难(部分服务须要更多的计算资源,部分须要更多内存资源)

可用性:一个服务的不稳定会致使整个应用出问题

  • 创新困难:很难引入新的技术和框架,全部的功能都构建在同质的框架之上
  • 运维困难:变动或升级的影响分析困难,任何一个小修改均可能致使单体应用总体运行出现故障。

微服务架构(Microservices Architecture)

微服务架构的核心思想是,一个应用是由多个小的、相互独立的、微服务组成,这些服务运行在本身的进程中,开发和发布都没有依赖。不一样服务经过一些轻量级交互机制来通讯,例如 RPC、HTTP 等,服务可独立扩展伸缩,每一个服务定义了明确的边界,不一样的服务甚至能够采用不一样的编程语言来实现,由独立的团队来维护。简单的来讲,一个系统的不一样模块转变成不一样的服务!并且服务可使用不一样的技术加以实现!

clipboard.png

上图:微服务架构

微服务设计

那咱们在微服务中应该怎样设计呢。如下是微服务的设计指南:

  • 职责单一原则(Single Responsibility Principle):把某一个微服务的功能聚焦在特定业务或者有限的范围内会有助于敏捷开发和服务的发布。
  • 设计阶段就须要把业务范围进行界定。
  • 须要关心微服务的业务范围,而不是服务的数量和规模尽可能小。数量和规模须要依照业务功能而定。
  • 于SOA不一样,某个微服务的功能、操做和消息协议尽可能简单。
  • 项目初期把服务的范围制定相对宽泛,随着深刻,进一步重构服务,细分微服务是个很好的作法。

微服务消息

在单体架构中,不一样功能之间通讯经过方法调用,或者跨语言通讯。SOA下降了这种语言直接的耦合度,采用基于SOAP协议的web服务。这种web服务的功能和消息体定义都十分复杂,微服务须要更轻量的机制。

同步消息 REST

同步消息就是客户端须要保持等待,直到服务器返回应答。REST是微服务中默认的同步消息方式,它提供了基于HTTP协议和资源API风格的简单消息格式,多数微服务都采用这种方式(每一个功能表明了一个资源和对应的操做)

异步消息 – AMQP, STOMP, MQTT

异步消息就是客户端不须要一直等待服务应答,有应到后会获得通知。某些微服务须要用到异步消息,通常采用AMQP, STOMP, MQTT 这三种通信协议

消息格式 – JSON, XML, Thrift, ProtoBuf, Avro

消息格式是微服务中另一个很重要的因素。SOA的web服务通常采用文本消息,基于复杂的消息格式(SOAP)和消息定义(xsd)。微服务采用简单的文本协议JSON和XML,基于HTTP的资源API风格。若是须要二进制,经过用到Thrift, ProtoBuf, Avro。

服务约定 – 定义接口 – Swagger, RAML, Thrift IDL

若是把功能实现为服务,并发布,须要定义一套约定。单体架构中,SOA采用WSDL,WSDL过于复杂而且和SOAP紧耦合,不适合微服务。

REST设计的微服务,一般采用Swagger和RAML定义约定。

对于不是基于REST设计的微服务,好比Thrift,一般采用IDL(Interface Definition Languages),好比Thrift IDL。

微服务集成 (服务间通讯)

大部分微服务基于RPC、HTTP、JSON这样的标准协议,集成不一样标准和格式变的再也不重要。另一个选择是采用轻量级的消息总线或者网关,有路由功能,没有复杂的业务逻辑。下面就介绍几种常见的架构方式。

点对点方式

点对点方式中,服务之间直接用。每一个微服务都开放REST API,而且调用其它微服务的接口。

clipboard.png

上图:经过点对点方式通讯

很明显,在比较简单的微服务应用场景下,这种方式还可行,随着应用复杂度的提高,会变得愈来愈不可维护。这点有些相似SOA的ESB,尽可能不采用点对点的集成方式。

API-网关方式

API网关方式的核心要点是,全部的客户端和消费端都经过统一的网关接入微服务,在网关层处理全部的非业务功能个。一般,网关也是提供REST/HTTP的访问API。服务端经过API-GW注册和管理服务。

clipboard.png

上图:经过API-网关暴露微服务

全部的业务接口经过API网关暴露,是全部客户端接口的惟一入口。微服务之间的通讯也经过API网关。

采用网关方式有以下优点:

  • 有能力为微服务接口提供网关层次的抽象。好比:微服务的接口能够各类各样,在网关层,能够对外暴露统一的规范接口。
  • 轻量的消息路由、格式转换。
  • 统一控制安全、监控、限流等非业务功能。
  • 每一个微服务会变得更加轻量,非业务功能个都在网关层统一处理,微服务只须要关注业务逻辑

目前,API网关方式应该是微服务架构中应用最普遍的设计模式。

消息代理方式

微服务也能够集成在异步的场景下,经过队列和订阅主题,实现消息的发布和订阅。一个微服务能够是消息的发布者,把消息经过异步的方式发送到队列或者订阅主题下。做为消费者的微服务能够从队列或者主题共获取消息。经过消息中间件把服务之间的直接调用解耦。

如何快速搭建一个微服务架构
上图:异步通讯方式

一般异步的生产者/消费者模式,经过AMQP, STOMP, MQTT 等异步消息通信协议规范。

数据的去中心化

单体架构中,不一样功能的服务模块都把数据存储在某个中心数据库中。

clipboard.png

每一个微服务有本身私有的数据库,其它微服务不能直接访问。单体架构,用一个数据库存储全部数据

微服务方式,多个服务之间的设计相互独立,数据也应该相互独立(好比,某个微服务的数据库结构定义方式改变,可能会中断其它服务)。所以,每一个微服务都应该有本身的数据库。

clipboard.png

每一个微服务有本身私有的数据库,其它微服务不能直接访问。每一个微服务有本身私有的数据库,其它微服务不能直接访问。

数据去中心话的核心要点:

  • 每一个微服务有本身私有的数据库持久化业务数据
  • 每一个微服务只能访问本身的数据库,而不能访问其它服务的数据库
  • 某些业务场景下,须要在一个事务中更新多个数据库。这种状况也不能直接访问其它微服务的数据库,而是经过对于微服务进行操做。

数据的去中心化,进一步下降了微服务之间的耦合度,不一样服务能够采用不一样的数据库技术(SQL、NoSQL等)。在复杂的业务场景下,若是包含多个微服务,一般在客户端或者中间层(网关)处理。

微服务架构的优势:

  • 每一个服务都比较简单,只关注于一个业务功能。
  • 微服务架构方式是松耦合的,能够提供更高的灵活性。
  • 微服务可经过最佳及最合适的不一样的编程语言与工具进行开发,可以作到有的放矢地解决针对性问题。
  • 每一个微服务可由不一样团队独立开发,互不影响,加快推出市场的速度。
  • 微服务架构是持续交付(CD)的巨大推进力,容许在频繁发布不一样服务的同时保持系统其余部分的可用性和稳定性。

微服务架构的缺点:

微服务的一些想法在实践上是好的,但当总体实现时也会呈现出其复杂性。

  • 运维开销及成本增长:总体应用可能只需部署至一小片应用服务区集群,而微服务架构可能变成须要构建/测试/部署/运行数十个独立的服务,并可能须要支持多种语言和环境。这致使一个总体式系统若是由20个微服务组成,可能须要40~60个进程。
  • 必须有坚实的DevOps开发运维一体化技能:开发人员须要熟知运维与投产环境,开发人员也须要掌握必要的数据存储技术如NoSQL,具备较强DevOps技能的人员比较稀缺,会带来招聘人才方面的挑战。
  • 隐式接口及接口匹配问题:把系统分为多个协做组件后会产生新的接口,这意味着简单的交叉变化可能须要改变许多组件,并需协调一块儿发布。在实际环境中,一个新品发布可能被迫同时发布大量服务,因为集成点的大量增长,微服务架构会有更高的发布风险。

代码重复:某些底层功能须要被多个服务所用,为了不将“同步耦合引入到系统中”,有时须要向不一样服务添加一些代码,这就会致使代码重复。

  • 分布式系统的复杂性:做为一种分布式系统,微服务引入了复杂性和其余若干问题,例如网络延迟、容错性、消息序列化、不可靠的网络、异步机制、版本化、差别化的工做负载等,开发人员须要考虑以上的分布式系统问题。
  • 异步机制:微服务每每使用异步编程、消息与并行机制,若是应用存在跨微服务的事务性处理,事务的实现更具挑战性,其实现机制会变得复杂化。
  • 可测性的挑战:在动态环境下服务间的交互会产生很是微妙的行为,难以可视化及全面测试。经典微服务每每不过重视测试,更多的是经过监控发现生产环境的异常,进而快速回滚或采起其余必要的行动。但对于特别在乎风险规避监管或投产环境错误会产生显著影响的场景下须要特别注意。

关于微服务架构的取舍

  • 在合适的项目,合适的团队,采用微服务架构收益会大于成本。
  • 微服务架构有不少吸引人的地方,但在拥抱微服务以前,也须要认清它所带来的挑战。
  • 须要避免为了“微服务”而“微服务”。
  • 微服务架构引入策略 – 对传统企业而言,开始时能够考虑引入部分合适的微服务架构原则对已有系统进行改造或新建微服务应用,逐步探索及积累微服务架构经验,而非全盘实施微服务架构。
相关文章
相关标签/搜索