Springboot 实践(21)服务熔断机制

news2024/11/25 5:29:52

        在微服务架构中,服务众多,通常会涉及到多个服务层的调用,一旦基础服务发生故障,很可能会导致级联故障,继而造成整个系统不可用,这种现象被称为服务雪崩效应。

        服务熔断引入熔断器概念,熔断器如果在一段时间内侦测到许多类似错误,就会强迫其以后的多个调用快速失败,不在访问远程服务器,从而防止应用程序不断地尝试执行可能会失败的操作,使应用程序继续执行而不用等待修正错误或者浪费CPU时间去等到长时间的超市产生。熔断器也会侦测诊断错误是否已经修正,如果已经修正,应用程序会再次尝试调用操作。

    Hystrix特性

    当Hystrix Command名请求后端服务失败数量超过一定高比例(默认50%),断路器切换到开路状态(open);这时所有的请求会直接失败二不会发送到后端服务;断路器保持在开路状态一段时间后(默认为5s),自动切换到半开路状态(Half-open),这是会判断一下请求的返回情况,如果请求成功,则切换回闭路状态(closed),否则切换回开库装填(open)。

    Fallback

    当请求的后端服务出现异常时,可以使用fallback方法的范围值作为后端服务的返回值。

    下面我们以前文创建的Springboot-LoadBalance-producer1、Springboot-LoadBalance-producer2作为项目的基础服务端,并创建服务消费者项目,命名为Springboot-LoadBalance-consumer3,项目创建详细步骤如下:

1、利用MyEclipse创建web project工程Springboot-LoadBalance-consumer3

2、Pom.xml

<!-- web -->

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-web</artifactId>

        </dependency>

        <!-- swagger -->

        <dependency>

            <groupId>io.springfox</groupId>

            <artifactId>springfox-swagger2</artifactId>

            <version>2.9.2</version>

        </dependency>

        <dependency>

            <groupId>io.springfox</groupId>

            <artifactId>springfox-swagger-ui</artifactId>

            <version>2.9.2</version>

        </dependency>

        <!--spring-boot-admin-->

           <dependency>

            <groupId>de.codecentric</groupId>

            <artifactId>spring-boot-admin-starter-client</artifactId>

            <version>2.0.4</version>

        </dependency>

        <!--consul-->

        <dependency>

            <groupId>org.springframework.cloud</groupId>

            <artifactId>spring-cloud-starter-consul-discovery</artifactId>

        </dependency>

        <!--feign -->

        <dependency>

            <groupId>org.springframework.cloud</groupId>

            <artifactId>spring-cloud-starter-openfeign</artifactId>

        </dependency>

        <!--test-->

        <!--actuator-->

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-actuator</artifactId>

        </dependency>

        <!-- spring-cloud-config -->

        <dependency>

             <groupId>org.springframework.cloud</groupId>

             <artifactId>spring-cloud-starter-config</artifactId>

        </dependency>

        <!-- bus-amqp -->

        <dependency>

            <groupId>org.springframework.cloud</groupId>

            <artifactId>spring-cloud-starter-bus-amqp</artifactId>

        </dependency>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-test</artifactId>

            <scope>test</scope>

        </dependency>

3、Bootstrap.yml

        注意,该配置使用了注册中心,配置中心的搭建工作,学友们可关注博主,到博主博文中查找对应的博文。

spring:

  cloud:

    consul:

      host: localhost

      port: 8500

      discovery:

        serviceName: mango-consumer # 注册到consul的服务名称

    config:

      discovery:

        enabled: true  # 开启服务发现

        serviceId: mango-config # 配置中心服务名称

      name: mango-consumer  # 对应{application}部分

      profile:  dev # 对应{profile}部分

      #label: master  # 对应git的分支,如果配置中心使用的是本地存储,则该参数无用

4、mango-consumer.xml

server:

  port: 8006

spring:

  application:

    name: mango-consumer

  boot:

    admin:

      client:

        instance:

          service-base-url: ${spring.application.name}

# 开放健康检查接口

management:

  endpoints:

    web:

      exposure:

        include: "*"

  endpoint:

    health:

      show-details: ALWAYS

#开启熔断器

feign:

  hystrix:

         enabled: true

5、启动函数

@EnableFeignClients

@EnableDiscoveryClient

@SpringBootApplication

public class MangoConsumerApplication {

    public static void main(String[] args) {

        SpringApplication.run(MangoConsumerApplication.class, args);

    }

    @Bean

    @LoadBalanced

    public RestTemplate restTemplate() {

        return new RestTemplate();

    }

    // 此配置是为了服务监控而配置,与服务容错本身无关,

    // ServletRegistrationBean因为springboot的默认路径不是"/hystrix.stream",

    // 只要在自己的项目里配置上下面的servlet就可以了

    @Bean

    public ServletRegistrationBean getServlet() {

        HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();

        ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);

        registrationBean.setLoadOnStartup(1);

        registrationBean.addUrlMappings("/hystrix.stream");

        registrationBean.setName("HystrixMetricsStreamServlet");

        return registrationBean;

    }

}

6、添加controller

(1)添加接口程序

@FeignClient(name = "mango-producer", fallback = MangoProducerHystrix.class)

public interface MangoProducerService {

    @RequestMapping("/hello")

    public String hello();

   

}

(2)添加MangoProducerHystrix.java

注册服务调用失败时,fallback返回内容

@Component

public class MangoProducerHystrix implements MangoProducerService {

    @RequestMapping("/hello")

    public String hello() {

        return "sorry, hello service call failed.";

}

}

(3)添加controller

@RestController

public class FeignHelloController {

    @Autowired

    private MangoProducerService mangoProducerService;

   

    @RequestMapping("/feign/call")

    public String call() {

        // 像调用本地服务一样

        return mangoProducerService.hello();

    }   

}

7、测试项目:

  1. 首先启动服务注册consul服务;
  2. 启动配置中心
  3. 启动Springboot-LoadBalance-producer1、Springboot-LoadBalance-producer2
  4. 启动新创建的工程Springboot-LoadBalance-consumer3
  5. 通过http://localhost:8500,  查看仙姑启动情况,如下图所示:

  1. 通过http://localhost:8006/feign/call,调用后台服务

连续两次访问,实现了负载平衡的轮询算法。下面我们关闭Springboot-LoadBalance-producer1和Springboot-LoadBalance-producer2服务,查看是否能够实现fallback提示信息

备注:Springboot-LoadBalance-producer1和Springboot-LoadBalance-producer2两个工程使用了同一个工程名称,属于同一个项目的两个实例,由于项目使用了负载均衡资质,如果只是关闭其中一个服务,负载平衡机制会自动访问在线的服务,不会返回fallback定义的信息,请注意!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1029637.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

libopenssl 实现私钥加密公钥解密

在需要验证可信来源时&#xff0c;需要用到签名验签。因此&#xff0c;需要使用私钥加密&#xff0c;公钥解密&#xff0c;取得被加密的信息。这就会使用到私钥加密&#xff0c;公钥解密的场景了。 参考&#xff1a; https://github.com/openssl/openssl/issues/20493 https:/…

【Python】Pycharm使用anaconda中的PaddleOCR的虚拟环境 卡在loading package list(保姆级图文)

目录 异常表现&#xff1a;解决方法1. 试着使用pytcharm的http代理&#xff08;很确定没用&#xff0c;无法成功&#xff0c;直接看下一步&#xff09;2. conda换国内源&#xff08;换源后重启&#xff1f;不知道有没有用&#xff0c;不确定是否关键&#xff09;3. 在conda中更…

2023年浙工商MBA新生奖学金名单公布,如何看待?

浙工商MBA项目官方最新公布了2023年的非全日制新生奖学金名单&#xff0c;按照政策约定&#xff0c;共分为特等奖学金1名&#xff0c;一等奖学金10名&#xff0c;二等奖学金15名&#xff0c;三等奖学金30名&#xff0c;额度对应3万、1万、0.8万、0.5万不等&#xff0c;主要名单…

c++ 继承与多态

一、c如何解决菱形继承的问题 例子一 菱形继承问题 #include <iostream> #include <string.h> using namespace std; class Animal { public:int m_Age; }; class Sheep : public Animal {}; class Tuo : public Animal {}; class SheepTuo :public Sheep, publ…

phpstudy脚本编写 和sql注入编写

1.phpstudy编写 2.sql注入编写

一、iMove源码解读:初识

引言&#xff1a;随着低代码思想的不断蔓延&#xff0c;除了大企业&#xff0c;中小企业也尝试构建自己的低代码平台&#xff0c;以期降低开发门槛&#xff0c;提高开发效率&#xff0c;降低生产成本。本文中的iMove是一款面向前端开发者的逻辑编排工具&#xff0c;通过它设计出…

【Java 基础篇】Java线程安全与并发问题详解

多线程编程在Java中是一个常见的需求&#xff0c;它可以提高程序的性能和响应能力。然而&#xff0c;多线程编程也带来了一系列的线程安全与并发问题。在本文中&#xff0c;我们将深入探讨这些问题&#xff0c;以及如何解决它们&#xff0c;适用于Java初学者和基础用户。 什么…

机器学习入门教学——损失函数(交叉熵法)

1、前言 我们在训练神经网络时&#xff0c;最常用到的方法就是梯度下降法。在了解梯度下降法前&#xff0c;我们需要了解什么是损失(代价)函数。所谓求的梯度&#xff0c;就是损失函数的梯度。如果不知道什么是梯度下降的&#xff0c;可以看一下这篇文章&#xff1a;机器学习入…

人工智能的未来:技术与道德的交汇

人工智能的未来&#xff1a;技术与道德的交汇 摘要引言技术的前景1. 机器学习的进展2. 自主智能系统 道德考量3. 数据隐私与安全4. 自主决策的伦理 社会影响5. 就业与教育6. 医疗与健康 总结参考资料 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客&#x1f466;…

新款 锐科达 SV-2402VP SIP广播音频模块 支持RTP流音频广播

新款 锐科达 SV-2402VP SIP广播音频模块 支持RTP流音频广播 SV-2402VP网络音频模块是一款通用的独立SIP音频功能模块&#xff0c;可以轻松地嵌入到OEM产品中。该模块对来自网络的SIP协议及RTP音频流进行编解码。 该模块支持多种网络协议和音频编解码协议&#xff0c;可用于VoI…

Spring底层原理之 BeanFactory 与 ApplicationContext

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 Spring底层原理 一、 BeanFactory 与 Appli…

华为杯数学建模比赛经验分享第二期——编程手篇

数学建模比赛中编程手是较为重要的角色&#xff0c;不仅需要根据建模手的思路完成代码的编写&#xff0c;还需要与写作手沟通结果分析与呈现。 所以&#xff0c;编程手必须在不同的阶段完成相应的学习&#xff0c;这里我把它分为赛前和赛中。 1、赛前 在短短4天的学习新的代码…

虚拟DOM与diff算法

虚拟DOM与diff算法 snabbdom虚拟DOMdiff算法 snabbdom 是什么&#xff1a;snabbdom是著名的虚拟DOM库&#xff0c;是diff算法的鼻祖&#xff0c;Vue源码借鉴了snabbdom 虚拟DOM 是什么&#xff1a;本质上是存在内存里的 JavaScript 对象 作用&#xff1a;用来描述真实DOM的层…

DA2--获取网站用户数据集的大小

目录 1.题目描述 2.输入描述 3.输出描述 4.题目分析 5.通过代码 1.题目描述 现有一个Nowcoder.csv文件&#xff0c;它记录了牛客网的部分用户数据&#xff0c;包含如下字段&#xff08;字段与字段之间以逗号间隔&#xff09;&#xff1a; Nowcoder_ID&#xff1a;用户ID…

Vue 使用vue-cli构建SPA项目(超详细)

目录 一、什么是vue-cli 二&#xff0c;构建SPA项目 三、 运行SPA项目 前言&#xff1a; 在我们搭建SPA项目时候&#xff0c;我们必须去检查我们是否搭建好NodeJS环境 cmd窗口输入以下指令&#xff1a;去检查 node -v npm -v 一、什么是vue-cli Vue CLI&#xff08;Vu…

【智能电表数据接入物联网平台实践】

智能电表数据接入物联网平台实践 设备接线准备设备调试代码实现Modbus TCP Client 读取电表数据读取寄存器数据转成32bit Float格式然后使用modbusTCP Client 读取数据 使用mqtt协议接入物联网平台最终代码实现 设备接线准备 设备调试 代码实现 Modbus TCP Client 读取电表数…

抄写Linux源码(Day12:从 MBR 到 C main 函数 (1) )

回忆我们需要做的事情&#xff1a; 为了支持 shell 程序的执行&#xff0c;我们需要提供&#xff1a; 1.缺页中断(不理解为什么要这个东西&#xff0c;只是闪客说需要&#xff0c;后边再说) 2.硬盘驱动、文件系统 (shell程序一开始是存放在磁盘里的&#xff0c;所以需要这两个东…

极客时间:数据结构与算法之美【文章笔记 实践 总结】

原文链接:https://time.geekbang.org/column/intro/100017301 27 | 递归树&#xff1a;如何借助树来求解递归算法的时间复杂度&#xff1f;如何借助树来分析归并排序算法的时间复杂度&#xff1f;如何借助树来分析快速排序算法的时间复杂度&#xff1f;如何借助递归树来分析斐波…

macos (M2芯片)搭建flutter环境

安装的版本3.13.4、电脑上没有安装过android studio、安装过brew 1.在终端运行sudo softwareupdate --install-rosetta --agree-to-license&#xff0c;下图展示安装成功的效果 2.下载以下安装包来获取最新的 stable Flutter SDK 3.解压&#xff0c;⚠️注意下载安装sdk的包名…

沉积物微体古生物鉴定

声明 本文是学习GB-T 42629.4-2023 国际海底区域和公海环境调查规程 第4部分&#xff1a;海洋沉积物物理特性调查. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了国际海底区域和公海环境调查中的沉积物组成、物理力学性质、生物…