架构之:微服务架构漫谈(微服务架构是啥)
ccwgpt 2025-06-15 14:52 4 浏览 0 评论
简介
微服务的架构出现已经很久很久了,微服务架构就是一种将单个应用程序转换为一组小服务的方法,每个小服务都在自己的进程中运行,并使用轻量级的交互方式(如HTTP)进行通信。
服务的划分是根据具体的业务来的,并且可以通过完全自动化的部署机制独立部署。虽然大家都在谈论微服务,但是什么时候应该使用微服务,使用微服务需要注意哪些问题对于很多人来说仍然是一个模糊的概念。本文将会和大家一起探讨一下微服务相关的一些问题。
微服务和单体服务
在最开始的程序体系中,通常都是单体服务。对于单体服务来说,所有的服务都在一个进程中。企业应用程序通常由三个主要部分构建: 客户端用户界面(由 HTML 页面和在用户机器上的浏览器中运行的 javascript 组成),数据库(由插入到公共的、通常是关系的数据库管理中的许多表组成系统)和服务器端应用程序。
服务器端应用程序将处理 HTTP 请求、执行域逻辑、从数据库检索和更新数据,以及选择和填充要发送到浏览器的 HTML 视图。这个服务器端应用程序是一个整体,也就是一个单独的进程。对系统的任何更改都需要重新构建和部署服务器端应用程序的最新版本。
对于单体服务来说,所有的处理请求逻辑都在单个进程中运行,为了结构化和代码编写规范,通常会使用编程语言的基本功能将应用程序划分为类、函数和命名空间等。
虽然单体服务也可以通过负载均衡器后面运行多个实例来水平扩展应用,但是随着服务器端业务越来越复杂,对于服务的每一次很小的变动都会导致对于整体服务的重新构建和部署。并且随着时间的推移,通常很难保持良好的模块化结构,和对现有架构进行扩展。同时因为单体服务在一个进程中运行,如果该进程出现运行时问题,会导致所有的服务不可用,稳定性不够。
俗话说得好,鸡蛋不能放在一个篮子里面。
于是把巨大的单体服务拆分成为一个个的微服务就是现在系统架构的热潮。
微服务架构就是将单体的应用程序拆分为一个个的服务,这些服务可以独立部署和扩展,并且服务之间有牢固的模块边界,服务之间主要通过HTTP协议进行交互。因为服务之间是无内部耦合的,所以我们可以甚至使用不同的编程语言来实现不同的服务。提高了程序的灵活性。
微服务的特征
微服务有些什么特征呢?什么样的服务才能被称为是微服务呢?
社会很复杂,单纯的是人。实际工程上的问题,不会向书本上学到的知识那样,有一个明确定义。事实上,出了学校之后,这个世界上的事情已经不是非黑即白了。
比如,我们上学时候学到的圆的定义,它清晰的告诉我们,什么是圆。而对于微服务来说,则并没有这样的定义。
因为微服务是在不断的实践中总结摸索出来的一种架构。虽然不同的人对微服务有不同的理解,但是他们应该都具有下面几个共同的特征。
组件服务化
自从软件变得复杂之后,为了更好的进行软件开发和后续的扩展,软件逐渐开始组件化。所谓组件就是一个个的可以独立替换和升级的部件。
现代程序中有很多可以称之为组件的东西,比如java中的依赖jar包,python中的依赖包等。
这些lib可以在运行时链接到程序中,以内存中的函数进行运行。
有了链接的lib,为什么我们还需要将这些组件服务化,以单独的进程来运行呢?
使用服务作为组件(而不是库)的一个主要原因是服务是可独立部署的。如果您的应用程序 由单个进程中的多个库组成,则对任何单个组件的更改都会导致必须重新部署整个应用程序。
但是,如果该应用程序分解为多个服务,那么对于该服务的变更,只需要重新部署该服务即可。虽然这不是绝对的,因为有些服务的变化会导致对应的调用接口的变化,所以也需要对应的服务来进行修改和适配。但是一个好的微服务架构的目标是通过服务契约中的内聚服务边界和演化机制来最小化这些变动。
使用服务作为组件的另一个好处是更明确的组件接口。大多数语言没有定义显式发布接口的良好机制,从而导致组件之间的耦合过于紧密。通过使用显式远程调用机制,服务可以更容易的进行定义。
使用服务也有他的缺点,因为服务之间是通过远程调用的,远程调用比进程内调用更昂贵,所以服务之间的调用通常是更加粗粒度的调用,所以我们在界定服务的时候,需要划分明确的职责分配。
组织的划分
根据康威定律:组织沟通方式决定系统设计。
通常来说,对于大型的系统可以分为UI团队,服务逻辑团队和数据库团队。但是这样的组织方式就会导致一个团队的改动需要其他团队也进行改动来配合。
所以在微服务中,组织应该是安装具体的业务来划分,这样能够保证组织的灵活性。
服务之间的通信
对于单体服务而言,依赖的lib是通过内部函数的调用来实现的,它的好处就是速度快,但是如果将单体服务转换成微服务,就需要考虑到服务之间的相互调用问题。
常见的服务之间的调用方式有哪些呢?
最常见的就是HTTP/HTTPS协议之间的调用,这种方式的好处就是协议简单通用,兼容性的成本较低。
如果是跨语言的,通常会用Thrift之类的RPC远程调用协议,这种方式的好处就是会比HTTP调用要快,但是调用起来比较复杂。需要构建特定的客户端。
上面讲的是同步调用,如果是异步的话,还可以使用MQ机制,MQ的作用一是可以削峰,二是可以解耦。
去中心化治理
对于微服务来说,并不要求所有的微服务都采用同一种语言,同一种架构方式来进行。通常来说了保证系统和代码的可维护性,一般来说是要求所有的服务都使用同样的编程语言和架构。
但是对于特别的部分,比如对性能要求特别高这样的需求,那么可以尝试考虑一个不同的编程语言。
总的来说,就是每个微服务的团队对他们自己的服务负责,只需要保证对外的服务和接口的正确性即可。
去中心化数据管理
对于单体应用来说, 所有的数据都放在一个数据库中。如果对微服务进行了去中心化管理,那么相应的数据库属于各个微服务组,所以在理论上微服务的数据也应该是去中心化部署的。
但是这样多个数据库照成的后果就是各个数据库中数据的一致性。在单体应用中,这个问题可以通过数据库事务来解决。但是对于微服务来说,分布式事务是不可行的,或者说代价太大。一般来说对于微服务来说,我们需要保证数据的最终一致性。
通过补偿机制来进行数据的校验和修复。
自动化部署
自动化部署的目标就是持续交付,对于微服务来说,多个服务的自动化是必不可少的。通过自动化编译,自动化测试,自动化集成和自动化部署,可以大大的减轻开发团队和运维团队的任务。提升开发效率。
对异常的响应
使用服务作为组件的结果是,应用程序需要设计成可以容忍服务失败。 任何服务调用都可能因网络或者其他的原因导致不可用而失败,所以必须尽可能优雅地对此做出响应。
于单体服务相比,这需要引入额外的复杂性来处理它,所以可以看做是微服务的一个缺点。开发团队需要尽量多做异常测试,以保证在极端的环境中程序的正确性。
由于服务随时可能出现故障,因此能够快速检测故障并在可能的情况下自动恢复服务非常重要。微服务应用程序非常重视应用程序的实时监控,检查架构元素(数据库每秒收到多少请求)和业务相关指标(例如每分钟收到多少订单)。语义监控可以提供错误的早期预警系统,让开发团队跟进和调查。 监控对于快速发现不良的紧急行为并加以修复至关重要。
我们希望看到针对每个单独服务的复杂监控和日志记录设置,例如显示启动/关闭状态的仪表板以及各种运营和业务相关指标,还包括有关断路器状态、当前吞吐量和延迟的详细信息等。
总结
讲了这么多微服务的特征,微服务虽然有他的灵活性的优点,但是如何划分微服务的边界,和对微服务的监控是一个很复杂的问题,所以到底要不要使用微服务还留给读者自己思考。
最后,问大家一个问题,在现实的项目中,有很多人希望把现有的单体服务拆分成为微服务,但是各个微服务还是共享着同一个数据库,也就是说这些微服务之间还存在着数据交叉。那么这种微服务算不算是真正的微服务呢?
本文已收录于
http://www.flydean.com/09-microservices-guide/最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!
欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!
相关推荐
- 十分钟让你学会LNMP架构负载均衡(impala负载均衡)
-
业务架构、应用架构、数据架构和技术架构一、几个基本概念1、pv值pv值(pageviews):页面的浏览量概念:一个网站的所有页面,在一天内,被浏览的总次数。(大型网站通常是上千万的级别)2、u...
- AGV仓储机器人调度系统架构(agv物流机器人)
-
系统架构层次划分采用分层模块化设计,分为以下五层:1.1用户接口层功能:提供人机交互界面(Web/桌面端),支持任务下发、实时监控、数据可视化和报警管理。模块:任务管理面板:接收订单(如拣货、...
- 远程热部署在美团的落地实践(远程热点是什么意思)
-
Sonic是美团内部研发设计的一款用于热部署的IDEA插件,本文其实现原理及落地的一些技术细节。在阅读本文之前,建议大家先熟悉一下Spring源码、SpringMVC源码、SpringBoot...
- springboot搭建xxl-job(分布式任务调度系统)
-
一、部署xxl-job服务端下载xxl-job源码:https://gitee.com/xuxueli0323/xxl-job二、导入项目、创建xxl_job数据库、修改配置文件为自己的数据库三、启动...
- 大模型:使用vLLM和Ray分布式部署推理应用
-
一、vLLM:面向大模型的高效推理框架1.核心特点专为推理优化:专注于大模型(如GPT-3、LLaMA)的高吞吐量、低延迟推理。关键技术:PagedAttention:类似操作系统内存分页管理,将K...
- 国产开源之光【分布式工作流调度系统】:DolphinScheduler
-
DolphinScheduler是一个开源的分布式工作流调度系统,旨在帮助用户以可靠、高效和可扩展的方式管理和调度大规模的数据处理工作流。它支持以图形化方式定义和管理工作流,提供了丰富的调度功能和监控...
- 简单可靠高效的分布式任务队列系统
-
#记录我的2024#大家好,又见面了,我是GitHub精选君!背景介绍在系统访问量逐渐增大,高并发、分布式系统成为了企业技术架构升级的必由之路。在这样的背景下,异步任务队列扮演着至关重要的角色,...
- 虚拟服务器之间如何分布式运行?(虚拟服务器部署)
-
在云计算和虚拟化技术快速发展的今天,传统“单机单任务”的服务器架构早已难以满足现代业务对高并发、高可用、弹性伸缩和容错容灾的严苛要求。分布式系统应运而生,并成为支撑各类互联网平台、企业信息系统和A...
- 一文掌握 XXL-Job 的 6 大核心组件
-
XXL-Job是一个分布式任务调度平台,其核心组件主要包括以下部分,各组件相互协作实现高效的任务调度与管理:1.调度注册中心(RegistryCenter)作用:负责管理调度器(Schedule...
- 京东大佬问我,SpringBoot中如何做延迟队列?单机与分布式如何做?
-
京东大佬问我,SpringBoot中如何做延迟队列?单机如何做?分布式如何做呢?并给出案例与代码分析。嗯,用户问的是在SpringBoot中如何实现延迟队列,单机和分布式环境下分别怎么做。这个问题其实...
- 企业级项目组件选型(一)分布式任务调度平台
-
官网地址:https://www.xuxueli.com/xxl-job/能力介绍架构图安全性为提升系统安全性,调度中心和执行器进行安全性校验,双方AccessToken匹配才允许通讯;调度中心和执...
- python多进程的分布式任务调度应用场景及示例
-
多进程的分布式任务调度可以应用于以下场景:分布式爬虫:importmultiprocessingimportrequestsdefcrawl(url):response=re...
- SpringBoot整合ElasticJob实现分布式任务调度
-
介绍ElasticJob是面向互联网生态和海量任务的分布式调度解决方案,由两个相互独立的子项目ElasticJob-Lite和ElasticJob-Cloud组成。它通过弹性调度、资源管控、...
- 分布式可视化 DAG 任务调度系统 Taier 的整体流程分析
-
Taier作为袋鼠云的开源项目之一,是一个分布式可视化的DAG任务调度系统。旨在降低ETL开发成本,提高大数据平台稳定性,让大数据开发人员可以在Taier直接进行业务逻辑的开发,而不用关...
- SpringBoot任务调度:@Scheduled与TaskExecutor全面解析
-
一、任务调度基础概念1.1什么是任务调度任务调度是指按照预定的时间计划或特定条件自动执行任务的过程。在现代应用开发中,任务调度扮演着至关重要的角色,它使得开发者能够自动化处理周期性任务、定时任务和异...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- MVC框架 (46)
- spring框架 (46)
- 框架图 (58)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- laravel框架 (46)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (56)
- shiro框架 (61)
- 定时任务框架 (56)
- java日志框架 (61)
- JAVA集合框架 (47)
- grpc框架 (55)
- ppt框架 (48)
- 内联框架 (52)
- winform框架 (46)
- gui框架 (44)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)
- oracle提交事务 (47)