Hystrix 请求合并、请求隔离、优化

news2025/7/17 7:54:07

文章目录

  • 请求合并
    • 引入依赖
    • 启动类 加注解@EnableHystrix
    • service服务
    • 测试
  • 请求隔离
    • 线程池隔离(大部分情况下)
    • 信号量隔离
  • 线程池隔离演示
    • 引入依赖
    • 启动类 加注解@EnableHystrix
    • service服务
    • 测试
  • 信号量隔离演示
  • Hystrix的其他用法

请求合并

引入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    <version>2.2.7.RELEASE</version>
</dependency>

<!-- lombok-->
<dependency>
   <groupId>org.projectlombok</groupId>
   <artifactId>lombok</artifactId>
</dependency>

启动类 加注解@EnableHystrix

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;

@SpringBootApplication
@EnableHystrix
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run (DemoApplication.class, args);
    }

}

service服务

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCollapser;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.concurrent.Future;
import java.util.stream.Collectors;

@Component
@Slf4j
public class TestServcie {
    @HystrixCollapser(batchMethod = "getUserByIdBatch", //合并 请求方法
            scope = com.netflix.hystrix.HystrixCollapser.Scope.GLOBAL,//请求 方式
            collapserProperties = {
                    // 间隔多久的请求会进行合并,默认是 10ms (时间限制)
                    @HystrixProperty(name = "timerDelayInMilliseconds", value = "15"),
                    // 批处理之前,批处理中允许的最 大请求数 (数量限制)
                    @HystrixProperty(name = "maxRequestsInBatch", value = "200"),
                    @HystrixProperty(name = "requestCache.enabled", value = "true")
            }
    )
    // 处理请求合并的方法一定 要支持异步!!,返回值必须是 Future<T>
    // 指出 方法的返回值,参数
    public Future<User> getUserById(Long id) {
        log.info ("------selectProductByIdReturnFuture------");
        return null;
    }


    /**
     * 因为是 合并请求,所以 返回值是 之前返回值的集合,参数 也是之前参数的的集合
     */
    // 声明 请求合并的方法
    @HystrixCommand
    public List<User> getUserByIdBatch(List<Long> ids) {
        log.info ("=====batch start ====");
        // TODO 对这些数据 批量处理!!
        List<User> users = ids.stream ().map (
                x -> {
                    User user = new User ();
                    user.setId (x);
                    user.setName ("name :" + x);
                    return user;
                }

        ).collect (Collectors.toList ());
        log.info ("=====batch end ,handle {} 条 request====", ids.size ());
        return users;
    }
}


测试

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

@RestController
@Slf4j
public class RetryController {

    @Resource
    private TestServcie testServcie;

    @GetMapping("/test")
    public String getUser(long id) throws ExecutionException, InterruptedException {
        Future<User> f = testServcie.getUserById (id);
        System.out.println (f.get ());
        return "success";
    }

}


@Data
class User {
    private long id;
    private String name;

}

结果:

在这里插入图片描述

请求隔离

线程池隔离(大部分情况下)

之前请求缓存的例子中,并发的请求一个接口时,造成另一个接口耗时也增多,当时我们使用的缓存解决,还可以使用线程池隔离方式解决
在这里插入图片描述
而增加了隔离以后,两个接口隔离,即每个隔离粒度都是个线程池,互不干扰,异步方式提高了并发的性能
在这里插入图片描述
这种方式线程每次创建销毁切换等等都需要消耗CPU的性能,如果要隔离的实例太多了,成百上千个,也不推荐使用这种情况

信号量隔离

同步方式,阻塞我们 请求方的线程有一个信号量的概念,其实就是个计数器,当请求来的时候先拿到信号量,再执行,执行完释放

当信号量消耗完时其他的线程就阻塞等待或者快速释放
在这里插入图片描述
同步方式,不支持超时,无法用于网络。比如 系统内部的逻辑处理时可以使用

线程池隔离演示

引入依赖

<!--  hystrix   -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    <version>2.2.7.RELEASE</version>
</dependency>

<!-- lombok-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

启动类 加注解@EnableHystrix

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;

@SpringBootApplication
@EnableHystrix
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run (DemoApplication.class, args);
    }

}

service服务

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

@Component
@Slf4j
public class TestServcie {
    // 声明需要服务容错的方法
    // 线程池隔离
    @HystrixCommand(
            commandKey = "getProductList",//接口名称,默认方法名
            threadPoolKey = "order-testServcie-Pool",//线程池名称,相同名称使用同一个线程池
            commandProperties = {
                    // 隔离策略
                    @HystrixProperty(name = "execution.isolation.strategy", value = "THREAD"),
                    //超时时间,默认1000ms, 超时 就走fallbackMethod 降级
                    @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "200")
            },
            threadPoolProperties = {

                    // 线程池核心线程大小
                    @HystrixProperty(name = "coreSize", value = "3"),
                    // 队列 等待阈值(最大队列长度,默认-1)
                    @HystrixProperty(name = "maxQueueSize", value = "10"),
                    // 线程存活时间,默认 1min
                    @HystrixProperty(name = "keepAliveTimeMinutes", value = "2"),
                    // 超出队列 等待阈值 执行拒绝策略!!
                    @HystrixProperty(name = "queueSizeRejectionThreshold", value = "10"),

            }, fallbackMethod = "fallbackMtd"
    )
    public String getProductList() {
        log.info (Thread.currentThread ().getName () + "---getProductList----");

        return "success";
    }

    /**
     * 超出队列等待阈值执行方法
     **/
    private String fallbackMtd() {
        log.info (Thread.currentThread ().getName () + "---降级sorry, the request is timeout----");
        return "降级sorry, the request is timeout";
    }


}

测试

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController
@Slf4j
public class RetryController {

    @Resource
    private TestServcie testServcie;

    @GetMapping("/test")
    public String getUser() {
        return testServcie.getProductList ();
    }

}

结果:

在这里插入图片描述

信号量隔离演示

其他不变 修改TestServcie

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import com.netflix.hystrix.contrib.javanica.conf.HystrixPropertiesManager;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

@Component
@Slf4j
public class TestServcie {
    //信号量隔离
    @HystrixCommand(commandProperties = {
            //超时时间,默认1000ms
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "200"),
            //信号量隔离
            @HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_STRATEGY, value = "SEMAPHORE"),
            //信号量最大并发,调小一点方便模拟高并发
            @HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_SEMAPHORE_MAX_CONCURRENT_REQUESTS, value = "6")
    }, fallbackMethod = "fallbackMtd")
    public String getProductList() {
        log.info (Thread.currentThread ().getName () + "---getProductList----");

        return "success";
    }

    /**
     * 超出队列等待阈值执行方法
     **/
    private String fallbackMtd() {
        log.info (Thread.currentThread ().getName () + "---降级sorry, the request is timeout----");
        return "降级sorry, the request is timeout";
    }


}

结果:

在这里插入图片描述

Hystrix的其他用法

SpringCloud优化记录

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

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

相关文章

linux文件的隐藏属性

1.查看隐藏属性 lsattr 查看文件隐藏属性 lsattr -d 查看目录隐藏属性 lsattr -a 显示隐藏文件隐藏属性 lsattr -R 连同子目录的数据也一并列出来 2.修改隐藏属性 chattr 修改隐藏属性 属性A &#xff1a;当设定了 A 这个属性时&#xff0c;若你有存取此文件(或目录)时&a…

ACM-BCB2019 | SMILES-BERT:基于大规模无监督预训练的分子属性预测模型

原文标题&#xff1a;SMILES-BERT: Large Scale Unsupervised Pre-Training for Molecular Property Prediction 链接&#xff1a;https://doi.org/10.1145/3307339.3342186 一、问题提出 分子指纹&#xff1a;可用于分子性质分类、回归或生成新分子等各种应用。传统的分子指纹…

【强化学习论文合集】IJCAI-2022 强化学习论文 | 2022年合集(五)

强化学习(Reinforcement Learning, RL),又称再励学习、评价学习或增强学习,是机器学习的范式和方法论之一,用于描述和解决智能体(agent)在与环境的交互过程中通过学习策略以达成回报最大化或实现特定目标的问题。 本专栏整理了近几年国际顶级会议中,涉及强化学习(Rein…

设计模式之美——单一职责原则和开闭原则

“看懂”和“会用”是两回事&#xff0c;而“用好”更是难上加难。 SOLID 原则&#xff1a; SRP单一职责原则&#xff08;the single responsibility principle &#xff09; OCP开闭原则&#xff08;the open closed principle&#xff09; LSP里氏替换原则&#xff08;the l…

【HMS Core】School Diary应用集成多个HMS Core服务,更好的体验华为生态系统

一、介绍 总览 通过建立本次的School Diary应用&#xff0c;您可以更好地体验华为生态系统的组成部分&#xff0c;包括认证服务、云存储和云数据库等Serverless服务。此外您还可以了解到如何使用账号服务集成应用登录功能。老师和学生两种角色的匹配过程是本应用的一大特色。…

SpringCloud微服务(九)——Ribbon负载均衡

Ribbon负载均衡服务调用 SpringCloud 已停更 github官网&#xff1a;https://github.com/netflix/ribbon Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具&#xff0c;它基于Netflix Ribbon实现。通过Spring Cloud的封装&#xff0c;可以让我们轻松地将面向服务…

高斯分布的乘积与卷积

高斯分布是一个很重要的连续分布形式&#xff0c;频繁出现各种应用场景里也可以导出很多分布&#xff0c;如在典型的线性回归中对误差 的建模就是用的标准正态分布&#xff0c;统计学的学生分布就是从正态分布中导出。随着贝叶斯统计学的广泛应用&#xff0c;相乘的高斯分布&am…

【仿真建模】第四课:AnyLogic入门基础课程 - 轨道交通仿真入门讲解

文章目录一、轨道库的概念和特点二、轨道交通仿真三、更换车头和车身样式一、轨道库的概念和特点 二、轨道交通仿真 新建模型 搭建轨道 定义轨道上的起点和终点 拖拽出一个trainSource&#xff0c;设置其车厢数量为4&#xff08;默认为11&#xff0c;车厢太多会超出轨道&…

nginx(六十)proxy模块(一)proxy_pass指令

一 proxy模块处理请求的流程 ① 流程图 说明&#xff1a; nginx从client接收的是http协议,转发给上游的也是http协议备注&#xff1a; 后续根据处理请求的流程,来讲解相关指令 二 proxy_pass ① 基本解读 说明&#xff1a; proxy_pass是一个动作指令 ② proxy_pass的…

【题型总结】找到第n个自定义数 | 丑数系列 + 神奇数字

文章目录找到第n个自定义数丑数【LC263】丑数Ⅱ【LC264】优先队列多指针超级丑数【LC313】优先队列【超时】多指针第N个神奇数字【LC878】找规律二分查找数学丑数Ⅲ【LC1201】二分查找数学总结找到第n个自定义数 因为神奇数字做了相关的题目&#xff0c;个人建议做题顺序&…

涨知识!Python 的异常信息还能这样展现

【导语】&#xff1a;在日常开发的过程中&#xff0c;当代码报错时&#xff0c;我们通常要不断打印、阅读traceback提示信息&#xff0c;来调试代码&#xff0c;这篇文章介绍了如何实现一个Exception Hooks&#xff0c;使得traceback模块的提示信息更加精确&#xff1b;同时还介…

java项目-第159期ssm超市管理系统_ssm毕业设计_计算机毕业设计

java项目-第159期ssm超市管理系统-ssm毕业设计_计算机毕业设计 【源码请到资源专栏下载】 今天分享的项目是《ssm超市管理系统》 该项目分为2个角色&#xff0c;管理员、员工。 员工登录后台主要负责商品的出入库&#xff0c;以及个人事项办理&#xff0c;比如&#xff1a; 上…

技术分享| 快对讲视频调度功能说明

随着计算机技术的日趋成熟&#xff0c;融合调度方案已经在行业信息化中普及&#xff0c;由于近几年实时音视频能力的提升&#xff0c;融合调度中的视频调度方案也在往实时性、高清方向靠拢。快对讲视频调度正是结合了视频监控&#xff0c;以及实时通信的特性&#xff0c;在市面…

传奇GOM引擎单机架设图文教程

T:准备下载好服务端&#xff08;版本&#xff09;gom引擎架设 选择GOM引擎版本 注;版本可以去论坛有免费&#xff0c;电脑还需要下载安装好客户端。 1.首先下载好版本后会有2个压缩包&#xff0c;一个是版本&#xff0c;一个是补丁&#xff0c; 简单来说架设分三部&#xff1…

Scrum 四个会议的正确召开方式

敏捷开发有一些重要的实践方法&#xff0c;可以帮助团队更快地适应敏捷开发框架。这些方法不能简单照搬执行&#xff0c;比如&#xff0c;只在瀑布开发模式下中加入 Scrum 的四个会议&#xff0c;这无法让瀑布团队转成敏捷团队。敏捷转型需要深入理解概念和思维&#xff0c;团队…

【Linux】第十四章 多线程(生产者消费者模型+POSIX信号量)

&#x1f3c6;个人主页&#xff1a;企鹅不叫的博客 ​ &#x1f308;专栏 C语言初阶和进阶C项目Leetcode刷题初阶数据结构与算法C初阶和进阶《深入理解计算机操作系统》《高质量C/C编程》Linux ⭐️ 博主码云gitee链接&#xff1a;代码仓库地址 ⚡若有帮助可以【关注点赞收藏】…

JavaSE中split方法详细原理讲解分析

文章目录方法1:split(String [regex](https://so.csdn.net/so/search?qregex&spm1001.2101.3001.7020))入门案例1入门案例2入门案例3入门案例4分隔符三个特殊位置特殊案例1特殊案例2方法2:split(String regex,int limit)limit用法:进阶案例:limit>0限制分割次数limit&l…

图神经网络关系抽取论文阅读笔记(二)

1 用于关系抽取的生成式参数图神经网络 论文&#xff1a;Graph Neural Networks with Generated Parameters for Relation Extraction&#xff08;2019 ACL&#xff09; 1.1 创新点 传统的图神经网络在进行NLP任务时&#xff0c;图的拓扑结构都是预先定义好的&#xff0c;之后再…

已解决OSError: [Errno 22] Invalid argument

已解决OSError: [Errno 22] Invalid argument 文章目录报错代码报错翻译报错原因解决方法帮忙解决报错代码 粉丝群里面的一个粉丝用Python读取文件的时候&#xff0c;发生了报错&#xff08;跑来找我求助&#xff0c;然后顺利帮助他解决了&#xff0c;顺便记录一下希望可以帮助…

PTA题目 前世档案

网络世界中时常会遇到这类滑稽的算命小程序&#xff0c;实现原理很简单&#xff0c;随便设计几个问题&#xff0c;根据玩家对每个问题的回答选择一条判断树中的路径&#xff08;如下图所示&#xff09;&#xff0c;结论就是路径终点对应的那个结点。 现在我们把结论从左到右顺序…