上海品茶

您的当前位置: 上海品茶 > 三个皮匠报告百科 > 微服务架构

微服务架构

目录

微服务架构是什么

2014年MartinFowler在文章中给出微服务的概念:微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制。这些服务围绕业务能力构建、可用不同的语言开发,使用不同的数据存储技术并且可通过全自动部署机制独立部署。虽然微服务架构的概念出现的晚,但在此之前有很多大公司已经做微服务的工作很长时间了,比如微软和谷歌。微服务架构可以看做是SOA进一步演化的结果,Netflix的一名专家把微服务描述为“细粒度的SOA”。

单体服务架构是将所有的功能模块打包到一起并放在一个web容器中运行,由于平台业务不断增加,导致系统扩展起来非常复杂,阻碍了业务的发展。微服务架构是将复杂臃肿的单体应用进行细粒度的服务拆分,每个微服务可以交给小的团队进行开发和维护,拆分出来的服务各自独立打包部署,每个服务可以各自进行负载均衡扩展和数据库扩展,并且每个服务可以根据自己的需要部署到合适的硬件服务器上,提高容错性,一个服务的内存泄露并不会让整个系统瘫痪

微服务架构

微服务概念与起源

微服务是可以独立完成一个功能的服务,它可以独立开发、独立测试、独立部署、独立运行、独立维护。即具备高效轻巧、易于拓展、有效应对高并发的特点[13]。最初微服务架构是由SOA架构演变而来的,微服务架构是SOA架构的升华,更强调服务的颗粒度要小。SOA架构的思想是把系统的不同功能模块,通过网络互相调用,最后组成一个完整功能的系统。并且SOA架构多用于企业业务系统,企业内部使用往往很少考虑高并发以及海量数据的问题,所以企业往往将服务都放置在一台服务器上。后来随着互联网的发展,用户数量激增伴随着需求复杂、高并发、海量数据以及高吞吐量的问题,SOA架构已经不再能应对这样的情况。

互联网企业为了快速地应对用户的需求即保持快速迭代,同时为了可以在系统性能遇到瓶颈时快速提高系统的性能以及应对海量的数据,就要对原有复杂的系统拆分成几个独立的子系统并且多个子系统使用独立的数据库和分布式缓存技术。这样一来当某一个子系统需求更新需求时,不关联其他子系统从而提高的迭代速度。并且当某一个业务模块的性能需要提升时,只需要找到对应的子系统然后生成多个实例从而提高性能。每个子系统使用独立的数据库,更大程度上降低了数据关联性从而实现数据处理的高效率。那么从这种快速迭代角度、性能提升角度、数据处理角度进行拆分组织架构的形式就是微服务架构[1].

微服务架构的优势

微服务架构相比SOA和单体架构主要具有以下六个优点:

(1)粒度更小。微服务架构相比SOA架构,服务划分粒度更小,每个微服务业务功能更加单一,逻辑简单、体量小导致实现简单、编译构建快,很方便持续集成与部署;

(2)语言无关性。微服务将应用分成多个服务,服务间通过远程调用接口实现通信,所以不要求使用同一种语言进行开发,负责各个微服务开发的团队可以结合业务需求和团队的特点合理选择技术栈;

(3)易于实现前后端分离。微服务是后端业务逻辑的代码实现,提供给前端约定好的Restful接口,前端用AJAX调用接口,获得数据后进行渲染和呈现,可以看到前后端解耦合,这对实现前后端分离十分有利。

(4)单体应用可能会因为一个功能点的故障导致整个系统不可用,而SOA中各服务间实现互联互通的关键是ESB,可能会出现单点故障,ESB不可用会导致整个应用不可用。而微服务每个服务故障只会影响当前的服务。

(5)容器技术和微服务是天然匹配的。Dockers和Linux容器等容器在微服务体系结构中工作得很好,但在SOA中使用频率较低。

(6)团队管理简单高效。微服务架构将应用分成多个独立开发、独立运行和部署的微服务,每个团队只负责自己的微服务应用就行,只需要与别的团队定义好接口,减少了团队间的沟通成本。

微服务架构框架

微服务的基本思想是将传统的单个应用程序划分为多个软件服务单元,这些单元可以根据各自的业务功能独立设计、开发、部署和运行,最终的价值是通过服务与服务之间的配合和协作实现的。面向服务是微服务的核心思想,微服务分解了传统大型应用系统的功能,将服务划分为细粒度。微服务体系结构是将单个应用的服务层划分为多个微服务,并利用API网关作为客户端和微服务之间的桥梁,其中每个微服务都对应一个独立的数据库,它可以使用多种数据库,也可以使用多种开发语言,有效地降低了服务端的耦合性,提高系统的整体性能,一个基本的微服务架构


微服务架构

微服务框架核心要点:

(1)服务注册与发现:微服务之间相互调用完成整体业务功能,服务发现就是在众多微服务中找到正确的目标服务地址。常用的做法是服务提供方启动的时候把自己的地址上报给服务注册中心,这就是服务注册。服务调用方订阅服务来变更通知,动态的接收服务注册中心推送的服务地址列表,之后接发给它就可以找到服务。

微服务架构

(2) 服务监控:大型微服务架构的服务运维需要建立一套完备的服务监控体系,包括拓扑关系、监控(Metrics)、日志监控(Logging)、调用追踪(Trace)、告警通知、健康检查等,防患于未然。来实时地掌握服务运行中的各种状态,内存使用率、调用次数、健康状况等信息。

(3) 服务容错:生产环境复杂多变,服务运行过程中不可避免的发生各种故障(宕机、过载等),需要尽可能降低影响范围、尽快恢复正常服务。需要引入熔断、隔离、限流和降级、超时机制等服务容错机制来保证服务持续可用性。

(4) 服务安全:有些服务的敏感数据存在安全问题,服务安全就是对敏感服务采用安全鉴权机制,对服务的访问需要进行相应的身份验证和授权,防止数据泄露的风险。

(5) 服务治理:服务治理就是指解决微服务架构缺陷的措施。

微服务开发框架

为实现微服务架构出现了很多支持微服务的开发框架,比如阿里巴巴的Dubbo框架、当当网基于Dubbo开发的Dubbox框架、京东使用的JSF框架等。Dubbo属于一款轻量级的开源框架,它具备轻量级、高性能等特点,支持服务注册与发现、负载均衡等功能。相比较而言,SpringCloud与Netflix结合提供了一套完整的服务组件,兼容良好,适配相对简单,便于快速构建微服务系统,进而更有利于采用微服务框架来进行系统的开发、拓展和维护

微服务架构

Dubbo介绍

Dubbo是阿里巴巴提供的一个性能优异的开源Java服务框架,使应用程序能够通过高性能的RPC实现服务输出和输入功能,并可以与Spring框架无缝集成。2018年2月,阿里的Dubbo项目正式进入Apache孵化器,并于2019年5月顺利孵化毕业,意味着Dubbo项目并非只由阿里进行组织开发,几乎80%由其他公司进行组织维护,社区更多人的参与使得Dubbo活力充沛,可以紧跟技术发展趋势。轻量化的ApacheDubbo开源框架,且有着较高性能,主要功能分为:自动注册与发现服务,远程调用面向接口,负载平衡等功能。

Dubbo分为三层,business业务逻辑层由我们自己来提供接口和实现还有一些配置信息,RPC层就是真正的RPC调用的核心层,封装整个RPC的调用过程、负载均衡、集群容错、代理等,remoting则是对网络传输协议和数据转换的封装。划分到更细的层面,整个分层依赖由上至下,除了business业务逻辑之外,其他的几层都是SPI机制

微服务架构

Dubbo工作原理:

1. 服务启动的时候,代理层provider和consumer根据配置信息,连接到注册中心,进行注册及订阅服务。

2. 服务注册层根据服务订阅关系,进行provider信息推送到consumer。

3.consumer生成代理对象,在路由层进行封装provider路由和负载均衡,选取一台provider,同时监控层会对记录接口的调用次数和时间信息监控。

4.拿到代理对象之后,consumer通过代理对象发起接口调用。

5.provider收到请求后对数据进行反序列化处理,然后通过代理调用具体的接口实现[2]

微服务架构

微服务架构的特点

(1) 服务单元按业务划分:根据MartinFowler的定义,可以按照业务功能划分微服务。一个大的业务可以分为几个小业务,一个小业务可以再细分成更小的业务。把划分好的微服务单独部署在服务器上并独立运行,从而减少了服务之间的耦合,提高了可扩展性和重用性。

(2) 服务间通过HTTP协议相互通信:按业务细分的微服务可以单独地部署,并独立运行。微服务间注重于通过HTTP协议彼此通信,大多数使用RESTfulAPI。这种通信模式与开发平台和编程语言没有关系,它可以通过不同的编程技术实现通信。

(3) 微服务的数据库独立:在单体架构中,所有业务都需要共享数据库,随着业务的增长,数据库中的表越来越多,会变得难以管理与维护。在微服务体系结构中,服务单元可以按业务划分,再无耦合关系,每个微服务可以建立自己的数据库。数据库的独立使得单业务的数据量变少,更易于维护,数据库性能会有明显优势,也方便于数据库迁移

(4) 自动化部署:在微服务体系结构中,应用系统被细分为若干个微服务,每一个微服务都有自己单独的应用程序,并需要依次部署这些微服务。随着业务划分更加细化,微服务数目的增加,部署的难度会大大提高。Docker容器技术的出现实现了自动化部署,提高了部署效率,减少了人员控制,降低了出错概率,并增强了软件的质量。

(5) 服务集中化管理:根据业务单元划分的微服务数量越多,管理起来就越复杂,因此微服务需要集中管理。目前主流的微服务框架,如SpringCloud,支持使用Eureka实现服务的注册和发现[3]

(6) 去中心化:微服务架构下每个服务都是相对独立的单元,每个服务的构建可以有多种选择,可以根据服务内容,服务对象,以及软硬件的不同,为每个服务确定最适合的开发方案。同时,微服务架构推荐数据的分散管理。同时每个服务都拥有独立的数据层,可以使用不同的数据库技术,进一步降低了耦合度。

(7) 兼容性。微服务架构是一类标准,可以支持不同的开发语言。除了Java以外,Python、C#等各类语言机制都支持微服务架构。

(8) 易于开发和维护。每个微服务都具有独立性以及专用性,因此对每个微服务的开发以及维护工作较为简单。对于微服务的业务处理逻辑可以清晰定义,并且涉及到的代码量也相对较少

(9) 运行效率高。由于单个微服务的体积较小,因此其运行效率相对较快,并且对资源的依赖较少。

(10) 扩展性好。由于系统由不同微服务构成,因此当系统需要增加额外的功能时,仅需要增加新的微服务并且增加到系统中就可以完成系统功能的扩展,具有较强的扩展能力。

微服务架构设计

微服务的设计近几年微服务架构非常火热,越来越多的项目采用微服务架构开发,微服务架构的设计需要考虑以下问题:

(1)微服务架构将单一应用划分为多个松散耦合的小型服务,合理的微服务划分至关重要。

(2)虽然微服务可以单独部署,但每个微服务应用功能单一,各个微服务需要相互协作才能实现系统的整体功能,服务间协作需要服务间通信交互,如何保证服务间的高效通信,以何种方式来进行消息交换,这就是服务调用的问题。

(3)微服务架构将一个项目系统分成许多个微服务,这么多服务,客户端如何便捷的访问,这就需要客户端访问服务端服务的单一入口,用户只要记住这个入口的地址即可。这就需要部署API网关。

(4)微服务架构的应用具有较多高度自治的微服务,那么这些微服务如何高效治理也是一个重要的问题。服务调用者如何快速找到找到服务提供者,服务发生故障时,如何及时下线,服务发现时,如何进行路由等,市场上有许多优秀的开源服务治理组件。

(5)在微服务架构将一个系统分成很多个独立运行的微服务,这些微服务需要协同工作,这里面有一个很常见的问题,就是服务之间的延迟和通信失败问题,极端的情况下,甚至会因为某个服务的性能下降或者故障宕机,导致访问超时,层层传递,引发雪崩,最终导致整个系统崩溃,这就需要有限流和熔断机制。

(6)大多数在项目中单独写一个配置文件,例如";config.conf";,然后将各类参数配置、应用配置、环境配置、安全配置、业务配置都写到这个文件里。当项目代码逻辑中需要使用配置的时候,就从这个配置文件中读取。这种做法虽然简单,但如果参数需要修改,就非常的不灵活,甚至需要重启运行中的项目才能生效。微服务应用应用将系统分成许多独立运行的微服务,微服务也需要配置,就有配置文件过于分散的问题,一个对配置文件统一管理,实时更新高可用的配置中心对微服务架构是必要的。

(7)随着业务越来越复杂,系统也随之进行各种拆分,特别是随着微服务架构和容器技术的兴起,看似简单的一个应用,后台可能有几十个甚至几百个服务在支撑,一个前端的请求可能需要多次的服务调用最后才能完成。当请求变慢或者不可用时,我们很难得知是哪个后台服务引起的,这时就需要解决如何快速定位服务故障点的问题,需要进行分布式链路追踪[4]

微服务设计原则

软件架构的设计原则,在很大程度上能够指导、提醒我们应该遵循什么的原则、规范,能让软件架构更加健壮、稳固,并易于开发、扩展、维护等。为了确保系统可扩展性和高可用性,微服务实施过程需要遵守以下设计原则:单一职责原则、服务自治原则、轻量级通信原则以及接口明确原则。

(1) 单一职责原则是指单个微服务只关心自己需要实现的、单独的系统功能,能够实现松耦合,有助于后期的更新和维护,实现迭代开发。服务自治原则是指每个微服务具备独立的业务能力、依赖以及运行环境;每个微服务的开发、测试、构建、部署独立完成,使得服务之间高度解耦。

(2) 轻量级通信原则是指微服务之间通过轻量级的通信机制进行交互,该通信机制具备轻量级、跨语言以及跨平台三个特性。

(3) 接口明确原则是指微服务之间可能存在调用关系,为了避免某个微服务的接口变化而导致其他微服务都做调整,在设计之初要考虑所有情况,让接口尽量做的更通用、灵活,从而尽量避免其他模块也做调整[5]

参考资料:

[1]龚森.基于微服务架构的电商平台设计与实现

[2]陈树伟.基于微服务架构的网络教学平台的设计与实现

[3]任丽娇.基于微服务架构的双创工作服务平台的研究与实现

[4]王慧娇.基于微服务架构和SaaS模式的机械制造服务平台的设计与实现

[5]邓超.基于微服务架构的工作流平台设计与实现

分享到微信 分享到微博 分享到QQ空间
上一篇:冷链运输
下一篇:在线教育
会员购买
客服

专属顾问

商务合作

机构入驻、侵权投诉、商务合作

服务号

三个皮匠报告官方公众号

回到顶部