微服务架构优缺点

简介:

随着DevOps、持续交付等理念的深入人心,微服务架构开始走进我们的视野。

那么微服务是业界期待已久的解决方案么?或者说微服务要比整体解决方案更加简单?

让我们先对微服务下个定义:

微服务是用一组小服务的方式来构建一个应用,服务独立运行在不同的进程中,服务之间通过轻量的通讯机制(如RESTful接口)来交互,并且服务可以通过自动化部署方式独立部署。正因为微服务架构中,服务之间是相互独立的,所以不同的服务可以使用不同的语言来开发,或者根据业务的需求使用不同类型的数据库。

来自ThoughtWorks的James Lewis和Martin Fowler分享了他们对微服务架构的理解以及看法。文章中作者详细介绍了微服务的特点以及相对于传统架构的微服务架构的优势。

微服务的一些优势是显而易见的:

  1. 服务简单,只关注一个业务功能 
    在James看来,传统的整体风格的架构在构建部署和扩展伸缩方面有很大的局限性,其服务端应用就像是一块铁板,笨重且不可拆分,系统中任何程序的改变都需要整个应用重新构建和部署新版本。在进行水平扩展时也只能整个系统扩展,而不能针对某一个功能模块进行扩展。 
    而微服务架构将系统以组件化的方式分解为多个服务,服务之间相对独立且松耦合,单一功能的改变只需要重新构建部署相应的服务即可。
  2. 每个微服务可由不同团队开发 
    传统的开发模式在分工时往往以技术为单位,比如UI团队、服务端团队和数据库团队,这样的分工可能会导致任何功能上的改变都需要跨团队沟通和协调。而微服务则倡导围绕服务来分工,不同的服务可以采用不同的技术来实现,一个团队中应该包含开发所需的所有技能,比如用户体验、数据库、项目管理。
  3. 微服务是松散耦合的 
    微服务架构抛弃了ESB复杂的业务规则编排、消息路由等功能,微服务架构中服务是高内聚的,每个服务都会处理相应的业务,所有的业务逻辑应该尽量在服务内部处理,且服务间的通信尽可能的轻量化,比如使用Restful的方式。
  4. 可用不同的编程语言与工具开发 
    传统的软件开发中经常会使用同一个技术平台来解决所有的问题,而经验表明使用合适的工具做合适的事情会让开发变得事半功倍。微服务架构天生就具有这样的特性,我们可以使用Node.js来开发一个简单的报表页面,使用C++来编写一个实时聊天组件。

微服务架构的引入为多样化持久保存数据提供可能,持久层可以使用传统关系数据库和NoSQL。不同于传统的应用,微服务架构中,我们可以为每个服务选择一个新的适合业务逻辑的数据库系统,比如MongoDB、PostgreSQL。这样做的好处是显而易见的,首先我们可以根据业务类型(读多还是写多等)来决定使用哪种类型的数据库,其次这样可以减小单个数据库的负载。 
James的文章在社区引起了广泛的讨论,Contino公司的CTO Benjamin Wootton撰文表示微服务并没有想象中的那么好,并建议开发者在选用此架构时一定要慎重。Benjamin认为微服务架构时可能会面临下面一些挑战:

  1. 运维开销 
    更多的服务也就意味着更多的运维,产品团队需要保证所有的相关服务都有完善的监控等基础设施,传统的架构开发者只需要保证一个应用正常运行,而现在却需要保证几十甚至上百道工序高效运转,这是一个艰巨的任务。
  2. DevOps要求 
    使用微服务架构后,开发团队需要保证一个Tomcat集群可用,保证一个数据库可用,这就意味着团队需要高品质的DevOps和自动化技术。而现在,这样的全栈式人才很少。
  3. 隐式接口 
    服务和服务之间通过接口来“联系”,当某一个服务更改接口格式时,可能涉及到此接口的所有服务都需要做调整。
  4. 重复劳动 
    在很多服务中可能都会使用到同一个功能,而这一功能点没有足够大到提供一个服务的程度,这个时候可能不同的服务团队都会单独开发这一功能,重复的业务逻辑,这违背了良好的软件工程中的很多原则。
  5. 分布式系统的复杂性 
    微服务通过REST API或消息来将不同的服务联系起来,这在之前可能只是一个简单的远程过程调用。分布式系统也就意味着开发者需要考虑网络延迟、容错、消息序列化、不可靠的网络、异步、版本控制、负载等,而面对如此多的微服务都需要分布式时,整个产品需要有一整套完整的机制来保证各个服务可以正常运转。
  6. 事务、异步、测试面临挑战 
    跨进程之间的事务、大量的异步处理、多个微服务之间的整体测试都需要有一整套的解决方案,而现在看起来,这些技术并没有成熟。

总而言之,微服务架构有很多吸引人的地方,不过在拥抱微服务之前要认清它所带来的挑战。而每一种架构都有其优缺点,我们需要根据项目业务和团队情况来选择合适的架构。


本文转自BloodyAngel博客园博客,原文链接:http://www.cnblogs.com/zgynhqf/p/5679028.html,如需转载请自行联系原作者

相关文章
|
2月前
|
人工智能 前端开发 搜索推荐
别再傻傻做视频啦!!!52.1k Star Remotion,把 React 组件变成视频生产线,强到离谱~~
Remotion 是一个用 React 程序化生成视频的开源项目,适合模板化视频、数据驱动视频、产品内嵌播放器和批量渲染场景。
365 0
|
自然语言处理 API 开发者
One API接入豆包
本文详细介绍如何将One API集成,以调用豆包模型。步骤涵盖火山引擎注册、实名认证、创建在线推理接入点及生成API Key,并在One API中配置相应渠道与模型映射关系。适用于希望利用豆包模型进行自然语言处理任务的开发者。关键词:火山引擎、在线推理、接入点、模型名称、API Key、字节跳动豆包、One API。如需进一步了解或遇到问题,欢迎留言交流。
4176 2
One API接入豆包
|
11月前
|
自然语言处理 搜索推荐 数据可视化
49_选择框架:任务类型与模型匹配
在大语言模型(LLM)应用开发的早期阶段,选择合适的模型架构和框架往往是项目成功的关键第一步。随着2025年LLM技术的快速发展,市场上可用的模型和框架数量激增,如何基于特定任务类型选择最匹配的解决方案成为开发者面临的重要挑战。本文将深入探讨任务类型与LLM模型匹配的方法论,重点介绍基于决策树的模型选择框架,并通过实际代码示例演示如何构建和应用这一框架。
739 0
|
自然语言处理 Java API
音频的文本切换
音频的文本切换
446 0
|
存储 监控 数据可视化
常见的分布式定时任务调度框架
分布式定时任务调度框架用于在分布式系统中管理和调度定时任务,确保任务按预定时间和频率执行。其核心概念包括Job(任务)、Trigger(触发器)、Executor(执行器)和Scheduler(调度器)。这类框架应具备任务管理、任务监控、良好的可扩展性和高可用性等功能。常用的Java生态中的分布式任务调度框架有Quartz Scheduler、ElasticJob和XXL-JOB。
6319 66
|
网络协议 应用服务中间件 网络安全
免费泛域名https证书教程—无限免费续签
随着互联网安全意识提升,越来越多网站采用HTTPS协议。本文介绍如何通过JoySSL轻松获取并实现免费泛域名SSL证书的无限续签。JoySSL提供永久免费通配符SSL证书,支持无限制域名申请及自动续签,全中文界面适合国内用户。教程涵盖注册账号、选择证书类型、验证域名所有权、下载与安装证书以及设置自动续签等步骤,帮助网站简化SSL证书管理流程,确保长期安全性。
1847 20
|
传感器 监控 供应链
IoT 和 IIoT 有什么区别
IoT(物联网)是指通过互联网连接各种日常设备,实现数据交换和远程控制的技术。而IIoT(工业物联网)则是专为工业领域设计的IoT,强调在制造业、能源等行业的应用,注重提高生产效率、优化流程和增强安全性。两者主要区别在于应用场景和目标不同。
1298 1
|
传感器 监控 UED
基于STM32的智能停车场管理系统设计与实现
基于STM32的智能停车场管理系统设计与实现
1361 1
|
传感器 Java API
基于JAVA的智能家居控制系统设计与实现
基于JAVA的智能家居控制系统设计与实现
929 0
|
存储 安全 物联网
搞懂Nfc刷卡看这篇就够了
搞懂Nfc刷卡看这篇就够了
9406 1