基于微服务架构的应用开发研究
2023-05-30蒲云鹏
关键词:微服务;微服务架构;分布式系统;云计算
中圖法分类号:TP311 文献标识码:A
1引言
随着互联网、云计算的飞速发展,软件业务需求快速变化,敏捷性、灵活性和可扩展性的需求不断增长,软件技术架构也在不断演进发展,微服务架构作为一种可以满足这种需求的软件架构,正得到越来越多的关注和被广泛使用。
2微服务架构定义
微服务架构目前没有一个严格的官方定义,我们可以把微服务架构看作一种软件架构的编程思维,同时微服务架构也被看作为一种软件架构模式或者架构风格。
微服务架构提倡将单一应用程序拆分成很多相互协同工作、小而自治的“微”服务。这里的“微”不是指服务的代码少,而是指服务的范围限定为小而单个的功能。每个“微”服务运行在其独立的进程,服务与服务之间采用轻量级的通信机制互相沟通(例如,基于HTTP的REST API等)。服务能够支持独立部署,每个服务可根据自身的业务特点选择合适的技术、编程语言来构建。
3微服务架构发展
3.1起源
微服务架构据说最早是Fred George在2012年一次技术大会上的演讲Micro-Service Architecture中提出。James Lewis也在2012年举行的33rd Degree Conference大会上做了Microservices-Java,the Unix Way的演讲,讨论了微服务。之后微服务架构的概念被Martin Fowler发扬光大,他在2014年3月发表了著名的微服务架构文章Microservices,深入讲解了什么是微服务架构。
3.2发展
学习理解微服务架构,需要了解软件技术架构的发展情况。微服务架构是软件技术架构演进发展的产物,是为了解决传统单体架构(monolithic software)不能满足互联网时代快速发展而产生的,它和以前出现的面向服务架构( service-oriented architecture,SOA)有很多关联。软件架构发展如图1所示。
在传统的单体架构(monolithic software)中,软件系统的所有功能都放在一起形成一个大的应用,系统整体耦合度高,随着时间推进,应用中新加入的功能和代码越来越多,整体变得巨大,整个应用也变得更复杂和难以维护,重新构建和部署应用的成本也高。
单体架构下很难扩展、系统伸缩性差。为了降低耦合度,一方面,人们使用了分层这种通用方法对系统进行抽象化和结构化,比如常见的MVC 3层模式等。另一方面,从系统集成角度,将一个大而复杂的单体应用拆分成多个小而独立的服务是降低耦合度的方法。
在微服务架构之前出现了面向服务架构(service-oriented architecture,SOA)。
SOA架构的本质是面向服务的分布式系统架构。它把一个单体应用按照逻辑功能拆分成了多个独立服务,这些服务可以独立运行,能部署在不同的机器上,通过通信协议一起工作,进而提高了系统扩展性。SOA架构提出了面向服务的思想,所以微服务架构可以看作是SOA架构的一种演进发展。
微服务的出现离不开互联网时代的技术发展,尤其近年来容器技术(Docker)的兴起改变了传统的软件开发方式,程序可以运行在占用更少资源的容器中,服务的部署运行可以变得更加轻量化。同时,随着集成自动化软件开发、部署和维护技术DevOps等发展,使微服务架构能够更好地满足业务快速迭代、快速响应需求变化的要求。
相比SOA.微服务突出体现了“微”,微服务架构中围绕业务拆分的服务颗粒度更“微小”、部署更轻量化,通信机制不采用复杂、重量的ESB(企业服务总线),而使用了更轻量级的通信机制和协议。
需要指出的是,微服务架构技术仍在不断发展演进中,随着云计算的广泛应用,云原生应用理念被提出,使微服务与云计算的结合更加紧密。服务网格Service Mesh技术提出一种云原生下微服务中“服务到服务”的安全、快速、可靠通信的基础架构层,通过对网络通信层的控制实现服务治理与业务的分离和解耦。
另外,无服务器架构(Serverless)的出现,带来了“低成本、高弹性扩容、简化运维”的函数服务(FaaS)和后端即服务(BaaS),有助于快速构建事件驱动的微服务架构的云应用。
3.3微服务架构
简单的微服务架构如图2所示。
一个典型的微服务架构包含几个重要“组件”:微服务网关(API网关)、服务注册中心、配置中心。
(1)微服务网关。
微服务网关(API网关)在微服务架构中的作用很重要,它是系统暴露在外部的访问人口,可以看作外部客户端和后端服务之间的连接点,微服务网关可以屏蔽内部服务的细节,实现外部客户端与内部服务调用关系的解耦。
微服务网关主要功能有:微服务调用的统一人口、路由功能、安全认证、负载均衡、限流、服务管控。
(2)服务注册中心。
服务注册中心是微服务架构的“大脑”,主要解决“服务注册”和“服务发现”。微服务架构中微服务的数量、服务网络地址等是动态变化的,需要一个动态的“通讯录”来负责注册、记录服务和服务地址的映射关系,并对外提供统一接口来满足调用方可以发现并通过服务标识来进行服务的调用。注册中心实现了微服务信息注册和通过微服务标识来获取服务信息的功能。
(3)服务配置中心。
服务配置中心是微服务实现配置统一管理的机制。单体应用中配置项一般会建立本地静态配置文件进行管理。但在微服务架构中,由于微服务数量很多,需要对一些配置项进行修改,其中可能涉及几十甚至上百个配置的变更,因为使用静态文件管理会非常低效并且可靠性差,所以微服务架构需要通过配置中心将各种配置项集中并进行统一管理。配置中心可以实现配置信息的实时查询、读取、更新、删除等操作。
另外,微服务架构还包括服务容错、微服务间通信等技术。
服务容错:微服务架构下,微服务实例之间的动态调用可能会发生响应超时、错误或负载过高等情况,所以微服务架构需要容错机制。
微服务架构中采用的容错机制一般包括服务超时重试、负载过高发生故障时采用限流或熔断的机制,为保障故障不影响其他服务可采用服务隔离机制等。
微服务间通信:微服务间通过网络进行调用或信息交互,微服务通信方式主要有同步和异步2种。同步方式客户端发起请求,服务端即时响应,如A服务向B服务发起同步调用请求。同步方式一般采用远程调用RPC或基于HTTP的REST API来进行通信。异步方式下服务端不即时响应,系统耦合度低,服务间一般采用发布/订阅的模式,通过分布式消息中间件发送消息进行信息交互。主流分布式消息中间件主要包括ActiveMQ,RabbitMQ,RocketMQ,Kafka以及Pulsar。微服务架构中一般会混合同步、异步2种方式。
3.4微服务开发框架
實施微服务需要使用适合的工具,目前有一些流行的微服务开发框架能够帮助我们构建微服务应用,如Spring Boot/Spring
Clound, Dubbo, gRPC等。
(1)Spring Boot/Spring Clound。
Spring Boot/Spring Clound是用于构建微服务的著名Java框架。Spring Boot本身是一套快速配置Spring应用的“脚手架”,能够帮助开发者快速高效地构建一个基于Spring生态体系的应用,可以用来快速开发单个微服务。
Spring Cloud则是构建在Spring Boot的基础上,关注服务治理的微服务整体“解决方案”,具体包含路由、服务注册和发现、负载均衡、服务监控等功能。
(2) Dubbo。
Dubbo是一款高性能、轻量级的开源Java RPC框架,是阿里巴巴公司开源的Java分布式服务治理框架,用于多个系统间的相互调用。它提供面向接口的远程方法调用功能,并衍生出服务注册和发现、监控、路由、智能容错和负载均衡等功能。
(3) gRPC。
gRPC是由Google公司开源的一款高性能的远程过程调用(RPC)框架,网络协议采用HTTP/2协议标准设计并基于Protocol Buffers数据序列化协议,支持C++,C#,Go,Java,Node等多种开发语言。提供服务注册、发现,负载均衡,身份验证等功能。gRPC可以实现系统间的高效连接,便于构建分布式应用和微服务。
微服务开发框架还有很多,如Helidon,Vert.x,Moleculer,Falcon等,我们可以根据使用的开发语言(Java,Go,Python,c#等)以及需求来选择。很多开发框架提供了开发微服务的“脚手架”及部分功能,但没有提供微服务完整的解决方案,用户可以通过选择其他开源或商业的工具来组合形成适合自己的微服务架构整体解决方案。
比如,在使用Net core技术开发微服务应用时,可以利用Asp.net Core建立webapi程序(REST API),并部署在Docker容器中实现微服务。微服务网关(API网关)可以采用开源Ocelot,同时集成Consul作为注册、配置中心,集成Polly进行服务治理等。
4优势和挑战
4.1优势
(1)灵活、敏捷:微服务架构带来了应用程序开发、部署等方面的灵活和敏捷性。相比耦合严重的单体架构,在微服务架构下应用程序可以分成很多小而灵活的服务,每个小的服务可以专注一个特定的工作。在这种松耦合架构下,服务的开发、代码修改、验证测试以及发布速度可以变得更快,可以帮助团队更快速地响应业务需求,进而快速发布新功能。同时,这种方式也有利于小而敏捷的团队聚焦在所关注的功能点和服务上,从而实现快速修改、替代,使局部的更新更灵活和更容易部署。
(2)故障隔离:微服务架构增强了故障隔离能力,降低了由局部故障导致所有功能崩溃的风险。由于应用拆分成多个相对独立的服务,某一个服务的故障不会导致整个应用的故障和瘫痪。同时,微服务架构通过监测系统各部分的运行情况可以把故障隔离在出现问题的服务上,从而不影响到其他服务。
(3)容易扩展:微服务架构提升了整体扩展性,方便按需伸缩。
单体应用出现性能问题时只能针对应用整体进行纵向或者横向扩展,但实际上影响性能的可能只是应用的部分功能模块,同时不同的功能模块对扩展需求可能不同,如有的需要更大的内存,有的需要横向增加更多的实例。而微服务架构可以针对真正影响性能的服务进行合适的资源扩展,按需伸缩。
(4)技术栈灵活:微服务架构在技术栈选择方面较灵活。可以根据业务情况和技术团队自身特点选择合适的技术栈。开发不同的服务时使用的技术可以不同,如不同的开发语言、框架,不同的数据库等。
4.2挑战
(1)复杂性增加:微服务架构是分布式系统,而分布式系统本身是复杂的。一个单体应用被拆分成很多个独立服务后,服务之间需要网络通信,系统运行会变得更加复杂,网络延迟、闪断、性能开销、数据完整性和一致性等都会带来新的挑战,也需要更多的实践经验来处理复杂的系统。
(2)运维要求高:相比单体程序的监控运维,微服务架构中更多的服务数量给运维工作带来了挑战。为了保障多个服务的正常运行,需要有效监控服务运行的状态,以及更完备的服务监控体系,其中包括监控、日志管理、调用跟踪、通知告警、服务健康检查等。
(3)服务容错和安全挑战:系统运行中任何服务都可能出现故障,因此需要在监测到故障发生后尽可能地降低影响范围,尽快恢复正常。需要采用服务容错来保证系统的可用性,如熔断、隔离、限流和降级等。同时,安全方面需要采用有效的安全机制来保障服务的安全性,对服务访问需要进行验证和授权,防止数据泄露等。
(4)开发和测试挑战:尽管微服务带来了灵活、敏捷性,但在开发和测试方面也存在新挑战。一方面,开发中的服务拆分存在挑战,拆分结果可能存在颗粒度不合适,耗时多等问题。同时,微服务之间一般通过接口进行调用,当修改更新服务接口时,会影响到其他调用者,微服务的版本变更需要考虑好兼容性,需要做好微服务前后兼容和版本管理。另一方面,测试工具和测试策略需要适应微服务架构,需要结合持续集成CI和持续部署CD,并采用合适的测试方法。
5应用开发分析
5.1场景
(1)单体应用迁移到微服务:一些大型复杂的单体应用系统,业务复杂度高,功能模块数量多,难以对其维护和扩展,有必要通过微服务重构来进行迁移,通过合理的设计拆分,降低系统耦合度,提高系统扩展性。
另外,对于组织内部一些有关联的业务系统,可以考虑通过微服务架构进行多系统之间的整合和重构,如前后端分离,将业务功能拆分成多个独立的服务,建立统一认证、授权服务,统一门户等。
(2)新建大型系统:规划新建的大型系统,如果团队本身具有相关技术能力以及采用快速迭代、持续交付的开发方式,可以考虑直接采用微服务架构进行系统开发,而不是先开发单体应用,等到之后再进行改造。
(3)提高需求响应和交付效率:对于一些互联网类应用,业务需求变化快,需要更快速地“拥抱变化”,提高需求响应速度。微服务架构结合自动化持续集成和持续部署(CI/CD)等可以更好地满足这种需求。同时,对于流量突发型的业务,微服务架构也有助于系统实现整体的扩展性和弹性。
5.2开发建议
如何有效开发微服务架构应用?建议从下面几方面思考。
(1)需要明确自身需求和场景。无论是对现有的单体应用进行微服务改造,还是规划新建的微服务架构的应用,都需要思考一下自身需求是什么?为什么要使用微服务架构?采用微服务架构的理由是否充分?是否可以满足需求发展以及可能会带来的挑战等。
(2)要提前做好组织上的准备工作。需要考虑内部组织架构、团队的适应问题。例如,团队是否需要重组?是否具备或要培养DevOps文化,让开发与运维更契合?团队是否有明确的责任分工(服务拆分、接口设计、实施开发等)?是否需要对团队进行相关技术培训和建立更合适的开发规范?需要注意,采用微服务不仅会带来技术上的变化,也会给团队的开发方式、理念以及组织架构等带来变化。
(3)在开发技术方面建议关注几点。
a)技术栈选择:微服务开发可以使用不同的开发语言和工具,但建议技术团队选择适合自身的开发框架和技术来形成自己的开发技术栈。选择自身熟悉并且广泛流行的技术栈,选择开发框架时可以考虑下面技术点,如服务发布订阅方式、路由形式、服务间调用方式、通信协议、序列化方式等。
b)微服务拆分:微服务的“拆分”很重要,服务拆分是为了使系统模块间的结构清晰,降低耦合度,拆分的微服务应具有一定的独立性,微服务之间应减少互相依赖。
从拆分的方式上看,一般通过业务划分,按照功能模块进行拆分,尽量一个功能模块一个微服务,但服务具体大小不宜太粗或太细。
目前,领域驱动设计(Domain-Driven Design,DDD)方法常被用于进行微服务拆分。从业务的角度分析,通过DDD对系统进行抽象后得到内聚更高的业务模型集合。在DDD中一组概念接近、高度内聚并能找到清晰的边界的业务模型被称作限界上下文(Bounded Context).这些限界上下文可以作为逻辑上的微服务候选,帮助我们进行微服务划分。
此外,从单体架构迁移到微服务架构,采用人工进行微服务拆分会比较依赖人的主观经验,所以目前很多国内外学者也提出了一些不同的微服务拆分方法,主要思路是模型驱动,将服务拆分问题进行建模,通过对特定数据特征的分析,然后使用机器学习等方法进行服务拆分。例如,基于静态代码分析,通过对代码结构进行分析并通过聚类操作进行拆分:基于元数据分析;基于程序动态运行时数据流分析;基于程序工作运行环境和负载分析等。
建议在微服务应用实施过程中,结合具体的业务情况选择适当的方案进行服务拆分。
c)微服务部署:微服务的部署方式和所使用的基础设施环境很重要。
目前,容器技术(Docker)仍然是微服务架构部署的最好载体和部署方式。容器的隔离环境差异、跨平台等特性提供了部署上的灵活性,Kubernetes(K8S)作为流行的容器编排管理工具提供了集群部署、管理容器的能力,配合自动化工具、持续集成CI和持续部署CD,可以快速實现微服务应用的持续部署。
基础设施方面,建议根据实际业务情况采用本地环境或者云平台。如果可以使用公有云平台,还可以考虑是否能使用无服务器架构Serverless进行微服务开发。使用Serverless一方面可以减少学习K8S等容器编排工具的成本,另一方面Serverless本身的低成本、高弹性扩容、简化运维等特点很适合使用Rest API的微服务,可以根据具体业务需求以及微服务被调用的情况,考虑把高弹性的功能交给serverless架构实现。
6结束语
微服务架构是服务软件开发的发展趋势,越来越多的系统正使用微服务架构构建,但和其他技术一样,它带来了优势与挑战。目前,微服务架构仍在快速发展中,并与云原生紧密结合,随着云计算发展和应用,微服务架构必将给软件开发带来更多的价值。
作者简介:
蒲云鹏(1977—),本科,高级工程师,研究方向:电子政务应用、大数据技术、云计算技术、信息系统安全。