介绍:“微服务”是软件架构领域非常流行的词汇,你可以找到很多定义、指南、以及如何从微服务中获益的文章,在企业实践中应用“微服务”的资源非常少。在本文中,我们将介绍微服务架构的基本概念以及如何在实践中应用它。单体架构(MonolithicArchitecture)企业级应用通常面临多种业务需求,常见的方式是将大量的功能堆砌到同一个单体架构中。例如:常见的ERP、CRM等系统以单体架构的形式运行。同时,由于提供了大量的业务功能,随着功能的升级,这样一个“怪物”系统的整个研发、发布、定位、扩展、升级都会变得越来越困难.单体架构的初始效率非常高,随着时间的推移,应用会逐渐变大。在每一次迭代中,开发团队都面临着新的特性,然后开发了大量的新代码。随着时间的推移,这个简单的应用程序将变成一个巨大的怪物。图1:单体架构大多数企业使用SOA来解决上述问题。SOA的思想是将应用中相似的功能聚合起来,以服务的形式提供。因此,基于SOA架构的应用可以理解为一批服务的组合。SOA带来的问题是引入了大量的服务和消息格式定义和规范。大多数情况下,SOA服务之间是直接相互独立的,而是部署在同一个运行环境中(类似于在一个Tomcat实例下运行多个Web应用)。与单体架构类似,SOA服务会随着业务功能的增加而变得越来越复杂。本质上,它并没有因为使用了SOA而变得更好。图1是一个包含多种服务的在线零售网站。所有服务都部署在一个运行环境中,是典型的单体架构。单体应用程序通常具有以下特征:设计、开发和部署是一个单元。会越来越复杂,维护、升级、增加新功能都变得异常困难。敏捷研发模式下有些更新很难开发发布,整个应用需要重新部署。横向扩展:必须以应用为单位进行扩展,资源需求冲突时扩展变得更加困难(有的服务需要更多的计算资源,有的需要更多的内存资源)可用性:一个服务的不稳定性会导致整个应用出现问题难度在创新:难以推陈出新微服务架构(MicroservicesArchitecture)的核心思想是一个应用是由多个相互独立的小微服务组成的。服务运行在自己的进程中,开发和发布都没有依赖关系。大多数人对微服务的定义是将原本运行在单体架构中的服务拆分成独立的服务,运行在各自的进程中。在我看来,不止于此。关键是可以根据不同的业务需求,在不同的技术架构上构建不同的服务,专注于有限的业务功能。因此,在线零售网站可以简单地用图2的微服务架构来概括。根据业务需求,需要增加账户服务微服务,所以构建微服务绝不是在单一架构中拆分服务那么简单。图2:微服务架构微服务设计:规模、范围和业务功能您可以使用微服务从头开始构建应用程序,也可以重构现有系统。确定微服务的规模、范围和功能尤为重要。下面我们来讨论一下关于微服务设计的一些关键问题和误解:“微”很容易被误解:许多开发人员倾向于将服务做成尽可能小的单体架构运行以支持不同的功能。如果仍然使用类似SAO的服务,只是名副其实的微服务,无法带来微服务的任何优势。那么我们应该如何在微服务中进行设计呢?以下是微服务的设计准则:单一职责原则(SingleResponsibilityPrinciple):将某个微服务的功能集中在特定的业务或有限的范围内,有利于敏捷开发和服务发布。在设计阶段,需要定义业务范围。需要关心的是微服务的业务范围,而不是服务的数量和规模越小越好。数量和大小需要根据业务功能来确定。与SOA不同的是,微服务的功能、操作和消息协议应该越简单越好。项目初期,服务范围比较广。随着深入,进一步重构服务,细分微服务是一个很好的做法。微服务消息在单体架构中,不同功能之间的通信是通过方法调用,或者说是跨语言通信。SOA减少了这种语言的直接耦合,采用了基于SOAP协议的Web服务。这种web服务的功能和消息体定义都非常复杂,微服务需要更轻量级的机制。同步消息——REST,Thrift同步消息是指客户端需要一直等待,直到服务器返回响应。REST是微服务中默认的同步消息方式。它提供了一种基于HTTP协议和资源API样式的简单消息格式。大多数微服务采用这种方式(每个函数代表一个资源和对应的操作)。节俭是另一种选择。它使用接口描述语言来定义和创建服务,支持可扩展的跨语言服务开发,包括可用于多种语言的代码生成引擎,如C++、Java、Python、PHP、Ruby、Erlang、Perl、Haskell、C#、Cocoa、Smalltalk等打造高效无缝服务。数据传输采用二进制格式,比XML和JSON更小,对于高并发、大数据量、多语言的环境更有优势。图3:REST接口,外部微服务异步消息——AMQP、STOMP、MQTT异步消息是指客户端不需要一直等待服务响应,到达就会得到通知。有些微服务需要使用异步消息,一般使用AMQP、STOMP、MQTT。消息格式——JSON、XML、Thrift、ProtoBuf、Avro消息格式是微服务中另一个非常重要的因素。SOA的Web服务通常使用基于复杂消息格式(SOAP)和消息定义(xsd)的文本消息。微服务使用简单的文本协议JSON和XML,以及基于HTTP的资源API样式。如果您需要二进制文件,请使用Thrift、ProtoBuf、Avro。服务契约——定义接口——Swagger、RAML、ThriftIDL如果将功能实现为服务并发布,则需要定义一套契约。在单体架构中,SOA采用WSDL,过于复杂,与SOAP耦合紧密,不适合微服务。REST设计的微服务通常采用Swagger和RAML定义约定。对于不是基于REST设计的微服务,比如Thrift,通常会使用IDL(InterfaceDefinitionLanguages),比如ThriftIDL。微服务集成(服务间通信)在微服务架构下,应用的服务之间是直接相互独立的。在具体的业务应用中,需要某种机制来支持微服务之间的通信。因此,服务之间的通信机制就显得尤为重要。在SOA体系下,服务通过企业服务总线(EnterpriseServiceBus)进行通信,很多业务逻辑都在中间层(消息的路由、转换和组织)。微服务架构倾向于减少对中央消息总线(类似ESB)的依赖,将业务逻辑分散到各个具体的服务端。大多数微服务都是基于HTTP和JSON等标准协议,集成不同的标准和格式已经不再重要。另一种选择是使用轻量级的消息总线或网关,它具有路由功能,没有复杂的业务逻辑。下面介绍几种常见的架构方式。点对点模式——直接调用服务在点对点模式中,直接使用服务。每个微服务暴露一个RESTAPI并调用其他微服务的接口。图4:通过点对点模式进行通信。显然,这种模式在相对简单的微服务应用场景下是可行的。随着应用程序复杂性的增加,它会变得越来越难以维护。这个有点类似于SOA的ESB,尽量不要使用点对点的集成。点对点有以下缺点:用户授权、限制、监控等非功能性需求需要在每个微服务中实现。随着功能的演进,服务会越来越复杂。不同的servicedirects,clients和servicedirects没有控制功能(监控,跟踪,过滤)Directcommunication在大型系统设计中一般都是负面的。因此,如果你设计一个大规模的微服务系统,尽量避免点对点通信,不能使用ESB这样的重量级总线。它是一种提供非业务功能抽象的轻量级总线。这是API网关方式。API-网关模式API网关模式的核心点是所有客户端和消费者通过统一的网关访问微服务,所有非业务功能都在网关层处理。通常,网关也是一个提供REST/HTTP的访问API。服务器通过API-GW注册和管理服务。图5:通过API网关公开微服务是我们在线商店的一个示例。在图5中,所有的业务接口都是通过APIGateway暴露出来的,APIGateway是所有客户端接口的唯一入口。微服务之间的通信也通过API网关。网关方式有以下优点:能够为微服务接口提供网关级的抽象。比如微服务的接口可以是多种多样的,在网关层可以对外暴露一个统一的标准化接口。轻量级消息路由和格式转换。统一管控安全、监控、限流等非业务功能。每个微服务都会变得更加轻量,所有非业务功能都在网关层处理。微服务只需要关注业务逻辑。目前API网关方式应该是微服务架构中使用最广泛的设计模式。消息代理微服务也可以集成在异步场景中,通过队列和订阅主题来发布和订阅消息。微服务可以是消息的发布者,将消息异步发送到队列或订阅主题。作为消费者的微服务可以从队列或主题中获取消息。通过消息中间件解耦服务之间的直接调用。图6:异步通信方式通常是异步生产者/消费者模式,通过AMQP、MQTT等异步消息规范。在分散的数据整体架构中,具有不同功能的服务模块将数据存储在中央数据库中。图7:单体架构,使用一个数据库来存储所有微服务的数据,多个服务的设计是相互独立的,数据也应该相互独立(例如一个数据库结构定义方法的改变)微服务可能会中断其他服务)。因此,每个微服务都应该有自己的数据库。图8:每个微服务都有自己的私有数据库,其他微服务无法直接访问。数据去中心化的核心点:每个微服务都有自己的私有数据库来持久化业务数据。每个微服务只能访问自己的数据库,不能访问其他服务的数据库。在某些业务场景下,需要在一个事务中更新多个数据库。在这种情况下,你不能直接访问其他微服务的数据库,而是对微服务进行操作。数据的去中心化进一步降低了微服务之间的耦合度,不同的服务可以使用不同的数据库技术(SQL、NoSQL等)。在复杂的业务场景中,如果包含多个微服务,通常在客户端或者中间层(网关)进行处理。下篇文章将介绍微服务实战的其他方面:管理去中心化、服务注册与发现、安全、事务、失败设计等。微服务实践:从架构到发布(2)原作者:KasunIndrasiri,软件架构师,WSO2原文链接:https://dzone.com/articles/microservices-in-practice-1Team_Cloud服务研发成员:FrankQin关于MaxLeapMaxLeap移动云服务平台为企业提供一站式的移动研发和运营云服务,帮助企业快速开发和上线移动应用。该平台提供数据云存储、云引擎、支付管理、IM、数据分析和营销自动化等服务。官网链接:https://maxleap.cn
