热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

08SpringCloud之Hystrix

什么是HystrixHystrix即:服务熔断器,是用来处理分布式系统的延迟和容错的开源库。在分布式系统中,服务之间的调用会不可避免的调用失败,如超时、异常等,Hystrix是用来

什么是 Hystrix



  • Hystrix 即:服务熔断器,是用来处理分布式系统的延迟和容错的开源库。

  • 在分布式系统中,服务之间的调用会不可避免的调用失败,如超时、异常等,Hystrix 是用来保证在一个依赖出现问题时,不会导致整体服务的失败,避免级联故障的发生,从而提高分布式系统的弹性。


熔断机制



  • 熔断机制是对应雪崩效应的一种微服务的链路保护机制

  • 当某个服务发生故障,对该服务的请求就会出现失败、超时等问题,此时系统自动开启熔断器,之后此服务不再提供任何业务操作,所有对该服务的请求都会快速失败,直接返回失败信息;这样的话依赖于该服务的其他服务就不会因为得不到回应而造成线程阻塞,从而避免级联故障。


服务熔断与服务降级



  • 服务熔断发生在服务端,就是事先为服务端的方法提供一个备选方案,当该方法出现异常的时候,备选方案自动顶替上去,备选方案返回值与原方法返回值一致,这样就不会导致整个系统奔溃

  • 服务降级发生在客户端,如双 11、618 等大型电商活动期间,导致后端服务器压力剧增,此时可以根据具体业务及流量情况,选择性的关闭一些与活动期间无关的非核心业务,从而释放更多的资源来保证核心业务的正常运作;服务关闭后,客户端将不再进行服务调用而直接返回缺省值


Hystrix 服务熔断配置

服务熔断发生在服务端,重点配置 Provider



  1. Provider 的 pom 中添加依赖



    pom.xml



    org.springframework.cloud
    spring-cloud-starter-hystrix




  2. Provider 新建 Controller 定义常规方法并通过 @HystrixCommand 注解为其配置熔断回调方法



    DeptHystrixController

    package com.kaishen.controller;
    import com.kaishen.pojo.Dept;
    import com.kaishen.service.DeptService;
    import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RestController;
    import javax.annotation.Resource;
    /**
    * 部门服务 Hystrix 控制层
    * @author : toby
    * Create in 13:38 2022/5/9
    */
    @RestController
    @Slf4j
    public class DeptHystrixController {
    @Resource
    private DeptService deptService;
    /**
    * 根据部门编号查询部门信息
    * @param id 部门编号
    * @return 返回部门信息
    */
    @GetMapping("/hystrix/dept/get/{id}")
    @HystrixCommand(fallbackMethod = "hystrixQueryDeptById")
    public Dept fusingQueryDeptById(@PathVariable Long id) {
    // 调用查询方法
    Dept dept = deptService.queryDeptById(id);
    log.info("hystrix 查询结果:" + dept);
    if (null == dept) {
    throw new RuntimeException("查询异常");
    }
    return dept;
    }
    /**
    * 部门查询熔断方法
    * @param id 部门编号
    * @return 返回构建的部门实体
    */
    @SuppressWarnings("unused")
    public Dept hystrixQueryDeptById(@PathVariable Long id) {
    return new Dept().setDeptNo(id)
    .setDeptName("根据 id = " + id + " 查不到对应的部门信息,此处返回熔断信息")
    .setDbSource("没有数据来源");
    }
    }



  3. 启动类开启熔断器 @EnableCircuitBreaker



  4. Consumer 中通过 Feign 正常调用即可




Hystrix 服务降级配置

服务降级发生在客户端,重点配置 Consumer



  1. Consumer 端新增接口



    DeptHystrixDemotionService

    package com.kaishen.feign.service;
    import com.kaishen.pojo.Dept;
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.stereotype.Component;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    /**
    * 支持服务降级的接口
    * @author : toby
    * Create in 16:52 2022/5/9
    */
    @Component
    @FeignClient(value = "SPRING-CLOUD-PROVIDER-DEPT", cOntextId= "3", fallbackFactory = DeptHystrixDemotionServiceFallbackFactory.class)
    public interface DeptHystrixDemotionService {
    /**
    * 根据部门编号查询部门信息
    * -- 支持服务降级
    * -- application.yml 中开启服务降级后不会再去访问后端系统,此处测试降级功能省略后端方法
    * @param id 部门编号
    * @return 返回部门信息
    */
    @GetMapping("/demotion/dept/get/{id}")
    Dept demotionQueryDeptById(@PathVariable("id") Long id);
    /**
    * 说 Hello
    * -- 定义多个方法,以供回调工厂处理
    */
    @GetMapping("demotion/hello")
    void sayHello();
    }



  2. 自定义工厂类,实现 FallbackFactory 接口,将新建的接口作为泛型传入,重写 create 方法



    DeptHystrixDemotionServiceFallbackFactory

    package com.kaishen.feign.service;
    import com.kaishen.pojo.Dept;
    import feign.hystrix.FallbackFactory;
    import org.springframework.stereotype.Component;
    /**
    * 支持服务降级的回调工厂
    * @author : toby
    * Create in 16:57 2022/5/9
    */
    @Component
    public class DeptHystrixDemotionServiceFallbackFactory implements FallbackFactory {
    @Override
    public DeptHystrixDemotionService create(Throwable cause) {
    return new DeptHystrixDemotionService() {
    @Override
    public Dept demotionQueryDeptById(Long id) {
    return new Dept().setDeptNo(id)
    .setDeptName("洪峰期,暂不提供此服务")
    .setDbSource("没有数据来源");
    }
    @Override
    public void sayHello() {
    System.out.println("秒杀时刻,服务降级,暂不提供此服务");
    }
    };
    }
    }



  3. 在新增的接口中开启 Feign 注解,并通过 fallbackFactory 属性指向降级回调工厂 @FeignClient(value = "SPRING-CLOUD-PROVIDER-DEPT", cOntextId= "3", fallbackFactory = DeptHystrixDemotionServiceFallbackFactory.class)



  4. application.yml 中开启降级



    application.yml

    # Feign 配置
    feign:
    hystrix:
    enabled: true # 开启服务降级




Hystrix Dashboard



  1. 新建 Module:spring-cloud-dashboard-9001



  2. 编写 pom 引入依赖



    pom.xml



    spring-cloud-netflix
    com.kaishen
    1.0-SNAPSHOT

    4.0.0
    spring-cloud-dashboard-9001


    8
    8





    org.springframework.cloud
    spring-cloud-starter-hystrix-dashboard






  3. 编写 application.yml



    application.yml

    server:
    port: 9001
    # Spring 配置
    spring:
    application:
    name: spring-cloud-dashboard9001
    # Dashboard 配置
    hystrix:
    dashboard:
    proxy-stream-allow-list: "*" # 允许代理的主机列表



  4. 编写启动类,开启注解



    DashboardApplication9001

    package com.kaishen;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
    /**
    * 监控服务启动类
    * @author : toby
    * Create in 19:24 2022/5/9
    */
    @SpringBootApplication
    @EnableHystrixDashboard
    public class DashboardApplication9001 {
    public static void main(String[] args) {
    SpringApplication.run(DashboardApplication9001.class, args);
    }
    }



  5. 启动 Dashboard 可看到如下界面,则 Dashboard 配置成功

    Dashboard



  6. 被监控的服务中需要引入 actuator 及 Hystrix 依赖



    pom.xml



    org.springframework.boot
    spring-boot-starter-actuator


    org.springframework.cloud
    spring-cloud-starter-hystrix




  7. 被监控服务的启动类中添加 hystrixMetricsStreamServlet,并开启 @EnableHystrix 注解



    DeptHystrixProviderApplication8004

    package com.kaishen;
    import com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.web.servlet.ServletRegistrationBean;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    import org.springframework.cloud.netflix.hystrix.EnableHystrix;
    import org.springframework.context.annotation.Bean;
    /**
    * 部门服务提供者启动类
    * @author : toby
    * Create in 10:56 2022/5/10
    */
    @SpringBootApplication
    @EnableEurekaClient
    @EnableHystrix
    public class DeptHystrixProviderApplication8004 {
    public static void main(String[] args) {
    SpringApplication.run(DeptHystrixProviderApplication8004.class, args);
    }
    /**
    * 注册监控页面
    * @return hystrixMetricsStreamServletServletRegistrationBean
    */
    @Bean
    public ServletRegistrationBean hystrixMetricsStreamServlet() {
    ServletRegistrationBean hystrixMetricsStreamServletServletRegistratiOnBean= new ServletRegistrationBean<>(new HystrixMetricsStreamServlet());
    hystrixMetricsStreamServletServletRegistrationBean.addUrlMappings("/actuator/hystrix.stream");
    return hystrixMetricsStreamServletServletRegistrationBean;
    }
    }

    注意注意注意



    • 被监控服务 Controller 中的所有方法都必须要有 @HystrixCommand() 熔断实现,否则 Dashboard 无法正常显示

    • 先对被监控服务进行一次正常访问如:http://localhost:8004/hystrix/dept/get/1



  8. 被监控服务的 Controller



    DeptHystrixController

    package com.kaishen.controller;
    import com.kaishen.pojo.Dept;
    import com.kaishen.service.DeptService;
    import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RestController;
    import javax.annotation.Resource;
    /**
    * 部门服务 Hystrix 控制层
    * @author : toby
    * Create in 13:40 2022/5/9
    */
    @RestController
    @Slf4j
    public class DeptHystrixController {
    @Resource
    private DeptService deptService;
    // region fusingQueryDeptById
    /**
    * 根据部门编号查询部门信息
    * @param id 部门编号
    * @return 返回部门信息
    */
    @GetMapping("/hystrix/dept/get/{id}")
    @HystrixCommand(fallbackMethod = "hystrixQueryDeptById")
    public Dept fusingQueryDeptById(@PathVariable Long id) {
    // 调用查询方法
    Dept dept = deptService.queryDeptById(id);
    log.info("hystrix 查询结果:" + dept);
    if (null == dept) {
    throw new RuntimeException("查询异常");
    }
    return dept;
    }
    /**
    * 部门查询熔断方法
    * @param id 部门编号
    * @return 返回构建的部门实体
    */
    @SuppressWarnings("unused")
    public Dept hystrixQueryDeptById(@PathVariable Long id) {
    return new Dept().setDeptNo(id)
    .setDeptName("根据 id = " + id + " 查不到对应的部门信息,此处返回熔断信息")
    .setDbSource("没有数据来源");
    }
    // endregion
    // region sayHello
    /**
    * 说 Hello
    * 此方法无意义,只用于定义多个方法供回调工厂处理
    * @param id 入参
    * @return 返回字符串
    */
    @GetMapping("/hystrix/dept/get/map/{id}")
    @HystrixCommand(fallbackMethod = "toSayHello")
    public String sayHello(@PathVariable Long id) {
    int i = 2;
    if (id == i) {
    throw new RuntimeException("报错啦");
    }
    System.out.println("Hello");
    return "Hello";
    }
    @SuppressWarnings("unused")
    public String toSayHello(@PathVariable Long id) {
    System.out.println(id);
    return "toSayHello";
    }
    // endregion
    }



  9. 在 Dashboard 界面,填写要被监控的流信息,如下图

    Dashboard



  10. 进入后即可看到监控页面

    监控页面





推荐阅读
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • Ceph API微服务实现RBD块设备的高效创建与安全删除
    本文旨在实现Ceph块存储中RBD块设备的高效创建与安全删除功能。开发环境为CentOS 7,使用 IntelliJ IDEA 进行开发。首先介绍了 librbd 的基本概念及其在 Ceph 中的作用,随后详细描述了项目 Gradle 配置的优化过程,确保了开发环境的稳定性和兼容性。通过这一系列步骤,我们成功实现了 RBD 块设备的快速创建与安全删除,提升了系统的整体性能和可靠性。 ... [详细]
  • Spring Boot 中配置全局文件上传路径并实现文件上传功能
    本文介绍如何在 Spring Boot 项目中配置全局文件上传路径,并通过读取配置项实现文件上传功能。通过这种方式,可以更好地管理和维护文件路径。 ... [详细]
  • 本教程详细介绍了如何使用 Spring Boot 创建一个简单的 Hello World 应用程序。适合初学者快速上手。 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 在Java分层设计模式中,典型的三层架构(3-tier application)将业务应用细分为表现层(UI)、业务逻辑层(BLL)和数据访问层(DAL)。这种分层结构不仅有助于提高代码的可维护性和可扩展性,还能有效分离关注点,使各层职责更加明确。通过合理的设计和实现,三层架构能够显著提升系统的整体性能和稳定性。 ... [详细]
  • Java测试服务器调试指南详细介绍了如何进行远程调试,并深入解析了Java Xdebug参数的使用方法。本文首先概述了Java内置的调试功能,重点介绍了JDB这一类似于GDB的强大调试工具。通过实例演示,读者可以掌握在测试环境中高效调试Java应用程序的技巧,包括配置远程调试环境和优化调试参数,以提高开发效率和代码质量。 ... [详细]
  • Spring框架的核心组件与架构解析 ... [详细]
  • 本文探讨了如何通过检测浏览器类型来动态加载特定的npm包,从而优化前端性能。具体而言,仅在用户使用Edge浏览器时加载相关包,以提升页面加载速度和整体用户体验。此外,文章还介绍了实现这一目标的技术细节和最佳实践,包括使用User-Agent字符串进行浏览器识别、条件加载策略以及性能监控方法。 ... [详细]
  • 近年来,BPM(业务流程管理)系统在国内市场逐渐普及,多家厂商在这一领域崭露头角。本文将对当前主要的BPM厂商进行概述,并分析其各自的优势。目前,市场上较为成熟的BPM产品主要分为两类:一类是综合型厂商,如IBM和SAP,这些企业在整体解决方案方面具有明显优势;另一类则是专注于BPM领域的专业厂商,它们在特定行业或应用场景中表现出色。通过对比分析,本文旨在为企业选择合适的BPM系统提供参考。 ... [详细]
  • 如何使用 net.sf.extjwnl.data.Word 类及其代码示例详解 ... [详细]
  • 本文推荐了六款高效的Java Web应用开发工具,并详细介绍了它们的实用功能。其中,分布式敏捷开发系统架构“zheng”项目,基于Spring、Spring MVC和MyBatis技术栈,提供了完整的分布式敏捷开发解决方案,支持快速构建高性能的企业级应用。此外,该工具还集成了多种中间件和服务,进一步提升了开发效率和系统的可维护性。 ... [详细]
  • Spring Boot 实战(一):基础的CRUD操作详解
    在《Spring Boot 实战(一)》中,详细介绍了基础的CRUD操作,涵盖创建、读取、更新和删除等核心功能,适合初学者快速掌握Spring Boot框架的应用开发技巧。 ... [详细]
author-avatar
Echocc07
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有