什么是微服务架构,有何优缺点?

2023-11-05

什么是微服务架构?

通常而言,微服务架构是一种架构模式或者说是一种架构风格。它提倡将单一应用程序划分成一组小的服务,每个服务运行独立的自己的进程中,服务之间互相协调、互相配合,为用户提供最终价值。服务之间采用轻量级的通信机制互相沟通(通常是基于HTTP的RESTful API)。每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境、类生产环境等。

微服务架构和单体架构的区别

单体架构

通俗地讲,“单体应用(monolith application)”就是将应用程序的所有功能都打包成一个独立的单元,可以是JAR、EXE、BIN或其它归档格式。

单体应用有如下优点:

开发简单直接,集中式管理, 基本不会重复开发;

功能都在本地,没有分布式的管理开销和调用开销;

它的缺点也非常明显,特别对于互联网公司来说:

开发效率低---所有的开发在一个项目改代码,递交代码相互等待,代码冲突不断;

代码维护难---代码功能耦合在一起,新人不知道何从下手;

部署不灵活---构建时间长,任何小修改必须重新构建整个项目,这个过程往往很长;

稳定性不高---一个微不足道的小问题,可以导致整个应用挂掉;

扩展性不够---无法满足高并发情况下的业务需求。

微服务架构

随着业务需求的快速发展变化,敏捷性、灵活性和可扩展性需求不断增长,迫切需要一种更加快速高效的软件交付方式。微服务就是一种可以满足这种需求的软件架构风格。单体应用被分解成多个更小的服务,每个服务有自己的归档文件,单独部署,然后共同组成一个应用程序。这里的“微”不是针对代码行数而言,而是说服务的范围限定到单个功能。

微服务有如下优点:

微服务是松藕合的,无论是在开发阶段或部署阶段都是独立的。

能够快速响应, 局部修改容易, 一个服务出现问题不会影响整个应用。

易于和第三方应用系统集成, 支持使用不同的语言开发, 允许你利用融合最新技术。

每个微服务都很小,足够内聚,足够小,代码容易理解。团队能够更关注自己的工作成果, 聚焦指定的业务功能或业务需求。

开发简单、开发效率提高,一个服务可能就是专一的只干一件事, 能够被小团队单独开发,这个小团队可以是 2 到 5 人的开发人员组成。

同样的, 也存在如下缺点:

微服务架构带来过多的运维操作,可能需要团队具备一定的DevOps技巧。

分布式系统可能复杂难以管理。因为分布部署跟踪问题难,当服务数量增加,管理复杂性增加。

微服务架构的主要特点

微服务架构是一种松耦合的、有一定的有界上下文的面向服务架构。

也就是说,如果遇到一个功能变更, 但其要求每个服务都要同时修改,那么它们就不能称之为微服务,因为它们紧耦合在一起;如果你需要掌握一个服务的上下文场景使用条件,那么它就是一个有上下文边界的服务,这个定义一般来自DDD(领域驱动设计)。

它的主要特点是组件化、松耦合、自治、去中心化,体现在以下几个方面:

细粒度的服务分解,服务粒度要小,而每个服务是针对一个单一职责的业务能力的封装,专注做好一件事情。

独立部署运行和扩展,每个服务能够独立被部署并运行在一个进程内。这种运行和部署方式能够赋予系统灵活的代码组织方式和发布节奏,使得快速交付和应对变化成为可能。

独立开发和演化,技术选型灵活,不受遗留系统技术约束。合适的业务问题选择合适的技术可以独立演化。服务与服务之间采取与语言无关的API进行集成。相对单体架构,微服务架构是更面向业务创新的一种架构模式。

独立团队和自治,团队对服务的整个生命周期负责,工作在独立的上下文中,自己决策自己治理,而不需要统一的指挥中心。团队和团队之间通过松散的社区部落进行衔接。

通过解耦我们所做的事情,分而治之以减少不必要的损耗,使得整个复杂的系统和组织能够快速的应对变化。

需要考虑的问题

单个微服务代码量小,易修改和维护。但是,系统复杂度的总量是不变的,每个服务代码少了,但服务的个数肯定就多了。就跟拼图游戏一样,切的越碎,越难拼出整幅图。

一个系统被拆分成零碎的微服务,最后要集成为一个完整的系统,其复杂度肯定比大块的功能集成要高很多。单个微服务数据独立,可独立部署和运行。虽然微服务本身是可以独立部署和运行的,但仍然避免不了业务上的你来我往,这就涉及到要对外通信,当微服务的数量达到一定量级的时候,如何提供一个高效的集群通信机制成为一个问题。

单个微服务拥有自己的进程,进程本身就可以动态的启停,为无缝升级打好了基础,但谁来启动和停止进程,什么时机,选择在哪台设备上做这件事情才是无缝升级的关键。这个能力并不是微服务本身提供的,而是需要背后强大的版本管理和部署能力。

多个相同的微服务可以做负载均衡,提高性能和可靠性。正是因为相同微服务可以有多个不同实例,让服务按需动态伸缩成为可能,在高峰期可以启动更多的相同的微服务实例为更多用户服务,以此提高响应速度。同时这种机制也提供了高可靠性,在某个微服务故障后,其他相同的微服务可以接替其工作,对外表现为某个设备故障后业务不中断。

同样的道理,微服务本身是不会去关心系统负载的,那么什么时候应该启动更多的微服务,多个微服务的流量应该如何调度和分发,这背后也有一套复杂的负载监控和均衡的系统在起作用。微服务可以独立部署和对外提供服务,微服务的业务上线和下线是动态的,当一个新的微服务上线时,用户是如何访问到这种新的服务?这就需要有一个统一的入口,新的服务可以动态的注册到这个入口上,用户每次访问时可以从这个入口拿到系统所有服务的访问地址。这个统一的系统入口并不是微服务本身的一部分,所以这种能力需要系统单独提供。还有一些企业级关注的系统问题,比如,安全策略如何集中管理?系统故障如何快速审计和跟踪到具体服务?整个系统状态如何监控?服务之间的依赖关系如何管理?等等这些问题都不是单个微服务考虑的范畴,而需要有一个系统性的考虑和设计,让每个微服务都能够按照系统性的要求和约束提供对应的安全性,可靠性,可维护性的能力。

选择微服务框架的关注点

服务注册、发现、负载均衡和健康检查,假定采用进程内LB方案,那么服务自注册一般统一做在服务器端框架中,健康检查逻辑由具体业务服务定制,框架层提供调用健康检查逻辑的机制,服务发现和负载均衡则集成在服务客户端框架中。

监控日志,框架一方面要记录重要的框架层日志、Metrics和调用链数据,还要将日志、Metrics等接口暴露出来,让业务层能根据需要记录业务日志数据。在运行环境中,所有日志数据一般集中落地到企业后台日志系统,做进一步分析和处理。REST/RPC和序列化,框架层要支持将业务逻辑以HTTP/REST或者RPC方式暴露出来,HTTP/REST是当前主流API暴露方式,在性能要求高的场合则可采用Binary/RPC方式。针对当前多样化的设备类型(浏览器、普通PC、无线设备等),框架层要支持可定制的序列化机制,例如,对浏览器,框架支持输出Ajax友好的JSON消息格式,而对内部服务及应用程序,框架支持输出性能高的Binary消息格式。

配置,除了支持普通配置文件方式的配置,框架层还可集成动态运行时配置,能够在运行时针对不同环境动态调整服务的参数和配置。限流和容错,框架集成限流容错组件,能够在运行时自动限流和容错,保护服务,如果进一步和动态配置相结合,还可以实现动态限流和熔断。管理接口,框架集成管理接口,一方面可以在线查看框架和服务内部状态,同时还可以动态调整内部状态,对调试、监控和管理能提供快速反馈。Spring Boot微框架的Actuator模块就是一个强大的管理接口。统一错误处理,对于框架层和服务的内部异常,如果框架层能够统一处理并记录日志,对服务监控和快速问题定位有很大帮助。安全,安全和访问控制逻辑可以在框架层统一进行封装,可做成插件形式,具体业务服务根据需要加载相关安全插件。文档自动生成,文档的书写和同步一直是一个痛点,框架层如果能支持文档的自动生成和同步,会给使用API的开发和测试人员带来极大便利。Swagger是一种流行Restful API的文档方案。

一个完整的微服务系统,它最少要包含以下功能:

日志和审计,主要是日志的汇总,分类和查询

监控和告警,主要是监控每个服务的状态,必要时产生告警

消息总线,轻量级的MQ或HTTP

注册发现

负载均衡

部署和升级

事件调度机制

以下功能不是最小集的一部分,但也应该在选择时进行考虑:

认证和鉴权

多语言支持,是否支持多种编程语言

统一服务构建和打包

统一服务测试

统一配置文件管理

服务依赖关系管理

问题跟踪调试框架

灰度发布

蓝绿部署

资源管理,如:底层的容器, 虚拟机, 物理机和网络管理

开发方式影响

随着持续交付概念推广以及容器概念的普及,微服务将这两种理念和技术结合起来,形成新的微服务+API+容器平台的开发模式,提出了容器化微服务的持续交付概念。

下图为传统单体应用的DevOps开发队伍方式:

这种整体型架构要求产品队伍横跨产品管理 Dev开发 QA DBA 以及系统运营管理,而微服务架构引入以后,如下图:

微服务促进了 DevOps 方式的重组,将一个大臃肿的整体产品开发队伍切分为根据不同微服务的划分的产品队伍,以及一个大的整体的平台队伍负责运营管理,两者之间通过 API 交互,做到了松耦合隔绝。

微服务的实施是有一定的先决条件:基础的运维能力(如监控、快速配置、快速部署)需提前构建,否则就会陷入较被动的局面。推荐采用CI/CI改进基础设施及运维的实践,通过自动化运维使得可以快速安全的响应和处理微服务对服务部署的要求,通过容器技术保证服务环境之间拥有更高的一致性,降低“在我的环境工作,而你的环境不工作”的可能,也是为后续的发布策略和运维提供更好的支撑。

想要更好的实施微服务,首先需要考虑构建团队DevOps能力,这是保证微服务架构在持续交付和应对复杂运维问题的动力之源。其次保持服务持续演进,使之能够快速、低成本地被拆分和合并,以快速响应业务的变化;同时要保持团队和架构对齐。微服务看似是技术层面的变革,但它对团队结构和组织文化有很强的要求和影响。识别和构建匹配架构的团队是解决问题的另一大支柱。

最后,打造持续改进的组织文化是实施微服务的关键基石。只有持续改进,持续学习和反馈,持续打造这样一个文化氛围和团队,微服务架构才能持续发展下去,保持新鲜的生命力,从而实现我们的初衷。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是微服务架构,有何优缺点? 的相关文章

随机推荐

  • Spring中IOC容器

    IOC入门案例思路分析 1 管理什么 Service和Dao 2 如何将管理的对象存放到IOC容器 配置applicationContext xml 第二步 3 将管理的对象存放到IOC容器 如何获取IOC容器 第三步 4 获取到IOC容器
  • Dos环境变量修改

    批处理修改环境变量 修改用户变量 系统变量 全局变量 永久 临时设置环境变量 设置Java环境变量 关于路径问题 在执行批处理命令时 需要用到路径变量 这里先说明路径相关的变量参数 echo 当前盘符 d0 echo 当前盘符和路径 dp0
  • 6.830 / 6.814: Syllabus 2021 - MIT Lab 2 - SimpleDB Operators

    文章目录 1 参考链接 2 SimpleDB Architecture and Implementation Guide 2 1Filter and Join 2 2 Aggregates 2 3HeapFile Mutability 2
  • 在你的 Android 手机上运行 Golang 程序

    在我们日常开发中 运行一个服务 都是在 shell 或 cmd 下执行命令 像是使用 go run main go 直接编译运行 或是 go build 编译生成可执行文件后 以 xxx 方式运行 Go 支持交叉编译生成各平台的可执行文件
  • Linux中makefile

    第一个版本的makefile Makefile的依赖是从上至下的 换句话说就是目标文件是第一句里的目标 如果不满足执行依赖 就会继续向下执行 如果满足了生成目标的依赖 就不会再继续向下执行了 Make会自动寻找依赖条件所用到的文件 其中 我
  • 2018-12-22-jekyll-theme-H2O

    layout post title jekyll主题theme H2O categories jekyll GitHub tags jekyll GitHub theme H2O jekyll theme H2O 基于Jekyll的博客主题
  • Django基础入门⑩:Django查询数据库操作详讲

    Django基础入门 Django查询数据库操作详讲 Django查询数据库操作 基础操作 查询数据 比较运算符 逻辑符号 去重查询 分组集合 排序查询 分页操作 模糊查询 多表查询 执行原生 SQL 个人简介 以山河作礼 Python领域
  • 【数据结构】数组

    1 计算一维数组存储地址 a i 公式 a i L a 起始地址 i 当前i个元素下标 L 每个元素所占字节 例 int a 10 已知a 1000 sizeof int 4 求a 3 地址 1000 3 4 1012 2 计算二维数组存储
  • SQL注入之时间盲注 和 报错注入(sql-lab第一关为例)

    什么是时间盲注 时间盲注指通过页面执行的时间来判断数据内容的注入方式 通常用于数据 包含逻辑型 不能返回到页面中的场景 无法利用页面回显判断数据内容 只能通过执行的时间来获取数据 时间盲注的过程 1 找到注入点 并选择合适的注入语句 2 爆
  • hexo搭建博客-butterfly主题详细版

    Hexo搭建博客 butterfly主题 前置知识 对于Github和Gitee的基本了解与使用 最关键的是你要知道github为什么访问的这么慢 如何魔法上网访问github 或者说不用魔法如何访问github 本文在可能遇到的问题说明了
  • c语言用串口读温度值,温度传感器与串口

    1 题目要求 有时候我们需要知道在一段时间里温度传感器测量的温度的历史数据 之前的温度传感器例程只是在液晶屏上实时显示出数据而已 并不能查看它的历史数据 所以我们运用之前所有学过的知识来完成这个任务 首先我们先从简单的理念入手 利用串口每隔
  • 数学推导+纯Python实现机器学习算法12:贝叶斯网络

    Python机器学习算法实现 Author louwill 在上一讲中 我们讲到了经典的朴素贝叶斯算法 朴素贝叶斯的一大特点
  • 计算机图形技术在游戏领域应用,计算机图形图像技术在美术领域中的应用

    摘 要 现如今科学技术日益发展的时代 图像的发展已经不能够满足人类的需求 它不只是表現人们视野中的影像 通过各个领域的先进的专业的软件和技术 能够更加成功的表现出来 计算机图形图像技术已经不断的实践在各个领域 下文是对其主要应用的分析研究
  • java iterable 使用_Iterable(迭代器)的用法

    一 前言 在开发中 经常使用的还是for each循环来遍历来Collection 不经常使用Iterable 迭代器 的 下面记录一下terable是一般用法 二 说明 迭代器是一种设计模式 它是一个对象 它可以遍历并选择序列中的对象 而
  • U盘提示格式化怎么办?3个方法轻松解决!

    我的u盘已经很久没用了 今天刚把u盘插入电脑就显示需要进行格式化 但是我还有很多重要的文件都保存在里面呢 这可怎么办呀 有什么方法恢复里面的数据吗 u盘是我们日常生活中常用的移动存储设备之一 但有时可能会遇到一个让人烦恼的问题 那就是当插入
  • TypeScript基础小课堂二

    上期简单的介绍了一下TS的安装和运行环境 现在正式进入知识点阶段 1 TS类型注解 TypeScript 是 JS 的超集 TS 提供了 JS 的所有功能 并且额外的增加了 类型系统 TS中定义变量 常量 可以指定类型 A类型的变量不能保存
  • Mysql Too many connections

    程序启动过程中 连接mysql异常 信息如下 Caused by com mysql cj exceptions CJException Data source rejected establishment of connection me
  • Android 开发简易失物招领二手交易平台

    一 开发环境 1 android studio 客户端 eclipes 服务端 2 java语言 二 效果展示 视频地址 https www bilibili com video BV1Ng4y1v7XC 三 客户端开发 1 首先设置mai
  • 交换机与路由器技术-37-端口安全

    目录 一 端口安全 1 1 课程引入 1 2 基本概念 1 3 作用 1 4交换机端口安全配置 1 4 1 配置最大活跃地址数量 1 4 2 配置静态MAC地址和接口绑定 1 4 3配置接口老化时间 1 4 4 配置MAC地址违规后的操作
  • 什么是微服务架构,有何优缺点?

    什么是微服务架构 通常而言 微服务架构是一种架构模式或者说是一种架构风格 它提倡将单一应用程序划分成一组小的服务 每个服务运行独立的自己的进程中 服务之间互相协调 互相配合 为用户提供最终价值 服务之间采用轻量级的通信机制互相沟通 通常是基