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

news/2024/7/10 3:05:27 标签: spring boot, java, 后端, 服务熔断, 负载均衡

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

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

相关文章

TorchLens--可视化任何PyTorch模型

0. 简介 PyTorch是一个深度学习框架&#xff0c;它使用张量&#xff08;tensor&#xff09;作为核心数据结构。在可视化PyTorch模型时&#xff0c;了解每个张量运算的意义非常重要。张量运算作为神经网络模型中的基本操作。它们用于处理输入数据、执行权重更新和生成预测结果。…

北斗基站首次在西沙海域投入使用,消除该海域信号覆盖盲区

9月15日&#xff0c;中国西沙北礁灯塔和浪花礁灯塔完成北斗船舶自动识别系统岸基基站的新建工作。两座北斗基站首次在西沙海域正式投入使用&#xff0c;解决了中国船舶自动识别岸基系统在该海域的覆盖盲区问题。 据了解&#xff0c;两座基站采用我国自主研发的北斗定位系统&…

安全基础 --- 过滤情况下实现弹窗展现

使用mafia对弹窗进行过滤 maifa (new URL(location).searchParams.get(mafia) || 11); // 使用URL对象获取当前页面的URL&#xff0c;并从中提取参数“mafia”的值&#xff0c;如果URL中无“mafia”这个参数&#xff0c;则默认设置值为11(如果参数值存在为真&#xff0c;则将…

链表的分割——哨兵位

现有一链表的头指针 ListNode* pHead&#xff0c;给一定值x&#xff0c;编写一段代码将所有小于x的结点排在其余结点之前&#xff0c;且不能改变原来的数据顺序&#xff0c;返回重新排列后的链表的头指针。 思路&#xff0c;把链表分成两个新链表&#xff0c;然后连接起来 代码…

我的安卓AOSP开发使用到的教程汇总【安卓12】

目录 投屏软件日志打印脚本 bat 【gpt生成的】摄像头定位静默安装APP系统签名多线程使用APK打包APK OTA 差分包制作服务和主线程通信代码注释模板阿里云ClassAOSP教程添加默认APN关闭双击电源键打开相机 ubuntu安装遇到的bug 投屏软件 scrcpy 【设置为系统变量后 可以投屏的情…

java图片转pdf ,pdf 导出

pom引入jar <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.0-RC2</version></dependency> 转pdf方法 /*** 使用pdfbox将jpg转成pdf** throws IOException IOException*/pu…

自身免疫疾病诊断原料厂家——博迈伦

自身免疫疾病是免疫系统异常攻击自身正常组织和器官的疾病&#xff0c;如类风湿性关节炎、系统性红斑狼疮、硬皮病等。诊断自身免疫疾病通常需要使用特定的试剂和试验方法。以下是一些常见的自身免疫疾病诊断原料厂家&#xff1a; 1. Thermo Fisher Scientific&#xff08;Invi…

快速用Python进行数据分析技巧详解

概要 一些小提示和小技巧可能是非常有用的&#xff0c;特别是在编程领域。有时候使用一点点黑客技术&#xff0c;既可以节省时间&#xff0c;还可能挽救“生命”。 一个小小的快捷方式或附加组件有时真是天赐之物&#xff0c;并且可以成为真正的生产力助推器。所以&#xff0…