架构之:微服务架构漫谈

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 架构之:微服务架构漫谈

架构之:微服务架构漫谈


目录



简介


微服务的架构出现已经很久很久了,微服务架构就是一种将单个应用程序转换为一组小服务的方法,每个小服务都在自己的进程中运行,并使用轻量级的交互方式(如HTTP)进行通信。


服务的划分是根据具体的业务来的,并且可以通过完全自动化的部署机制独立部署。虽然大家都在谈论微服务,但是什么时候应该使用微服务,使用微服务需要注意哪些问题对于很多人来说仍然是一个模糊的概念。本文将会和大家一起探讨一下微服务相关的一些问题。


微服务和单体服务


在最开始的程序体系中,通常都是单体服务。对于单体服务来说,所有的服务都在一个进程中。企业应用程序通常由三个主要部分构建: 客户端用户界面(由 HTML 页面和在用户机器上的浏览器中运行的 javascript 组成),数据库(由插入到公共的、通常是关系的数据库管理中的许多表组成系统)和服务器端应用程序。


服务器端应用程序将处理 HTTP 请求、执行域逻辑、从数据库检索和更新数据,以及选择和填充要发送到浏览器的 HTML 视图。这个服务器端应用程序是一个整体,也就是一个单独的进程。对系统的任何更改都需要重新构建和部署服务器端应用程序的最新版本。


对于单体服务来说,所有的处理请求逻辑都在单个进程中运行,为了结构化和代码编写规范,通常会使用编程语言的基本功能将应用程序划分为类、函数和命名空间等。


虽然单体服务也可以通过负载均衡器后面运行多个实例来水平扩展应用,但是随着服务器端业务越来越复杂,对于服务的每一次很小的变动都会导致对于整体服务的重新构建和部署。并且随着时间的推移,通常很难保持良好的模块化结构,和对现有架构进行扩展。同时因为单体服务在一个进程中运行,如果该进程出现运行时问题,会导致所有的服务不可用,稳定性不够。


俗话说得好,鸡蛋不能放在一个篮子里面。


于是把巨大的单体服务拆分成为一个个的微服务就是现在系统架构的热潮。


微服务架构就是将单体的应用程序拆分为一个个的服务,这些服务可以独立部署和扩展,并且服务之间有牢固的模块边界,服务之间主要通过HTTP协议进行交互。因为服务之间是无内部耦合的,所以我们可以甚至使用不同的编程语言来实现不同的服务。提高了程序的灵活性。


image.png


微服务的特征


微服务有些什么特征呢?什么样的服务才能被称为是微服务呢?


社会很复杂,单纯的是人。实际工程上的问题,不会向书本上学到的知识那样,有一个明确定义。事实上,出了学校之后,这个世界上的事情已经不是非黑即白了。


比如,我们上学时候学到的圆的定义,它清晰的告诉我们,什么是圆。而对于微服务来说,则并没有这样的定义。


因为微服务是在不断的实践中总结摸索出来的一种架构。虽然不同的人对微服务有不同的理解,但是他们应该都具有下面几个共同的特征。


组件服务化


自从软件变得复杂之后,为了更好的进行软件开发和后续的扩展,软件逐渐开始组件化。所谓组件就是一个个的可以独立替换和升级的部件。


现代程序中有很多可以称之为组件的东西,比如java中的依赖jar包,python中的依赖包等。


这些lib可以在运行时链接到程序中,以内存中的函数进行运行。


有了链接的lib,为什么我们还需要将这些组件服务化,以单独的进程来运行呢?


使用服务作为组件(而不是库)的一个主要原因是服务是可独立部署的。如果您的应用程序 由单个进程中的多个库组成,则对任何单个组件的更改都会导致必须重新部署整个应用程序。


但是,如果该应用程序分解为多个服务,那么对于该服务的变更,只需要重新部署该服务即可。虽然这不是绝对的,因为有些服务的变化会导致对应的调用接口的变化,所以也需要对应的服务来进行修改和适配。但是一个好的微服务架构的目标是通过服务契约中的内聚服务边界和演化机制来最小化这些变动。


使用服务作为组件的另一个好处是更明确的组件接口。大多数语言没有定义显式发布接口的良好机制,从而导致组件之间的耦合过于紧密。通过使用显式远程调用机制,服务可以更容易的进行定义。


使用服务也有他的缺点,因为服务之间是通过远程调用的,远程调用比进程内调用更昂贵,所以服务之间的调用通常是更加粗粒度的调用,所以我们在界定服务的时候,需要划分明确的职责分配。


组织的划分


根据康威定律:组织沟通方式决定系统设计。


通常来说,对于大型的系统可以分为UI团队,服务逻辑团队和数据库团队。但是这样的组织方式就会导致一个团队的改动需要其他团队也进行改动来配合。


所以在微服务中,组织应该是安装具体的业务来划分,这样能够保证组织的灵活性。


服务之间的通信


对于单体服务而言,依赖的lib是通过内部函数的调用来实现的,它的好处就是速度快,但是如果将单体服务转换成微服务,就需要考虑到服务之间的相互调用问题。


常见的服务之间的调用方式有哪些呢?


最常见的就是HTTP/HTTPS协议之间的调用,这种方式的好处就是协议简单通用,兼容性的成本较低。


如果是跨语言的,通常会用Thrift之类的RPC远程调用协议,这种方式的好处就是会比HTTP调用要快,但是调用起来比较复杂。需要构建特定的客户端。


上面讲的是同步调用,如果是异步的话,还可以使用MQ机制,MQ的作用一是可以削峰,二是可以解耦。


去中心化治理


对于微服务来说,并不要求所有的微服务都采用同一种语言,同一种架构方式来进行。通常来说了保证系统和代码的可维护性,一般来说是要求所有的服务都使用同样的编程语言和架构。


但是对于特别的部分,比如对性能要求特别高这样的需求,那么可以尝试考虑一个不同的编程语言。


总的来说,就是每个微服务的团队对他们自己的服务负责,只需要保证对外的服务和接口的正确性即可。


去中心化数据管理


对于单体应用来说, 所有的数据都放在一个数据库中。如果对微服务进行了去中心化管理,那么相应的数据库属于各个微服务组,所以在理论上微服务的数据也应该是去中心化部署的。


但是这样多个数据库照成的后果就是各个数据库中数据的一致性。在单体应用中,这个问题可以通过数据库事务来解决。但是对于微服务来说,分布式事务是不可行的,或者说代价太大。一般来说对于微服务来说,我们需要保证数据的最终一致性。


通过补偿机制来进行数据的校验和修复。


自动化部署


自动化部署的目标就是持续交付,对于微服务来说,多个服务的自动化是必不可少的。通过自动化编译,自动化测试,自动化集成和自动化部署,可以大大的减轻开发团队和运维团队的任务。提升开发效率。


对异常的响应


使用服务作为组件的结果是,应用程序需要设计成可以容忍服务失败。 任何服务调用都可能因网络或者其他的原因导致不可用而失败,所以必须尽可能优雅地对此做出响应。


于单体服务相比,这需要引入额外的复杂性来处理它,所以可以看做是微服务的一个缺

点。开发团队需要尽量多做异常测试,以保证在极端的环境中程序的正确性。


由于服务随时可能出现故障,因此能够快速检测故障并在可能的情况下自动恢复服务非常重要。微服务应用程序非常重视应用程序的实时监控,检查架构元素(数据库每秒收到多少请求)和业务相关指标(例如每分钟收到多少订单)。语义监控可以提供错误的早期预警系统,让开发团队跟进和调查。 监控对于快速发现不良的紧急行为并加以修复至关重要。


我们希望看到针对每个单独服务的复杂监控和日志记录设置,例如显示启动/关闭状态的仪表板以及各种运营和业务相关指标,还包括有关断路器状态、当前吞吐量和延迟的详细信息等。


总结



讲了这么多微服务的特征,微服务虽然有他的灵活性的优点,但是如何划分微服务的边界,和对微服务的监控是一个很复杂的问题,所以到底要不要使用微服务还留给读者自己思考。


相关文章
|
5天前
|
敏捷开发 监控 数据管理
构建高效微服务架构的五大关键策略
【4月更文挑战第20天】在当今软件开发领域,微服务架构已经成为一种流行的设计模式,它允许开发团队以灵活、可扩展的方式构建应用程序。本文将探讨构建高效微服务架构的五大关键策略,包括服务划分、通信机制、数据管理、安全性考虑以及监控与日志。这些策略对于确保系统的可靠性、可维护性和性能至关重要。
|
6天前
|
消息中间件 监控 持续交付
构建高效微服务架构:后端开发的进阶之路
【4月更文挑战第20天】 随着现代软件开发的复杂性日益增加,传统的单体应用已难以满足快速迭代和灵活部署的需求。微服务架构作为一种新兴的分布式系统设计方式,以其独立部署、易于扩展和维护的特点,成为解决这一问题的关键。本文将深入探讨微服务的核心概念、设计原则以及在后端开发实践中如何构建一个高效的微服务架构。我们将从服务划分、通信机制、数据一致性、服务发现与注册等方面入手,提供一系列实用的策略和建议,帮助开发者优化后端系统的性能和可维护性。
|
1天前
|
持续交付 API 开发者
构建高效微服务架构:后端开发的新范式
【4月更文挑战第24天】 随着现代软件系统的复杂性日益增加,传统的单体应用已难以满足快速迭代与灵活扩展的需求。微服务架构作为一种新兴的软件开发模式,以其服务的细粒度、独立部署和弹性伸缩等优势,正在逐渐成为后端开发的重要趋势。本文将深入探讨微服务架构的设计原则、关键技术以及在实际业务中的应用实践,旨在为后端开发者提供构建和维护高效微服务架构的参考指南。
|
3天前
|
监控 API 持续交付
构建高效微服务架构:后端开发的新趋势
【4月更文挑战第23天】 随着现代软件开发实践的不断演进,微服务架构已经成为企业追求敏捷、可扩展和弹性解决方案的首选。本文深入探讨了如何构建一个高效的微服务架构,涵盖了关键的设计原则、技术选型以及实践建议。通过分析微服务的独立性、分布式特性和容错机制,我们将揭示如何利用容器化、服务网格和API网关等技术手段,来优化后端系统的可维护性和性能。文章旨在为后端开发人员提供一套全面的指南,以应对不断变化的业务需求和技术挑战。
|
8天前
|
机器学习/深度学习 运维 Prometheus
探索微服务架构下的系统监控策略
【4月更文挑战第18天】在当今快速迭代和持续部署盛行的软件工程实践中,微服务架构因其灵活性和可扩展性受到企业青睐。然而,随着服务的细粒度拆分和网络通信的增加,传统的监控手段已不再适用。本文将探讨在微服务环境中实施有效系统监控的策略,包括日志聚合、性能指标收集、分布式追踪以及异常检测等关键技术实践,旨在为读者提供构建稳定、可靠且易于维护的微服务系统的参考指南。
12 0
|
8天前
|
监控 持续交付 开发者
构建高效微服务架构:后端开发的新趋势
【4月更文挑战第18天】在数字化转型的浪潮中,微服务架构已成为企业提升系统灵活性、加速产品迭代的关键。此文深入探讨了构建高效微服务架构的实践方法,包括服务划分原则、容器化部署、持续集成/持续部署(CI/CD)流程以及监控与日志管理等关键技术点。通过分析具体案例,揭示了微服务在提高开发效率、降低维护成本及促进团队协作方面的显著优势。
|
9天前
|
负载均衡 Java 开发者
细解微服务架构实践:如何使用Spring Cloud进行Java微服务治理
【4月更文挑战第17天】Spring Cloud是Java微服务治理的首选框架,整合了Eureka(服务发现)、Ribbon(客户端负载均衡)、Hystrix(熔断器)、Zuul(API网关)和Config Server(配置中心)。通过Eureka实现服务注册与发现,Ribbon提供负载均衡,Hystrix实现熔断保护,Zuul作为API网关,Config Server集中管理配置。理解并运用Spring Cloud进行微服务治理是现代Java开发者的关键技能。
|
10天前
|
监控 JavaScript 安全
构建微服务架构下的API网关
【4月更文挑战第15天】在微服务架构中,API网关扮演着至关重要的角色。它作为系统的唯一入口,不仅负责请求的路由、负载均衡和认证授权,还涉及到监控、日志记录和服务熔断等关键功能。本文将探讨如何构建一个高效且可靠的API网关,涵盖其设计原则、核心组件以及实现策略,旨在为后端开发人员提供一套实用的指导方案。
25 4
|
11天前
|
监控 负载均衡 API
构建高性能微服务架构:后端开发的最佳实践
【4月更文挑战第14天】 在当今快速发展的软件开发领域,微服务架构已成为构建可扩展、灵活且容错的系统的首选方法。本文深入探讨了后端开发人员在设计和维护高性能微服务时需要遵循的一系列最佳实践。我们将从服务划分原则、容器化部署、API网关使用、负载均衡、服务监控与故障恢复等方面展开讨论,并结合实际案例分析如何优化微服务性能及可靠性。通过本文的阅读,读者将获得实施高效微服务架构的实用知识与策略。
|
13天前
|
运维 监控 自动驾驶
构建可扩展的应用程序:Apollo与微服务架构的完美结合
构建可扩展的应用程序:Apollo与微服务架构的完美结合
32 10