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

2023-09-21 15:59:45

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

        服务熔断引入熔断器概念,熔断器如果在一段时间内侦测到许多类似错误,就会强迫其以后的多个调用快速失败,不在访问远程服务器,从而防止应用程序不断地尝试执行可能会失败的操作,使应用程序继续执行而不用等待修正错误或者浪费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定义的信息,请注意!

更多推荐

3D模型转换工具HOOPS Exchange如何实现OBJ格式轻量化?

什么是OBJ模型轻量化?OBJ格式是一种常用的三维模型文件格式,通常包含模型的顶点、法线、纹理坐标等信息,但有时候这些信息可能会使模型文件变得较大,不利于网络传输、加载和运行。OBJ(Object)模型轻量化是指对OBJ格式的三维模型数据进行优化和压缩,以减少模型文件的大小和内存占用,同时尽量保持模型的视觉质量和几何信

浙工大MBA常规批复试建议怎么准备?

&nbsp;&nbsp;&nbsp;&nbsp;如果你第一志愿报考浙江工业大学MBA项目不想被无故的淘汰,小编建议你还是认真对待考后的复试环节。因为从2023年的招生录取可以看到,浙工大MBA项目的提前批面试对于最终录取几乎是没什么作用的,在与普通考生同层次竞争的局面下,复试谁发挥的好,分数高,谁就可以获得录取的资格。

接口自动化测试:pytest基础讲解

为什么要做接⼝测试?只靠前端测试很难确保很⾼的覆盖率。接⼝测试,可以模拟出各种类型的⼊参,包括⼀些在前端模拟不出来的⼊参,还能根据接⼝⽂档的定义,设计出相对完善的⼊参值,在接⼝层保证质量,剩余的绝⼤多数问题就是应⽤程序⾃⾝的交互和数据展⽰问题。接⼝测试相对于交互界⾯测试和功能测试来说,更容易实现⾃动化,执⾏起来⽐较稳定

数据分析的-五种常用方法实例

一、对照俗称对比,单独看一个数据是不会有感觉的,必需跟另一个数据做对比才会有感觉。比如下面的图a和图b。图a毫无感觉图b经过跟昨天的成交量对比,就会发现,今天跟昨天实则差了一大截。这是最基本的思路,也是最重要的思路。在现实中的应用非常广,比如选产品丶监控增量等,这些过程就是在做【对照】,决策BOSS们拿到数据后,如果数

websocket php教程

WebSocket是HTML5提供的一种网络通讯协议,用于服务端与客户端实时数据传输。广泛用于浏览器与服务器的实时通讯,APP与服务器的实时通讯等场景。相比传统HTTP协议请求响应式通讯,WebSocket协议可以做到实时的双向通讯,服务端可以在任何时候向客户端推送数据(HTTP协议需要客户端发起请求后才能推送)。PH

Spring高手之路14——深入浅出:SPI机制在JDK与Spring Boot中的应用

文章目录1.SPI解读:什么是SPI?2.SPI在JDK中的应用示例3.SPI在Spring框架中的应用3.1传统Spring框架中的SPI思想3.2SpringBoot中的SPI思想4.SPI在JDBC驱动加载中的应用5.如何通过SpringBoot自动配置理解SPI思想6.SPI(ServiceProviderIn

Ajax学习笔记

目录Ajax介绍Ajax概述同步异步原生Ajax演示AxiosAxios的基本使用Axios快速入门Axios请求方法别名Axios案例Ajax介绍Ajax概述我们前端页面中的数据应该来自于后台,那么我们的后台和前端是互不影响的2个程序,那么我们前端应该如何从后台获取数据呢?因为是2个程序,所以必须涉及到2个程序的交互

Golang net/http 包中的 RoundTripper 接口详解

RoundTripper是什么?RoundTripper是net/http包中的一个接口,定义了处理HTTP请求返回和响应的方法,是http.Client结构体中执行http请求的核心部分。接口定义如下:typeRoundTripperinterface{RoundTrip(*Request)(*Response,er

深入分析Spring的IoC容器:从底层源码探索

前言:博主在最近的几次面试中,大中小厂都问到了Spring的ioc容器相关问题,这块知识确实是面试中的重点内容,因此结合所看的书籍,在这篇文章中总结下。该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读,感谢大佬的关注。如果文章有什么需要改进的地方欢迎大佬提出,对大佬有帮助希望可以支持下哦~小威在此先感谢各位小伙

Flink窗口

窗口(Window)6.1.1窗口的概念Flink是一种流式计算引擎,主要是来处理无界数据流的,数据源源不断、无穷无尽。想要更加方便高效地处理无界流,一种方式就是将无限数据切割成有限的“数据块”进行处理,这就是所谓的“窗口”(Window)。注意:Flink中窗口并不是静态准备好的,而是动态创建——当有落在这个窗口区间

OpenCV自学笔记二十一:视频处理

一、VideoCapture类在OpenCV中,`VideoCapture`类提供了一系列函数来读取和控制视频流。以下是一些常用的`VideoCapture`类函数说明:1.`isOpened()`:检查视频是否成功打开。返回一个布尔值,True表示成功打开,False表示未成功打开。2.`open(filenameo

热文推荐