好有缘导航网

微服务架构中的服务发现:确保系统组件之间的无缝交互 (微服务架构中间件)


文章编号:35741 / 分类:行业资讯 / 更新时间:2024-12-12 23:47:49 / 浏览:

引言

微服务架构中的服务发现确保系统组件之间的无 微服务架构是一种将应用程序分解成松散耦合、独立部署的小型服务的软件开发方法。这种架构风格提供了许多好处,比如提高可扩展性、弹性和开发敏捷性。微服务架构也引入了一些挑战,其中一个关键挑战就是服务发现。

什么是服务发现?

服务发现是指在分布式系统中定位和连接服务的机制。在微服务架构中,服务可能是独立运行的进程或容器。当一个服务需要与其它的服务交互时,它需要能够发现这些服务的网络地址和端口。服务发现机制提供了一种方法来动态地发现和维护此信息。

服务发现的类型

有两种主要类型的服务发现机制:中心化服务发现:所有的服务信息都存储在中央注册表中。当服务需要发现其他服务时,它们会查询注册表。去中心化服务发现:服务信息分散在所有服务节点中。当服务需要发现其他服务时,它们会向其他服务发送查询消息。

服务发现的好处

服务发现提供以下好处:消除硬编码依赖:服务不再需要知道其他服务的具体网络地址和端口。这使得系统更加灵活,更容易进行扩展和修改。自动发现:当新服务加入或离开系统时,服务发现机制会自动更新服务注册表。这确保了服务始终能够找到它们所需的依赖项。负载均衡:服务发现机制可以用于实现负载均衡,将请求均匀地分布在多个服务实例之间。弹性:当服务发生故障时,服务发现机制可以帮助路由请求到其他健康的服务实例。这提高了系统的弹性。

常见的服务发现工具

有许多流行的服务发现工具可用于微服务架构。以下是其中的一些:

微服务测试的思考与实践

最近几年,微服务架构越来越火爆,逐渐被企业所采用。 随着软件架构的变化,对应的软件测试策略需要作何调整呢?本文将介绍微服务架构下的测试策略,并结合分享在业务和架构演变过程中,一个历经九年的项目测试策略的演进。

微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,每个服务运行在其独立的进程中,服务间采用轻量级通信机制互相沟通(通常是基于HTTP协议的RESTful API)。 每个服务都围绕着具体的业务进行构建,并且能够被独立部署到生产环境、预生产环境。

从微服务的概念可以看出它有如下好处:

同时,独立开发导致技术上的分离,HTTP通信加上Queue的机制增加了问题诊断的复杂度,对系统的功能、性能和安全方面的质量保障带来了很大的挑战。 另外,服务间的复杂依赖关系带来了很多的不确定性,要实现独立部署,对运维也提出了更高的要求。 微服务架构的系统要特别关注这几个方面:

谈到微服务的测试策略,很容易就想到了老马推荐的文章《 Microservices Testing 》,该文推荐的微服务框架下的测试策略是这样的:

(经典策略模型)

这个策略模型强调测试分层以及每一层的恰当覆盖,整体符合金字塔结构。它是最优的吗?

有人对此提出了质疑...认为策略模型应该是蜂巢形状的(请参考 文章 ):

(蜂巢模型)

这个模型重点关注服务间的集成测试,两端的单元测试和UI层E2E测试较少。

也有同事提出微服务下的测试结构应该是钻石形状的,服务间的集成依然是重点,单元测试较少,而顶层增加了安全和性能等非功能测试。

(钻石模型)

好像都有道理,到底选择什么样的策略模型好呢?不禁陷入了困境…...怎么办?不妨先来听听我们项目的故事吧!

还是那个蓝鲸项目,不知不觉进入了第九个年头。 在这九年里,随着业务的不断发展,系统架构也进行了多次演进和调整。 相应的,测试策略也发生了有意思的演进变化。

(测试策略的演进)

最初单一用户系统、单体架构的时候,严格按照测试金字塔来组织各层的自动化测试。 随着功能的扩展,大量mock的单元测试给重构带来了很大的不便。

企业系统开始开发的时候,我们调整了策略,减少单元测试的编写,增加UI层E2E测试的覆盖,测试结构由原来的金字塔演变成上面梯形下面倒三角的形式。

后来,架构调整,开始服务化。此时,大量的E2E测试渐渐暴露出问题:

因此,项目引入契约测试,停止编写新的E2E测试,将测试下移,分别用API测试和契约测试取代。

随着功能的不断增加,虽然E2E测试的量并不增加,但是其不稳定性、维护难、定位难的问题有增无减,此时已经很难由自动化测试来保证产品的质量。 为了平衡成本和收益,项目考虑去掉大部分E2E测试,只保留少量的Smoke测试,将更多的测试下移。

同时,技术雷达上新的技术“生产环境下的QA”出现,项目也开始关心生产环境,并且在QA测试阶段结合微服务的特点进行对应的探索式测试。

前文提到过微服务带来的挑战,下面来看项目是如何应对这些挑战的。

服务间的依赖、连通性

微服务架构下,独立开发的服务要整合起来最具挑战,如何保证服务间的依赖关系和连通性非常关键。 前面已经讲过E2E集成测试有很大的挑战,并不适合,而消费端驱动的契约测试是个不错的选择。 项目正是利用契约测试去保证服务间的连通性,取代一部分E2E集成测试。

服务的容错、可用性

在系统负荷达到一定程度或者某个服务出现故障的时候,微服务架构有两种技术来确保系统的可用性:服务的熔断和降级。 服务的熔断是指当某个服务出现故障时,为了保证系统整体的可用性,会关闭掉出现故障的服务;服务的降级则是当系统整体负荷过载的时候,考虑关闭某些外围服务来保证系统的整体可用性。

对应的测试包括:

数据的最终一致性

(数据一致性)

数据一致性是微服务特别需要关注的。 举个例子,电商平台某个订单支付成功以后,需要更新积分和订单状态,当订单服务或者积分服务其中有一个出现故障的时候,就会导致最终的数据不一致性。

测试这种情况,从业务的角度分析哪些服务会导致数据不一致性,制造对应的异常情况去测试数据的最终一致性。

独立部署

微服务的独立部署需要有CI、CD的支持,跟DevOps实践分不开。 同时,更为关键的是需要契约测试来验证独立部署后服务行为的正确性。 项目在这方面的工作,请参考王健的文章: 你的微服务敢独立交付吗?

不确定性

微服务架构使得系统复杂度增加不少,很多的事情发生都是不可预测的,只能在其发生以后找到产生的原因。 因此,也就没法在预生产环境通过测试去发现在真实生产环境才会发生的issue,我们需要把目光转移到生产环境,利用生产环境的不确定性、微服务的不可预测性来构建反脆弱的系统。

项目在这方面主要采用的技术是生产环境下的QA,请参考文章: 生产环境下的QA

从前面介绍的演进过程可以看到,项目测试策略在不同阶段结合参考了不同的策略模型:金字塔->近似钻石(除非功能测试外,类似于钻石模型)->蜂巢。 后期全面服务化的时候,我们认为蜂巢模型是比较适合的。

当然,光有符合这个策略模型的自动化测试是远远不够的,我们项目还采用了针对微服务特点的探索式测试,保持持续交付节奏,践行DevOps实践,结合生产环境下的QA等技术把关注点右移到生产环境。

现在,项目整体测试策略演变成下图的形式:

(项目测试策略)

项目上多次测试策略的调整,看似很简单,其实每次调整并不是一个轻松的过程,都是平衡利弊、综合考虑多个因素才做出的决定。

分析整个调整过程,最后突然发现:当我们面对多个策略模型不知道如何选择的时候,其实我们陷入了一个太过于关注测试结构的误区,忘记了最初的目标是什么。

跳出误区,回到原点,重新思考测试策略的目标。 影响策略的最关键因素是业务价值、质量要求、痛点。

(影响测试策略的因素)

业务价值

带来更大的业务价值、帮企业赢得更多的利润,是软件系统的目标;软件测试是软件系统成功的保障之一,业务价值也是测试策略的终极目标。 所有测试活动都要围绕这个目标开展,考虑业务优先级,有效规避业务风险。

质量要求

不同的系统、同一系统的不同利益干系人(参与的不同角色)对于质量的定义和要求都可能是不同的,这毫无疑问是影响测试策略的一个关键因素。

对于仅有内部用户的系统,关注的重心可能是系统的功能;而对外发布的产品,则要求更高,一个按钮位置的不恰当都可能带来大量用户的流失。

痛点

真正的痛点往往也是优先级最高,迫切需要解决的。 那些可以通过测试策略的调整来解决的痛点,自然成为了关键的影响因素之一。 比如,CI Pipeline出包太慢,为了提高出包的效率,一方面在Pipeline本身想办法,另一方面调整自动化测试的比例、执行频率等也是解决方案之一。

处在不同阶段的项目,在业务价值这个大目标下,其他影响因素也是会不一样的,跟技术架构的演进一样,测试策略也应该是演进式的。

从目标出发,综合所处阶段各个方面的影响因素,制定出适合当时的测试策略。 随着时间的推移,对策略进行评估和度量,并进一步改进、提高,以更好的满足需求。 这就是目标驱动的演进式测试策略。

(演进式测试策略)

微服务架构下多个服务的整合是最具有挑战的,对此最重要的是契约测试。 契约测试有效保证服务间的契约关系不被破坏,确保服务的连通性,有助于实现真正的独立部署和独立交付。

微服务架构引入的不确定性并不是坏事,可以利用这些不确定性,采用生产环境下的QA等技术,增强系统的反脆弱性,从中获益。

测试策略的影响因素不是唯一的,技术架构并不是最关键的因素。 微服务架构下的测试策略跟其他架构下的并不会有本质的区别。

业务价值始终是我们的终极目标。 在这个终极目标的驱动下,测试策略不是制定完了就可以束之高阁的,需要在整个软件系统构建过程中不断的度量和改进,是演进式的。

文/ThoughtWorks 林冰玉

springcloud是什么

SpringCloud 是一种基于Spring框架的分布式系统解决方案。 它为开发人员提供了一种快速构建分布式和微服务架构应用程序的工具集。 通过集成多个组件,SpringCloud简化了开发过程中的复杂性,并支持构建可靠、易于维护和可扩展的微服务应用程序。 以下是关于SpringCloud的

一、定义及主要功能

SpringCloud是一个基于Spring框架的开源项目,用于构建微服务架构的应用。 它提供了一系列工具,用于简化微服务应用程序的开发过程。 通过使用SpringCloud,开发人员可以轻松地管理和配置分布式系统中的各种组件和服务。 其主要功能包括服务注册与发现、负载均衡、断路器、智能路由等。

二、服务注册与发现

在微服务架构中,服务注册与发现是核心功能之一。 SpringCloud通过集成Eureka或Consul等服务注册中心,实现了服务的自动注册与发现。 这使得服务之间的调用更加简单和动态,提高了系统的可扩展性和容错能力。

三、负载均衡

在分布式系统中,请求的分发和负载均衡非常重要。 SpringCloud通过集成Ribbon等负载均衡库,实现了自动的客户端负载均衡。 这有助于确保请求被均衡地分发到不同的服务实例,提高了系统的整体性能和稳定性。

四、断路器

微服务架构中的服务间调用可能会因为各种原因导致调用失败。 SpringCloud中的断路器模式可以帮助处理这种情况,实现服务的熔断和降级,防止系统的连锁故障,提高系统的可用性和鲁棒性。

总之,SpringCloud是一个强大而灵活的微服务解决方案,通过一系列工具简化了分布式系统的开发和管理。 它提供了从服务注册与发现到负载均衡、断路器的全套解决方案,使开发人员能够更轻松地构建和维护可扩展的微服务应用程序。 此外,它基于Spring框架,与Spring Boot等框架紧密结合,降低了开发门槛和成本。

SpringCloud面试题2020(18题)——答案

SpringCloud面试题2020(18题)的答案详尽解析,涵盖了微服务架构的核心组件、功能和区别。

1. Spring Cloud 是基于SpringBoot的微服务解决方案,集成了服务注册与发现、配置中心、监控、网关、负载均衡等组件,提供一站式服务架构解决方案。

2. 微服务的优点包括:可扩展性强,易于维护和独立部署。 缺点可能包括:额外的复杂性,服务间通信开销,以及可能的分布式问题。

3. SpringBoot专注于快速开发单体微服务,而SpringCloud则负责全局协调,整合这些微服务。 它们是互补的关系,Boot负责基础,Cloud负责集成和治理。

4. Spring Cloud的核心组件包括服务注册与发现(如Consul、Nacos),服务调用(Ribbon, Feign),断路器(Hystrix)、配置中心、消息总线和链路追踪等。 Eureka不再推荐使用,推荐Consul或Nacos作为替代。

5. Ribbon是负载均衡客户端,Feign则简化了服务调用,Feign默认集成了Ribbon。 Ribbon需要手动构建请求,Feign则直接定义接口进行远程调用。

6. 熔断器(Hystrix)用于服务降级、熔断和限流,确保服务在压力下仍能提供可读的反馈,而非直接失败。

7. 网关(Gateway)是微服务架构中的关键组件,负责路由、断言和过滤,保护内部服务并实现安全策略。

8. Spring Cloud Bus用于服务间通信,Config用于分布式配置管理,Dubbo和Spring Cloud的区别在于功能全面性和扩展性。

9. REST和RPC是服务间通信的不同方式,RPC提供更直接的调用,REST则基于HTTP协议,更易理解和维护。

10. 微服务间通讯方式有远程过程调用和消息传递,各有优缺点,如处理复杂性和延迟的不同考虑。

11. 负载均衡的意义在于平衡服务请求,避免单点故障,并提高系统可用性和性能。

12. SpringCloud通过注册服务到Eureka或ZooKeeper来实现服务注册,而两者在数据一致性模型和角色分配上有所区别。

SpringCloud面试题的PDF版链接如下,供参考学习。


相关标签: 确保系统组件之间的无缝交互微服务架构中间件微服务架构中的服务发现

本文地址:http://www.hyyidc.com/article/35741.html

上一篇:云环境中的自动化部署解锁敏捷性和可扩展性...
下一篇:小程序支付与微商的融合释放微商潜力,拓展商...

温馨提示

做上本站友情链接,在您站上点击一次,即可自动收录并自动排在本站第一位!
<a href="http://www.hyyidc.com/" target="_blank">好有缘导航网</a>