什么是微服务中的断路器设计模式?如何实施?

举报
千锋教育 发表于 2023/05/31 17:10:40 2023/05/31
【摘要】 大家好,微服务设计模式是 Java 开发人员需要学习的非常重要的概念,不仅是为了创建一个健壮的、可扩展的、高性能的微服务架构,也是为了在 Java 开发人员面试中取得好成绩。过去,我分享了几种微服务设计模式,如 eEvent Sourcing、 SAGA、Database Per Microservices、CQRS、  API Gateway,还分享了设计微服务的最佳实践 ,在本文中,我将...

大家好,微服务设计模式是 Java 开发人员需要学习的非常重要的概念,不仅是为了创建一个健壮的、可扩展的、高性能的微服务架构,也是为了在 Java 开发人员面试中取得好成绩。过去,我分享了几种微服务设计模式,如 eEvent Sourcing、 SAGA、Database Per Microservices、CQRS、  API Gateway,还分享了设计微服务的最佳实践 ,在本文中,我将讨论断路器设计模式,以及如何使用 Spring Cloud Framework 在 Java 中实现。这不仅仅是一个重要的微服务模式  还有一个流行的微服务问题,我在前面关于15 个微服务面试问题的文章中也提到过。如果您还没有阅读那篇文章,我建议您阅读它,特别是如果您正在准备 Java 和微服务面试。 


什么是微服务中的断路器设计模式?如何实施?
在微服务架构的世界中,容错性和弹性是需要考虑的两个最重要的因素。断路器设计模式是实现这一目标的重要工具。在本文中,我们将探讨断路器模式是什么、它是如何工作的,以及如何在微服务中实现它。

什么是断路器设计模式?
断路器模式是软件工程中用于处理分布式系统故障的设计模式。它用于检测和处理服务之间通信中的故障,防止它们级联并造成进一步的损害。

111.png

Circuit Breaker 模式的工作原理是将潜在的危险或错误操作包装在断路器对象中。断路器旨在检测操作何时失败或完成时间太长。 

一旦达到阈值,断路器将“跳闸”并停止执行操作,而是返回一个预先配置的回退值。这有助于阻止错误操作在系统中级联,从而防止进一步损坏。

什么是断路器设计模式?


什么是微服务中的断路器设计模式?如何实施?
断路器模式具有三种状态:关闭、打开和半打开。
关闭
在关闭状态下,断路器允许请求流过并正常执行操作。

打开
在打开状态下,断路器返回一个预先配置的回退值,而不是执行操作。

半开
在半开状态下,断路器允许有限数量的请求通过以测试操作是否正常运行。如果这些请求成功,断路器将返回到关闭状态。如果它们失败,断路器将返回打开状态。

222.jpg

如何在微服务中实现断路器设计模式?
有多种框架和库可用于在微服务中实现断路器模式。在本节中,我们将探讨如何使用 Netflix Hystrix 来实现断路器模式,Netflix Hystrix 是一种广泛用于在微服务中实现断路器的库。

第一步:添加Hystrix依赖
第一步是将 Hystrix 依赖项添加到您的微服务项目中。如果您使用的是 Maven,则可以将以下依赖项添加到 pom.xml 文件中:

<dependency> 
    <groupId> com.netflix.hystrix </groupId> 
    <artifactId> hystrix-core </artifactId> 
    <version> 1.5.18 </version> 
</dependency>


第 2 步:创建 Hystrix 命令
接下来,您需要创建一个 Hystrix 命令来代表您要执行的操作。您可以通过扩展 HystrixCommand 类并使用您的逻辑覆盖 run() 方法来实现这一点。run ()方法应该返回操作的结果。

下面是一个使用 Apache HttpClient 库执行 HTTP 请求的 Hystrix 命令示例:

公共类 HttpCommand 扩展 HystrixCommand<String>  {

    私有 最终 HttpClient httpClient;
    私有 最终 HttpUriRequest请求;

    public HttpCommand ( HttpClient httpClient, HttpUriRequest请求) {
         super ( HystrixCommandGroupKey . Factory .asKey( "HttpGroup" ));
        这个.httpClient = httpClient;
        这个.request = 请求;
    }

    @Override 
    protected  String run() throws  Exception {
         HttpResponse response = httpClient.execute(request);
        字符串结果 = EntityUtils .toString(response.getEntity());
        返回结果;
    }
}


第 3 步:配置 Hystrix 断路器
接下来,您需要为您的 Hystrix 命令配置 Hystrix 断路器。您可以通过创建 HystrixCommandProperties 对象并设置相关属性来完成此操作。

下面是使用以下属性配置 Hystrix 断路器的示例:

HystrixCommandProperties .Setter ()
         .withCircuitBreakerErrorThresholdPercentage ( 50 )
         .withCircuitBreakerRequestVolumeThreshold ( 10 )
         .withCircuitBreakerSleepWindowInMilliseconds ( 5000 )
         .withExecutionTimeoutEnabled (false));


第 4 步:执行 Hystrix 命令
最后,您可以通过创建命令实例并调用execute()方法来执行 Hystrix 命令。如果成功,此方法将返回操作结果,如果断路器打开,则返回回退值。

下面是执行 HttpCommand 的示例:

HttpClient httpClient = HttpClients.createDefault();
HttpGet request = new HttpGet( "https://jsonplaceholder.typicode.com/posts/1" );
HttpCommand 命令 = new HttpCommand(httpClient,请求);

字符串结果 = 命令。执行();

而且,这是一个很好的序列图,它解释了断路器模式在微服务架构中的工作原理:

333.jpg


什么是微服务中的断路器设计模式? 如何实施?


使用断路器设计模式的好处
在您的微服务架构中实施断路器设计模式可以提供多种好处,例如:
容错
断路器模式有助于防止故障级联并在分布式系统中造成进一步损坏。

弹性
该模式允许系统继续运行,即使一个或多个服务出现故障或遇到问题。

提高性能
该模式减少了等待缓慢或错误操作完成所花费的时间,从而提高了整体系统性能。

减少停机时间
通过以更有效和及时的方式处理故障,断路器模式可以减少系统停机时间并提高可用性。

更好的用户体验
该模式有助于确保用户拥有无缝体验,即使系统的某些部分无法正常运行。

实施断路器设计模式的最佳实践
在微服务中实现断路器模式时,您应该遵循几个最佳实践以确保正确实现该模式。这些包括:

1.监控
必须监控系统的性能和断路器模式本身,以确保其正常运行。

2.配置阈值
应根据系统的特定要求适当设置断路器何时应跳闸以及何时应返回闭合状态的阈值。

3. 回退机制
回退机制应该仔细设计以确保它们向用户提供有意义和准确的信息。

4. 测试
断路器模式应该在各种场景中进行彻底测试,以确保它按预期工作。

5. Circuit Breaker 库
使用成熟可靠的 Circuit Breaker 库,如 Netflix Hystrix,可以简化实施过程并减少出错的可能性。

444.jpg

结论
断路器 设计模式是微服务架构领域中必不可少的工具。它有助于处理分布式系统中的故障,防止它们级联并造成进一步的破坏。使用 Netflix Hystrix 等框架实现断路器模式相对简单,可以为您的微服务架构带来显着优势。 

按照本文概述的步骤,您可以轻松地在微服务中实施断路器模式,并提高系统的容错性和弹性。

更多精彩Java精彩内容欢迎B站搜索“千锋教育

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。