微服务架构的设计原则和核心话题

目录

一、前言

二、微服务架构的设计原则

1.拆分足够微

2.轻量级通信

3.单一职责原则

4.领域驱动原则

三、微服务架构的核心话题

1.服务拆分

2.服务注册与发现

3.负载均衡

4.API网关

5.服务部署与发布

四、总结


一、前言

毫无疑问,微服务架构的设计原则和核心话题是本文要讨论的重点,也是打算从零基础开始构建微服务架构需要事先考虑、规划的。一个好的产品、应用能否稳定运行,持续开发,满足业务需求,能否经得起现实的考验,就需要在设计阶段考虑很多、很多,以确保它的健壮性。

当我们从单体架构的应用走向基于微服务的架构时,首先会面临一个很棘手的问题是如何进行服务的拆分,服务的拆分粒度应该如何衡量,怎样拆分的服务才算是“微”。接着将又会面临,这么多的服务又如何关联起来呢?如何有效的相互间通信呢?如何高效的部署呢……

本文我将从微服务架构的设计原则、核心话题两大方面展开讨论,希望能够对你构建一个微服务架构的应用有所帮助。

二、微服务架构的设计原则

软件架构的设计原则、方法论,在很大程度上能够指导、提醒我们应该遵循什么的原则、规范,能让软件架构更加健壮、稳固,并易于开发、扩展、维护等。

1.拆分足够微

在解决复杂的问题时,我们倾向于将问题划分成若干个小问题来解决,所谓“大事化小,小事化了”。单体架构的应用,随着时间的推移,会变得越来越臃肿,越来越难以维护,适当的做“减法”,可以解决单体架构存在的这些问题。

将单体架构的应用拆分为微服务架构的应用时,服务的拆分粒度问题,成为了重中考虑的问题。粒度太大,拆分的不够充分,便和单体架构没有太大的区别,更不能发挥出微服务的优势。如果拆分的太细,又将会面临着服务数量太多而引发的服务管理、服务间调用的问题。对于如何“微”才算是足够的“微”,是没有标准的衡量计算方法的。

微服务不是说越小越好。服务越小,微服务架构的优点和缺点也就会越来越明显。服务越小,微服务的独立性就越高,但同时微服务的数量也会增加,管理就会存在很大的问题,成为一个新的挑战,这也就是常常所被提到的“这么多的服务,该服务管理啊?”问题。

服务的拆分足够微,可以按照某种方式、规则拆分,通常可以按照业务模块、业务场景等进行拆分,尽量避免服务间的相互依赖,做到高内聚低耦合。紧密关联的处理,放在一个服务内,但避免在服务与服务之间共享数据。

2.轻量级通信

在单体架构的应用中,可直接通过简单的方法调用就能进行通信,但在微服务架构中,由于服务都是跨域进程,甚至是跨主机的,组件只能通过REST、Web服务或RPC类似的机制在网络上进行通信。

因为服务划分的已经足够小了,服务间的通信可能会比较频繁,考虑到性能、响应时间等方面,则服务间通信应采用轻量级的通信协议,如:同步的REST,异步的AMQP、STOMP、MQTT等。在实时性要求不高的场景下,采用REST通信是不错的选择,REST是基于HTTP协议,可方便进行跨域访问或跨防火墙的设置,并且消息格式可以统一为XML或JSON格式,方便开发人员阅读和理解。如果服务间通信比较频繁,有比较高的要求,可采用消息通信的方式,如:Kafka、MQ等类似的消息中间件。如果不考虑对外提供访问的话,可采用gRPC的通信方式,因为gRPC是基于Netty的,通信效率更高。

3.单一职责原则

当服务粒度过粗时,服务内部很容易产生耦合。如果多人开发同一个服务,很容易因为耦合过大造成代码修改重合,不利于后期维护。确保每个服务职责单一,这也是用来确定服务拆分边界的一个原则,遵循“高内聚、低耦合”。

必须要对自己的产品和业务的了解,才能更准确的确定服务边界,让各个服务满足单一的业务职责,避免职责交叉。

4.领域驱动原则

领域驱动设计(Domain Driven Design),是一套综合软件系统分析和设计的面向对象建模方法。一个微服务,就应该能够反映出某个业务的领域模型,使用领域驱动设计,不但可以降低微服务环境中通用语言的复杂度,而且可以帮助团队搞清楚领域的边界,理清上下文边界。

建议将每个微服务都设计成一个DDD限界上下文,为微服务提供了一个逻辑边界。每个独立的团队负责一个逻辑上定义好的系统切片,负责与一个领域或业务功能相关的全部开发,最终团队开发出的代码更加易于理解和维护。

三、微服务架构的核心话题

基于微服务架构的应用,将面临着许多选择、争议等讨论的核心话题,这些核心话题将会在你接下来的微服务架构生涯里不断出现,并成为讨论的焦点。在此,我觉得有必要进行汇总整理,让你觉得它存在的必要性,能为你之所用。

1.服务拆分

服务拆分首先关注的就是服务的颗粒度,可遵循设计原则——拆分足够微,通过DDD(领域驱动设计)的指导,将某个领域的功能进行聚合成为一个服务。

对于一个大型复杂的单体应用而言,选择先拆分哪个模块,是一个问题。一般考虑先从容易、简单被拆分的模块开始,在拆分简单模块过程中,不断积累微服务的经验,逐步拆分掉复杂、繁重业务的核心模块。同时,寻找那些和其他功能业务重合度低、耦合度低,且自身变化较为缓慢的基础服务,将它们拆分为微服务。

决定了拆分哪些模块,要拆分成多个微服务后,接下来就要划清服务拆分的边界,将服务边界和接口顺理清楚。确定哪些应该包含进来,哪些不应该包含进来,哪些接口需要重新设计,哪些可以重复利用。

如下图所示,展示了一个单体应用拆分为多个微服务的过程。一旦拆分完后,各个服务就可以独立开发、部署和扩展。

服务的拆分,不单单指功能的拆分,如上图所示,还得考虑数据库的拆分 ,确保降低功能逻辑层、数据访问层的耦合度。

2.服务注册与发现

微服务架构的特点是服务的数量众多,这些众多的服务需要一个统一的服务注册平台来进行服务的管理。每个微服务实例在启动后,将自己的实例信息注册到服务注册表或服务注册中心。服务的调用方若想获取可用服务实例的列表,则需要从服务注册表中去获取相关的信息。

当服务实例失效或down掉以后,服务实例的信息就要从服务注册表中移除,即:服务注销。服务注册表是用于维护所有可用的服务实例的地方,服务注册表一方面要接收微服务实例的接入,另一方面当服务实例不可用时,需要及时将服务实例从注册表中清楚。下图展示了服务注册与服务实例的关系。

服务注册与发现组件或框架,有很多,如:Eureka、Consul、etcd等,都提供了服务注册表的功能,可供大家进行选择。

3.负载均衡

在微服务架构中,负载均衡是必须使用的技术,通过它来实现系统的高可用、集群扩容等功能。负载均衡通常分为两种:服务端负载均衡和客户端负载均衡。通常所说的负载均衡均指服务器端的负载均衡,可通过软件或硬件设备来实现,软件如:Nginx、LVS等,硬件如:F5、A10等,硬件负载均衡设备成本较高,大部分采用的是软件方式。架构图如下:

通过软件或硬件实现负载均衡都会维护一个服务端清单,利用心跳检测等手段进行清单维护,保证清单中都是可以正常访问的服务节点。当用户发送请求时,会先到达负载均衡器(一般作为一个服务),负载均衡器根据负载均衡算法(轮训、随机、加权轮训)从可用的服务端列表中取出一台服务端的地址,接着进行转发,降低系统的压力。

4.API网关

考虑到微服务架构中服务的数量很多,为了便于服务对外统一的管理,API网关的引入是必不可少的。API网关旨在提供统一的API入口点,来管理多个服务内部API,可方便实现对平台众多服务接口进行管控,如对访问服务的身份认证、业务鉴权、流量并发控制、API调用的计量或计费等。

API网关常用于以下场景:

  • 黑白名单:实现例如通过IP地址来禁止访问某些服务的某些功能。

  • 日志:实现日志访问的记录,用于分析访问、处理性能指标,并将分析结果提供给其他模块使用,如:运维平台的统计功能。

  • 协议适配:实现通信协议校验、适配转换的功能。

  • 身份认证:负责外部系统的访问身份认证。

  • 计流限流:实现微服务访问流量计算,基于流量计算分析进行限流等。

  • 路由:API网关的核心功能,实现请求的转发。

API网关的引入为微服务架构应用带来诸多的好处,如下:

  • 避免将内部信息/接口泄露给外部: 能够将对外发布的API与微服务内部的API区分开来,使得各个微服务在添加或变更时,能有明确的安全边界,避免多过的对外暴露。

  • 为微服务添加额外的安全层:能够提供一套额外的保护层,用以应对SQL注入、Dos攻击等,其中系统的权限控制可以再这一层来实施。

  • 支持多种混合通信协议:考虑到微服务架构中,各个微服务的平台与语言的多样性,通常将对外提供基于HTTP或REST的API接口,而内部微服务将根据自身服务情况采用不同的通信协议(如:ProtoBuf、RPC等)。API网关则跨域这些内部不同协议的微服务,提供一个基于REST的统一外部API。

  • 减低构建微服务的复杂性:基于微服务架构应用的复杂性,如API令牌、访问控制、限速限流等,每一项功能的添加,对会额外对各个服务带来影响,从而影响微服务的开发周期。这些功能如果在API网关上统一处理,则会从代码层面进行了有效的隔离,使得不会影响其他微服务,这样更有利于其他微服务只需关注于实际的业务开发。

常见的API网关实现方式很多,如:Nginx、Kong、Spring Cloud Zuul、Trfk等。

5.服务部署与发布

单体应用被拆分为微服务后,随着微服务的数量增多,部署就成了问题,使得部署的复杂性提高了不少。所以,微服务的部署更加倾向于使用具有相互之间隔离的主机/虚拟机来实现服务的部署,使得服务能够独立的部署、测试、发布、升级。

目前比较好的服务部署方式就是把各个微服务打包成Docker镜像,这样就保障避免了不同主机环境对部署产生的影响。使用Docker部署,并结合Jenkins进行CI/CD,使得构建、发布、启动变得更加快捷。

下图就是服务部署、发布流程。

四、总结

一个微服务架构的应用,从最初的设计到逐步成型,是需要经过不断的迭代开发、摸索来完善的,上述只是列举出了我个人认为需要重点关注的点,以供大家参考,如有遗漏不足,望大家建议补充、完善。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/284129.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Golang GOPATH 包

2019独角兽企业重金招聘Python工程师标准>>> Golang GOPATH & 包的定义 & 包的导入 GOPATH 设置 go 命令依赖一个重要的环境变量:$GOPATH 可以在 .zshrc 配置文件中加上一行这样的配置, export GOPATH/Users/flyme/mygo Go从1.1版本到…

PPK大疆无人机应用教程

文章目录 一、新建项目二、导入数据三、解算过程四、结果导出一、新建项目 新建工程,设置项目名称,保存位置,控制等级,坐标系统(坐标系统选择高斯克吕格,中央子午线根据实际数据所在位置进行选择) 二、导入数据 选择大疆数据,找到对应的文件夹 数据有:图片,EVENT.b…

Eclipse Add generated serial version ID报错解决方案

为什么80%的码农都做不了架构师?>>> 问题: The following problem occurred:Could not find class file.Make sure the file is compilable 解决方案: 1、右键项目 -> Java Build Path -> Source 在Sourcd folders on bui…

C# WPF设备监控软件(经典)-上篇

01—前言应老东家也是老同学的需求,开发了此设备监控软件。主要是为了应对测试设备长时间不上传测试数据未能及时发现的问题,测试数据一般在每台设备都有个固定的临时存放目录,测试数据不更新时,此文件夹便不再更新。需求相对比较…

[转]微服务的4个设计原则和19个解决方案

目录 一、微服务架构演进过程 二、微服务架构的好处 三、微服务应用4个设计原则 1.AKF拆分原则 2.前后端分离 3.无状态服务 4.Restful通信风格 四、微服务架构带来的问题 五、微服务平台的19个落地实践 1.企业IT建设的三大基础环境 2.微服务应用平台总体架构 3.微服…

【GlobalMapper精品教程】033:影像地图羽化方式详解

在Globalmapper中,可以很方便的对影响进行多种羽化值设置。 文章目录 1. 不要羽化此图层2. 沿一个或多个边缘羽化3. 羽化到有效数据的多边形覆盖4. 在当前选定的多边形内羽化5. 裁剪到选定的边界,而不是羽化6. 在多边形外部羽化,而不是内部加载配套案例数据包中的data033.ra…

基于WPF重复造轮子,写一款数据库文档管理工具(一)

项目背景公司业务历史悠久且复杂,数据库的表更是多而繁杂,每次基于老业务做功能开发都需要去翻以前的表和业务代码。需要理解旧的表的用途以及包含的字段的含义,表少还好说,但是表一多这就很浪费时间,而且留下来的文档…

[转]GitBook使用教程收藏

GitBook使用教程 最简单的方式就是使用GitBook编辑器,没有什么难度,后面的教程主要针对命令行的方式 PS:GitBook的book页面默认没有download按钮的 需要到设置中打开,打开后再次publish生效 同步GitHub 更新失败,无法…

二 面向对象三大特性

一 继承与派生 一、继承定义 二、继承与抽象的关系 三、继承与重用性 四、派生 五、组合与重用性 六、接口与归一化设计 七、抽象类 八、继承实现的原理 九、子类中调用父类的方法 二 多态与多态性 一、多态 二、多态性 三 封装 一、封装定义 二、特性(property) 三、封装与扩展…

CSS3新属性

边框: border-radius 用于创建圆角 div { border:2px solid; border-radius:25px; -moz-border-radius:25px; /* Old Firefox */ } box-shadow 用于向方框添加阴影 div { box-shadow: 10px 10px 5px #888888; } border-image 使用图片来创建边框 div { border-image…

Android实用笔记——使用Spinner实现下拉列表

2019独角兽企业重金招聘Python工程师标准>>> 1、编辑activity_main.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"mat…

基于.NET 6 的开源访客管理系统

简单介绍一下系统功能系统用于简化访客登记、查询、保存。传统的登记方式&#xff0c;不仅浪费纸张&#xff0c;而且还面临保存的问题&#xff0c;查阅不方便。该系统为了在疫情期间能很好管理访客登记做好风险管控,同时可以整合智能设备做到自动确认并跟踪访客的行动轨迹,该项…

完整的产品管理工作流程

产品经理的工作具体会落实到工作流程中&#xff0c;所以工作流程很大程度上会体现工作层次。很多白领产品经理&#xff0c;多年来在一个低层次的流程中转圈——理需求、画原型、写文档、管项目、验收上线&#xff0c;一个版本上线之后立刻对下一个版本理需求、画原型、写文档、…

java爬虫-简单爬取网页图片

刚刚接触到“爬虫”这个词的时候是在大一&#xff0c;那时候什么都不明白&#xff0c;但知道了百度、谷歌他们的搜索引擎就是个爬虫。 现在大二。再次燃起对爬虫的热爱&#xff0c;查阅资料&#xff0c;知道常用java、python语言编程&#xff0c;这次我选择了java。在网上查找的…

Windows Server 2016-图形化迁移FSMO角色

上章节我们简单介绍了三种不同方式查看FSMO主机角色信息&#xff0c;在开篇之前我们简单回顾一下FSMO五种操作主机角色&#xff1a;林范围操作主机角色有两种&#xff0c;分别是 架构主机角色&#xff08;Schema Master&#xff09;和 域命名主机角色&#xff08;Domain Naming…

[转]互联网最大谣言:程序员35岁必淘汰?今天我就来击碎他

朋友&#xff0c;只要你是程序员&#xff0c;你一定知道996和“程序员35岁必死”的言论。 这两个话题在互联网上的讨论一次比一次激烈。 996工作制&#xff0c;众所周知&#xff0c;每天早上9点到岗&#xff0c;一直待到晚上9点&#xff0c;每周工作6天&#xff0c;很多互联网公…

【ArcGIS微课1000例】0057:将多波段栅格(影像.tif)背景设置为无数据nodata的方法

本文讲解将多波段栅格(影像.tif)背景设置为无数据nodata的方法。 文章目录 一、背景值识别二、背景值去除【推荐阅读】: 【ArcGIS微课1000例】0056:将单波段栅格背景设置为无数据NoData的方法 一、背景值识别 可以用【识别】工具来获取影像数据的背景值。 在背景上单击,…

华为HCIA认证H12-811题库新增

801、[单选题]178/832、在系统视图下键入什么命令可以切换到用户视图? A quit B souter C system-view D user-view 试题答案&#xff1a;A 试题解析&#xff1a;在系统视图下键入quit命令退出到用户视图。因此答案选A。 802、[单选题]“网络管理员在三层交换机上创建了V…

经典Java微服务架构教程 微服务从开发到部署

图书目录脑图&#xff1a; 本书根据开源项目整理&#xff0c;由于原在线文档无法正常使用&#xff0c;本人重新在Github上重新布署了一套在线文档。 书中讲解非常详细&#xff0c;并且有在线的视频教程&#xff0c;另有在线文档和在线的源码。 书中的代码由于PDF排版问题可能显…

linux下redis安装

转自&#xff1a;http://blog.java1234.com/blog/articles/311.html Redis从一开始就只支持Linux&#xff0c;后面虽然有团队搞出Window版本&#xff0c;但是我还是建议大伙安装到Linux中。 准备工作 &#xff08;wm VirtualBox&#xff09; VMware 以及Xshell https://redis…