【笔记】微服务架构

参考书籍:《Go 语言高并发与微服务实战》
参考书籍:《Go 微服务实战》

微服务架构设计早在 2014 年就被提出,其理念是将单体应用转化为多个可以独立开发、独立部署、独立运行和独立维护的服务或者应用的集合,从而满足业务快速变化以及多团队并行开发的需求。

在 Web 应用中,最早期的架构是单体架构,它将所有服务端模块打包成单个巨石型应用。这样做的好处是易于搭建开发环境、测试和部署,但是,当我们对某个局部进行哪怕一丁点改动的时候,整个项目就需要重新部署,而且编译时间过长。另外,因为服务端需要统一打包,所以这种架构也难以支持多语言技术栈。

业务的发展与场景的创新会使得系统的访问量逐渐增大,在单体架构使用增加机器的方法所带来的性能优化效用越来越小,不同业务部分所需要的机器数量和性能差异越来越大。为了提升机器的利用率,垂直分层架构应运而生。它是以单体架构规模的项目为单位进行垂直化划分,将大应用拆分成一个个单体结构的应用。最常见的垂直分层架构是 MVC,它将应用分为数据访问层、服务层和 Web 层。当然,这种架构也存在全部功能继承在一个工程中的问题,对于大型项目不易开发、扩展及维护;系统性能扩展只能通过扩展集群节点来实现,成本高并且有瓶颈。

当垂直架构拆分的应用越来越多时,就会出现多个应用都依赖的业务逻辑组件,并且各个应用进行交互的需求越来越大。这时,就需要将部分通用的业务组件独立出来,并定义好服务间交互的接口向外提供,让其他服务调用,这就是 SOA 面向服务结构。它是一个组件模型,将应用程序的不同服务通过这些服务之间定义良好的接口和契约联系起来。这些接口独立于实现服务的硬件平台、操作系统和编程语言,采用独立的方式进行定义。这使得构建在各种各样系统中的服务能够以一种统一和通用的方式进行交互。然而,SOA 架构比较适用于大型软件服务企业对外提供服务的场景,对于一般业务场景并不常用,其服务的定义、注册和调用都需要较为繁琐的编码或者配置来实现,并且业务总线也容易导致系统的单点风险拖累整体性能。

随着互联网浪潮的来临,越来越多的中小微企业推出面向大众的网站或者应用。这些企业不同于大型软件服务企业,没有能力也无需构建 SOA 所依赖 ESB 企业服务总线。终于在 2014 年,继承了 SOA 诸多优点和理念的微服务架构诞生,它将业务系统彻底地组件化和服务化,形成多个可以独立开发、独立部署和独立维护的服务或应用的集合,以应对更快的需求变更和更短的开发迭代周期。
微服务的最早定义是:“微服务的架构风格是将单个应用作为一组小型服务进行开发,每个服务都运行在自己的进程环境中,并通过轻量级机制(比如 HTTP 协议)进行通信。这些服务紧密围绕业务功能进行构建,可以通过自动化的方式进行部署。不同的服务之间可以采用不同的编程语言,并且管理方式尽可能不采用中央集中式。”

微服务具有很多特点:职责唯一性,微服务中的每个服务都是单一的,或者在整个架构中是唯一的;通信轻量级,每个服务都是高内聚、低耦合的设计。服务之间的通信采用轻量级的实现,就是说通信的实现与具体语言、平台无关;独立性,指每个单个服务在开发、测试和部署过程中都是独立的,不是其他服务影响,也不会影响到其他服务;进程隔离,每个微服务都运行在自己独立的进程中,有独立的运行时环境,可以方便地部署在不同的机器上。

微服务架构之所以能成为当下最先进的框架,它一定是有许多优点的:开发效率高,微服务将庞大复杂的系统进行拆分,每个微服务都变得功能单一,易于理解和方便开发,确保每个微服务的开发都很高效;新增需求响应快,因为对于服务的充分拆分,每个新的服务开发部署都非常高效,响应新需求非常快,非常适用敏捷开发;部署更方便,单个微服务的部署并不影响到全局,特别是如果一个微服务运行在多个实例上,完全可以做到部署的同时向客户提供服务。在有众多优点的同时,微服务架构也存在缺点:运维难度高,微服务的服务接口一般是比较多的,因为数量太多,所以在整个服务出现问题的时候,要找出具体是哪个微服务出了问题是有难度的。要想像在单体架构应用中一样通过单步的debug追溯原因是不可能的;分布式部署难度高,因为微服务是天然分布式的,所以部署和调度管理的难度就增加了;接口修改成本高,因为众多微服务之间是彼此调用的,所以当一个微服务接口要进行修改调整的时候,依赖该接口的其他中接口都要检查或修改;部分代码重复,因为每个微服务的开发、测试和部署都是独立的,所以造成很多重复性的功能在每个微服务中都要重复开发。

微服务架构是一种流行的趋势,它不仅带来软件基础架构上的革新,也带来了一系列良好的设计理念和原则。一,高内聚,低耦合。紧密关联的的事务应该放在一起,每个服务是针对一个单一职责的业务能力的封装,专注做好一项职责,也只会因为该职责的变化而进行修改。服务之间通过轻量级的通信方式进行通信,使得服务间相对独立,处于低耦合的状态。二,高度自治。服务独立部署运行和扩展,每个服务能够独立部署并运行在独立的进程中,这种运行和部署方式能够赋予系统灵活的代码组织方式和发布节奏,使得快速交付和应对变化称为可能。独立开发和演进,且技术选型灵活,不受遗留系统技术栈的约束,合适的业务问题可以选择合适的技术栈,可以独立的演进,服务于服务之间采取与语言无关的网络通信进行交互。独立的团队和自治,团队对服务的整个生命周期负责,工作在独立的上下文中,工程师负责项目的整个周期,不需要相互了解。三,以业务为中心。每个服务代表了特定的业务逻辑,有明显的边界上下文。围绕业务组织团队,能快速响应业务的变化。隔离实现细节,让业务领域可以被重用。四,弹性设计。设计可容错的系统,预防异常,为已知的错误而设计。设计具有自我保护能力的系统。服务之间相互隔离,限制使用资源,防止级联的服务雪崩错误。五,日志与监控。当线上环境服务出错时,需要快速的快速定位问题,检测可能发生的异常和故障。日志与监控是快速定位和预防的不二选择,是微服务架构中至关重要的组成部分。监控主要包括服务可用状态、请求流量、调用链、错误计数,结构化的日志和服务依赖关系可视化等内容,以便发现问题并及时修复。全面的监控也可以进行实时调整系统负载,必要时进行服务降级,过载保护等等,从而让系统和环境提供高效稳定的服务。六,自动化。传统的手工运维方式必然要被淘汰,微服务的实施是有一定先决条件的:那就是自动化。当服务规模化后需要更多自动化和标准化的手段来提升效能和降低成本。自动化运维必不可少,因为对比单体架构,确保大量的微服务正常运行是一个更复杂的过程。

微服务的目标是为了提供快速的业务变更响应能力,它围绕业务能力进行构建。微服务的最高宗旨是让一切去中心化,它有两个非常重要的风格:一是每个服务都拥有独立的数据库;二是系统基于API的模块化。与单体应用不同,为了满足在开发和部署上的简易性,每个微服务都对应一个数据库表,这种方式让整个系统以松耦合的方式进行整合。一个大型的项目中,为了方便维护和开发协作,都会进行模块化切分。微服务的模块化与传统应用的模块化是不同的,它是通过API进行的,其他服务无法直接调用被封装的方法,只能通过API访问。通过API进行模块化可以避免随着应用的增大而导致内部关系复杂,这让微服务的运维和新增功能更加简单。

当然,微服务架构并不是万能的,架构的选择还是要根据业务功能本身的独立性,如果系统提供的业务是非常底层的,如操作系统,功能与功能之间有着紧密的配合关系,如果强制拆分为较小的服务单元,会让集成工作量急剧上升,并且这中人为的切割无法带来业务上真正的隔离,所以无法做到独立部署和运行,也就不适合使用微服务架构了。

猜你喜欢

转载自blog.csdn.net/weixin_45922876/article/details/121070015