【SpringCloud学习笔记】Hystrix

news2024/11/23 23:45:51

Hystrix

  • 搭建项目
  • 服务降级
  • 服务熔断
  • 请求合并
  • 如何和Feign一起使用

搭建项目

在这里插入图片描述

–|eureka-registry --注册中心
–|hystrix-service – 调用用户服务
–|user-service --用户服务

  • hystrix-service
server:
  port: 9002
spring:
  application:
    name: hystrix-service

eureka:
  instance:
    hostname: 127.0.0.1
  client:
    register-with-eureka: true #默认值是true,是否将自己注册到注册中心
    fetch-registry: true #默认值是true,是否从注册中心拉取服务
    service-url: #注册中信对外暴露的注册中心地址
      defaultZone: http://localhost:8761/eureka/
feign:
  hystrix:
    enabled: true #在Feign中开启Hystrix
  • user-service
server:
  port: 9001
spring:
  application:
    name: user-service
  datasource: # 数据源
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/springcloud?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
    username: root
    password: root

eureka:
  instance:
    hostname: 127.0.0.1
  client:
    register-with-eureka: true #默认值是true,是否将自己注册到注册中心
    fetch-registry: false # 默认值是true,是否从注册中心拉取服务
    service-url: #注册中信对外暴露的注册中心地址
      defaultZone: http://localhost:8761/eureka/

服务降级

  • 在 pom.xml 文件中引入hystrix的起步依赖
<dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
  • 在应用的启动类上使用@EnableCircuitBreaker开启hystrix的功能
@SpringBootApplication
@EnableCircuitBreaker
@MapperScan("user.service.provider.mapper")
public class UserServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserServiceApplication.class, args);
    }
}
  • 使用注解 @HystrixCommand 标记调用失败时需要熔断的方法,fallbackMethod 属性指定降级方法,注意:指定的降级方法需要和降级方法相同入参
@RestController
@RequestMapping(value = "/user")
public class UserController {

    @Autowired
    private UserMapper userMapper;
    
    /*
     * 查询所有用户信息
     * 当该方法出现异常等信息,会返回兜底数据,
     * 不会直接将错误信息返回,导致服务不可用
     */
    @GetMapping(value = "/selectUserInfo")
    @HystrixCommand(fallbackMethod = "fallbackMethod")
    public List<UserInfo> selectUserInfo() {
        //int i = 1/0;
        return userMapper.selectAll();
    }

    /**
     * 兜底数据
     */
    public List<UserInfo> fallbackMethod(){
        List<UserInfo> list = new ArrayList<>();
        UserInfo userInfo = new UserInfo();
        userInfo.setName("兜底数据");
        userInfo.setAge(20);
        userInfo.setAddress("兜底数据");
        list.add(userInfo);
        return list;
    }
 }

服务熔断

  • 服务熔断就是,当在单位时间内触发了超过N次服务降级,并且服务降级占比超过阈值之后,就会触发服务熔断。当服务过来的时候,直接拒绝尝试服务调用,直接让服务降级处理。之后再慢慢尝试恢复。就相当于家里面的电路熔断器,当电流超负荷时,熔断器就会起作用烧断保险丝,将电停掉,导致全家断点
    @HystrixCommand(fallbackMethod = "hystrixMethod",commandProperties = {
            //是否开启断路器
            @HystrixProperty(name = "circuitBreaker.enabled", value = "true"),
            //请求次数,默认20次
            @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "2"),
            //时间窗口期,默认5s
            @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "5000"),
            //失败率达到多少后跳闸,默认50%
            @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50"),
    })
    @GetMapping(value = "/selectUserInfoByName")
    public UserInfo selectUserInfoByName(@RequestParam("name") String name){
        UserInfo userInfo = userMapper.selectUserInfoByName(name);
        if (null == userInfo){
            throw new RuntimeException("用户信息为空");
        }
        return userInfo;
    }
    
    /**
     * 兜底数据
     */
    public UserInfo hystrixMethod(String name){
        UserInfo userInfo = new UserInfo();
        userInfo.setName(name + "托底用户");
        userInfo.setAge(20);
        userInfo.setAddress("杭州市");
        return userInfo;
    }

请求合并

  • 请求合并:是将在指定的时间内的请求或者是指定时间内请求达到设置值,将多次请求合并为一次请求
    @HystrixCollapser(
            batchMethod = "selectUserByListId",
            scope = com.netflix.hystrix.HystrixCollapser.Scope.GLOBAL,
            collapserProperties = {
                    //隔离多久会进行请求合并,默认10ms
                    @HystrixProperty(name = "timerDelayInMilliseconds", value = "5000"),
                    //最大请求条数
                    @HystrixProperty(name = "maxRequestsInBatch", value = "2")
            })
    @GetMapping(value = "/selectUserInfoById")
    public UserInfo selectUserInfoById(@RequestParam("id") Integer id) {
        return userMapper.selectUserInfoById(id);
    }

    /**
     * 处理合并后的请求方法
     */
    @HystrixCommand
    public List<UserInfo> selectUserByListId(List<Integer> ids) {
        System.out.println("请求合并入参:" + ids);
        ArrayList<UserInfo> list = new ArrayList<>();
        for (Integer id : ids) {
            UserInfo userInfo = userMapper.selectUserInfoById(id);
            list.add(userInfo);
        }
        System.out.println("请求合并处理结果:" + list);
        return list;
    }

在这里插入图片描述

如何和Feign一起使用

  • 上面的例子中,都是在服务端做的,消费者是通过feign远程调用,那如何实现,首先需要在配置文件中开启,hystrix-service模块的配置文件
feign:
  hystrix:
    enabled: true #在Feign中开启Hystrix
  • Feign的远程调用接口,就是调用user-service服务
@FeignClient(name = "user-service", fallback = UserFallBackService.class)
public interface UserServiceApi {

    @GetMapping(value = "user/selectUserInfo")
    List<UserInfo> selectUserInfo();

    @GetMapping(value = "user/selectUserInfoByName")
    UserInfo selectUserInfoByName(@RequestParam("name") String name);

    @GetMapping(value = "user/selectUserInfoById")
    UserInfo selectUserInfoById(@RequestParam("id") Integer id);
}
  • 针对Feign接口,需要写一个实现类,上面feignClient注解中的fallback对应的就是该实现类
@Component
public class UserFallBackService implements UserServiceApi{

    @Override
    public List<UserInfo> selectUserInfo() {
        ArrayList<UserInfo> userInfos = new ArrayList<>();
        UserInfo userInfo = new UserInfo();
        userInfo.setName("托底用户");
        userInfo.setAge(20);
        userInfo.setAddress("杭州市");
        userInfos.add(userInfo);
        return userInfos;
    }

    @Override
    public UserInfo selectUserInfoByName(String name) {
        UserInfo userInfo = new UserInfo();
        userInfo.setName(name + "托底用户");
        userInfo.setAge(20);
        userInfo.setAddress("杭州市");
        return userInfo;
    }

    @Override
    public UserInfo selectUserInfoById(Integer id) {
        UserInfo userInfo = new UserInfo();
        userInfo.setName("托底用户");
        userInfo.setAge(20);
        userInfo.setAddress("杭州市");
        return userInfo;
    }

在这里插入图片描述

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

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

相关文章

jsp+ssm计算机毕业设计多功能电子词典【附源码】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JSPSSM mybatis Maven等等组成&#xff0c;B/S模式 Mave…

机器人开发--接近开关

机器人开发--接近开关1 概述1.1 定义1.2 分类2 各类介绍2.1 无源接近开关2.2 涡流式接近开关2.3 电容式接近开关2.4 霍尔接近开关2.5 光电式接近开关2.5.1 漫反射式光电开关2.5.2 镜反射式光电开关2.5.3 对射式光电开关2.6 其它型式参考1 概述 1.1 定义 接近开关是一种无需与…

ANTLR4入门(三):使用mave ANTLR4插件(antlr4-maven-plugin)执行语法解析生成器

在上篇博客《ANTLR4入门(二):图示说明eclipse安装Antlr4IDE插件的过程》&#xff0c;我费半天劲装好了Eclise的AntlrIDE插件&#xff0c;简单的创建一个ANTLR 4 工程&#xff0c;感受了一下AntlrIDE插件提供的语法高亮的便利性。及语法文件(.g4)自动生成解析器代码的过程 然而…

1557:祖孙询问——倍增求LCA

【题目描述】 已知一棵 n 个节点的有根树。有 m 个询问&#xff0c;每个询问给出了一对节点的编号 x 和 y&#xff0c;询问 x 与 y 的祖孙关系。 【输入】 输入第一行包括一个整数 n 表示节点个数&#xff1b; 接下来 n 行每行一对整数对 a 和 b 表示 a 和 b 之间有连边。如果…

Lattice Diamond关于原语的使用

Lattice Diamond关于原语的使用前言一、原语基本概念&#xff08;一&#xff09;简介&#xff08;二&#xff09;常用原语1.时钟相关原语2.差分输入/输出原语3.接口相关原语二、Lattice原语&#xff08;一&#xff09;原语使用&#xff08;二&#xff09;IP调用&#xff08;三&…

线性代数中的特征值和特征向量

一.几个基本概念 现将下文需要运用到的一些概念进行解释说明以便读者更好理解 1.特征值与特征向量 其中&#xff0c;我们要注意两点&#xff1a; &#xff08;1&#xff09;A是方阵&#xff08;对于非方阵&#xff0c;是没有特征值的&#xff0c;但会有条件数&#xff09; …

基于LMS算法的Mackey Glass时间序列预测(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 时间序列预测方法是科学、经济、工程等领域的研究重点之一。经典的时间序列预测方法在用于非线性系统预测时有一定的困难,而神…

论文投稿指南——中文核心期刊推荐(物理学2)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

【论文精度】Subdivision-Based Mesh Convolution Networks

0.摘要 卷积神经网络( CNNs )在二维计算机视觉领域取得了巨大的突破。然而&#xff0c;其不规则的结构使得直接在网格上利用卷积神经网络的潜力变得困难。细分曲面提供了层次化的多分辨率结构&#xff0c;其中一个封闭的二维流形三角网格中的每个面恰好与三个面相邻。受这两点…

2022中国企业家博鳌论坛耿明雨致白皮书

海南.博鳌于2022年11月25日至28日&#xff0c;为期三天&#xff0c;中国企业家论坛准时开幕。 此次论坛主旨以“奋进新征程 建功新时代”为主题&#xff0c;来自全国知名企业家、媒体同仁、国内权威央媒、党媒云集于此&#xff0c;在全媒体融合时代下&#xff0c;以新华社、半月…

基于python命令流及代码的Plaxis自动化建模与典型案例

有限单元法在岩土工程问题中应用非常广泛&#xff0c;很多商业软件如Plaxis/Abaqus/Comsol等都采用有限单元解法。在使用各大软件进行数值模拟建模的过程中&#xff0c;您是否发现GUI界面中重复性的点击输入工作太繁琐&#xff1f;从而拖慢了设计或方案必选进程&#xff1f; 主…

电脑无法打开相机照片怎么解决?

相机拍照后的照片&#xff0c;大部分人把照片保存在电脑上&#xff0c;这样就可以把相机的内存卡腾空出来进行新的一轮拍摄。最近有新朋友询问如果电脑上的照片打不开怎么办&#xff1f; 首先我们要了解什么情况下电脑的照片会打不开&#xff0c;原因可能有以下几种&#xff1…

YOLO v2

参考 YOLO v2 - 云社区 - 腾讯云 摘要 我们引入了YOLO9000&#xff0c;一个最先进的&#xff0c;实时的物体检测系统&#xff0c;可以检测超过9000个物体类别。首先&#xff0c;我们提出了YOLO检测方法的各种改进&#xff0c;既有新颖的&#xff0c;也有来自之前工作的。改进…

R语言中敏感性和特异性、召回率和精确度作为选型标准的华夫图案例

精度和查全率源自信息检索&#xff0c;但也用于机器学习设置中。但是&#xff0c;在某些情况下&#xff0c;使用精度和查全率可能会出现问题。在这篇文章中&#xff0c;我将讨论召回率和精确度的缺点&#xff0c;并说明为什么敏感性和特异性通常更有用。 定义 对于类别0和1的…

新中式穿搭:柯罗芭KLOVA传承极致东方美

随着欧美风和日韩风的穿搭流行&#xff0c;如今在中国的大地再次刮起了一股复古风潮&#xff0c;而作为千年文化的沉淀&#xff0c;新中式风格的穿搭更加注重独特意义上的风格体现&#xff0c;通过传统服饰和新式的现代裁剪&#xff0c;款式的组合&#xff0c;符合现代人的一种…

【HBU】2022秋线上作业——第六次——查找排序选择判断

目录 判断题&#x1f496; 1-1 希尔排序是稳定的算法。F 1-2 在散列表中&#xff0c;所谓同义词就是具有相同散列地址的两个元素。 T 1-3 对AVL树中的任一结点&#xff0c;其左、右子树的高度一定是一样的。 F 1-4 任何最小堆中从根结点到任一叶结点路径上的所有结点是有…

期末前端web大作业——基于HTML当当图书网项目的设计与实现 网上书城 网上书店 在线书店网页

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

再来一弹 | 美格智能强化5G阵营,推出国产芯Mini PCIe封装5G模组SRM810

近年来&#xff0c;我国在政策上加强顶层设计&#xff0c;根植移动物联网发展沃土&#xff0c;在技术上加快5G基础设施建设、深化4G网络应用&#xff0c;建立了以5G为核心、4G LTE Cat.1/NB-IoT等协同发展的移动物联网综合生态体系&#xff0c;全面开启了“物超人”时代新纪元。…

Linux搭建ELK日志收集系统构建:Filebeat+Redis+Logstash+Elasticse

Linux搭建ELK日志收集系统构建&#xff1a;FilebeatRedisLogstashElasticse 一、ELK概述&#xff1a; ELK是一组开源软件的简称&#xff0c;其包括Elasticsearch、Logstash 和 Kibana。ELK最近几年发展迅速&#xff0c;已经成为目前最流行的集中式日志解决方案。 Elasticsea…

Git和Github

一、Git和Github概念 Git是本地电脑上运行的版本控制软件&#xff0c;Github是基于Git打造的版本控制网站&#xff0c;可以理解为是一个全球网站仓库。Git是由Linux开发的 Github由于是网站所有具有网站的属性&#xff0c;同时也具有版本控制的属性。Github有三个概念&#x…