软件架构模式-读书笔记(4)-微服务架构
发布日期:2021-10-03 22:59:33 浏览次数:22 分类:技术文章

本文共 2583 字,大约阅读时间需要 8 分钟。

微服务架构模式作为替代单体应用和面向服务架构的一个可行的选择,在业内迅速取得进展。微服务架构的每个组件都作为一个独立单元进行部署,让每个单元可以通过有效、简化的传输管道进行通信,同时它还有很强的扩展性,应用和组件之间高度解耦,使得部署更为简单。要理解这种模式,最重要的概念就是服务组件(service         component)。

模式拓扑

虽然有很多方法来实现微服务架构模式,但三个主要的拓扑结构为:基于REST API的拓扑结构,基于REST的应用拓扑结构和集中式消息拓扑结构。

1)基于REST的API拓扑

基于REST的API拓扑适用于网站,通过某些API对外提供小型的、自包含的服务。这种拓扑结构,如下图所示,由粒度非常细的服务组件(因此得名微服务)组成,这些服务组件包含一个或两个模块并独立于其他服务来执行特定业务功能。在这种拓结构扑中,这些细粒度的服务组件通常被REST-based的接口访问,而这个接口是通过一个单独部署的web API层实现的。此种拓扑的例子包含一些常见的专用的、基于云的RESTful     web service,大型网站都在使用。

2)基于REST的应用拓扑

基于REST的应用拓扑结构与基于REST API的不同,它通过传统的基于web的或胖客户端业务应用来接收客户端请求,而不是通过一个简单的API层。如下图所示,应用的用户接口层(user interface layer)是一个web应用,可以通过简单的REST-based接口访问单独部署的服务组件(业务功能)。该拓扑结构中的服务组件与API-REST-based拓扑结构中的不同,这些服务组件往往会更大、粒度更粗、代表整个业务应用程序的一小部分,而不是细粒度的、单一操作的服务。这种拓扑结构常见于中小型企业等复程度相对较低的应用程序。

3)集中式消息拓扑

微服务架构模式中另一个常见的方法是集中式消息拓扑。该拓扑与前面提到的基于REST的应用拓扑类似,不同的是,application REST-based拓扑结构使用REST进行远程访问,而该拓扑结构则使用一个轻量级的集中式消息代理(如ActiveMQ, HornetQ等等)。不要将该拓扑与面向服务架构模式混淆或将其当做SOA简化版(“SOA-Lite”),这点是极其重要的。该拓扑中的轻量级消息代理(Lightweight Message Broker)不执行任何编排,转换,或复杂的路由;相反,它只是一个轻量级访问远程服务组件的传输工具。

集中式消息拓扑结构通常应用在较大的业务应用程序中,或对于某些对传输层到用户接口层或者到服务组件层有较复杂的控制逻辑的应用程序中。该拓扑较之先前讨论的简单基于REST的拓扑结构,其好处是有先进的排队机制、异步消息传递、监控、错误处理和更好的负载均衡和可扩展性。与集中式代理相关的单点故障和架构瓶颈问题已通过代理集群和代理联盟(将一个代理实例为分多个代理实例,把基于系统功能区域的吞吐量负载划分开处理)解决。

避免依赖和编排

微服务架构模式的主要挑战之一就是决定服务组件的粒度级别。如果服务组件粒度过粗,那你可能不会意识到这个架构模式带来的好处(部署、可扩展性、可测试性和松耦合),然而,服务组件粒度过细将导致服务编制要求,这会很快导致将微服务架构模式变成一个复杂、容易混淆、代价昂贵并易于出错的重量级面向服务架构。

如果你发现需要从应用内部的用户接口或API层编排服务组件或者你发现你需要在服务组件之间执行服务间通信来处理单个请求,那么很有可能你服务组件的粒度太细了。服务间通信,可能导致组件之间产生耦合,但可以通过共享数据库进行处理。

共享数据库可以处理信息需求,但是共享功能呢?如果一个服务组件需要的功能包含在另一个服务组件内,或是一个公共的功能,那么有时你可以将服务组件的共享功能复制一份(因此违反了DRY规则:don’t repeat yourself)。为了保持服务组件独立和部署分离,微服务架构模式实现中会存在一小部分由重复的业务逻辑而造成的冗余,这在大多数业务应用程序中是一个相当常见的问题。小工具类可能属于这一类重复的代码。

如果你发现就算不考虑服务组件粒度的级别,你仍不能避免服务组件编排,这是一个好迹象,可能此架构模式不适用于你的应用。

微服务架构模式解决了很多单体应用和面向服务架构应用存在的问题。由于主要应用组件被分成更小的,单独部署单元,使用微服务架构模式构建的应用程序通常更健壮,并提供更好的可扩展性,支持持续交付也更容易。该模式的另一个优点是,它提供了实时生产部署能力,从而大大减少了传统的月度或周末“大爆炸”生产部署的需求。因为变化通常被隔离成特定的服务组件,只有变化的服务组件才需要部署。由于微服务架构模式是分布式的架构,他与事件驱动架构模式具有一些共同的复杂的问题,包括约定的创建、维护,和管理,远程系统的可用性,远程访问身份验证和授权。

微服务架构优劣势分析

方向

评级

分析

整体灵活性

整体的灵活性是能够快速响应不断变化的环境。由于单独部署单元的概念,变化通常被隔离成单独的服务组件,使得部署变得快而简单。同时,使用这种模式构建的应用往往是松耦合的,也有助于促进改变。

易于部署

整体来讲,由于该模式的解耦特性和事件处理组件使得部署变得相对简单。

可测试性

由于业务功能被分离成独立的应用模块,可以在局部范围内进行测试,这样测试工作就更有针对性。对一个特定的服务组件进行回归测试比对整个单体应用程序进行回归测试更简单、更可行。而且,由于这种模式的服务组件是松散耦合的,从开发角度来看,由一个变化导致应用其他部分也跟着变化的几率很小,并能减小由于一个微小的变化而不得不对整个应用程序进行测试的负担。

性能

虽然你可以从实现该模式来创建应用程序并可以很好的运行,整体来说,由于微服务架构模式的分布式特性,并不适用于高性能的应用程序。

伸缩性

由于应用程序被分为单独的部署单元,每个服务组件可以单独扩展,并允许对应用程序进行扩展调整。

易开发性

由于功能被分隔成不同的服务组件,由于开发范围更小且被隔离,开发变得更简单。程序员在一个服务组件做出一个变化影响其他服务组件的几率是很小的,从而减少开发人员或开发团队之间的协调。

转载地址:https://blog.csdn.net/lclfans1983/article/details/115693933 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:软件架构模式-读书笔记(5)-基于空间的架构
下一篇:软件架构模式-读书笔记(3)-微内核架构

发表评论

最新留言

感谢大佬
[***.8.128.20]2023年03月14日 08时05分03秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

最新文章

tb添加背景html,开发工具与关键技术:DW 使用HTML制作登陆界面设置透明背景图... 2019-12-06 20:23:48
计算机桌面打标签,桌面记事本,详细教您怎么在桌面添加便签 2019-12-06 20:23:48
俄语考生学计算机难吗,俄语说的不好,没有计算机证书,甚至还是单身狗,怎么办?... 2019-12-06 20:23:48
鸿蒙系统会不会在p40上用,鸿蒙系统何时出现在华为手机上 华为证实P40系统有重大改动... 2019-12-06 20:23:45
android 3g 定位,Hbuil使用android studio 离线打包+地图定位的使用配置 2019-12-06 20:23:45
android 常用技术,打造自己的Android常用常识体系 2019-12-06 20:23:46
android package.xml,android – ${packageName}.${activityClass}如何在布局XML文件中工作? 2019-12-06 20:23:46
android tcp测速工具,PCATTCP使用札记——TCP UDP速度测试工具 2019-12-06 20:23:46
opera mini android apk,Download Opera Mini APK Android 2019-12-06 20:23:46
android system image 编译出错,Android framework 编译常见错误 2019-12-06 20:23:46
c语言中逻辑真等价于非零的整数6,全国计算机等级考试二级C语言笔试试题及答案(六)(44页)-原创力文档... 2019-12-06 20:23:44
c语言求解极大质数,for语句计算输出10000以内最大素数怎么搞最简单??各位大神们... 2019-12-06 20:23:44
数据结构c语言版 线性表的动态分配顺序存储结构表示和实现,《数据结构》(C语言版)——线性表的动态分配顺序存储结构... 2019-12-06 20:23:44
c语言其他运算符serft,东软面历年考题汇总(完全).doc 2019-12-06 20:23:44
android typeface设置字体,Android使用TypeFace设置TextView的文字字体 2019-12-06 20:23:45
linux判断指针非法6,Linux Kernel 'inet6_hashtables.c' NULL指针引用拒绝服务漏洞 2019-12-06 20:23:45
linux内核线程之深入浅出,【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】Linux内核线程之深入浅出... 2019-12-06 20:23:42
c语言门铃设计实验报告,模拟电子技术课程设计实验报告 2019-12-06 20:23:43
c语言常用函数速查手册apk,c语言常用函数strcmp函数和strcpy函数 2019-12-06 20:23:43
c语言 java转换器,求助大神!!!JAVA转换成C语言 2019-12-06 20:23:43