4_hytrix_信号量_线程池

2023-11-07


Hystrix

核心特性和原理

  • 熔断: 连续失败次数达到阈值, (有计数器)

    • 恢复:
    • 半请求: 时不时试试, 提供方是否恢复; 例如随机策略, 按时间间隔策略; 重试成功后, 重置标志位/计数器
    • 相互之间不通知, 其实也不能通知, 例如: 会引发广播风暴
  • 降级: 返回差一点的响应; 写mq; 备用方案;

  • 隔离(线程隔离): 线程数/池: 控制到具体url 的线程个数(1:46); map<url, thread_count>;

    • 这里的线程 和 tomcat线程池中的是一个list 吗? 还是单独 http请求服务的线程?
    • Tomcat 线程数是整个应用的个数;
  • Hystrix实现: 代理

  • 自我修复:断路器打开一段时间后,会自动进入“半开”状态,可以进行打开,关闭,半开状态的转换。

使用

  • Hystrix 可以脱离spring-cloud
  • 依赖: 2:00, 在consumer 中配置:
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
  • 使用:

    • 继承 HystrixCommand;
    • 重写 run, getFallback, 方法
    • 还要重写一个 构造方法
  • hystrix有两种执行模式:

    • execute(): 以同步阻塞方式执行run(),调用execute()后,hystrix先创建一个新线程运行run(),接着调用程序要在execute()调用处一直阻塞着,直到run()运行完成;
    • queue(): 以同步非阻塞方式执行run(),调用queue()就直接返回一个Future对象,同时hystrix创建一个新线程运行run(),调用程序通过Future.get()拿到run()的返回结果;

单独使用

package com.go.cn.test;

import com.netflix.hystrix.HystrixCommand;
import com.netflix.hystrix.HystrixCommandGroupKey;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

public class HystrixTest extends HystrixCommand {

    private static Logger logger = LoggerFactory.getLogger(HystrixCommand.class);

    protected HystrixTest(HystrixCommandGroupKey group) {
        super(group);
    }


    public static void main(String[] args) {
        // 阻塞方式
       /* HystrixTest hystrixTest = new HystrixTest(HystrixCommandGroupKey.Factory.asKey("ext"));
        logger.info("==>>: result={}", hystrixTest.execute());*/

        // 非阻塞方式
        Future<String> futureResult = new HystrixTest(HystrixCommandGroupKey.Factory.asKey("ext")).queue();
        String result = "";
        try {
            result = futureResult.get();
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
        logger.info("==>>: result={}", result);
    }

    @Override
    protected Object run() throws Exception {
        System.out.println("执行逻辑");
        int i = 1 / 0;
        return String.valueOf(i);
    }

    @Override
    protected Object getFallback() {
        return "getFallback:getFallback";
    }
}

--- 执行结果 ---
15:16:41.825 [main] INFO com.netflix.hystrix.HystrixCommand - result=getFallback:getFallback    
  • 图形化: ${prefix}/hystrix

整合 Feign

  • 也有两种:1-指定 Fallback 类;2-指定 FallbackFactory 工厂类;

  • 在调用方的 类上不能加 @RequestMapping(), 需要单独写道每个方法上; 就是路径前缀需要重复写;

  • 配置:

feign:
  hystrix:
    enabled: true
  • service 和 controller: 1-指定 Fallback 类;
---service---
package com.go.cn.service;

import com.go.cn.conf.HystrixFeignBack;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

//@RequestMapping("/hystrix") // feign 有 fallback 属性时这个注解要去掉
//@FeignClient(name = "provider", configuration = FeignAuthConfiguration.class)
@FeignClient(name = "provider", contextId = "hystrix", fallback = HystrixFeignBack.class)
public interface HystrixFeignService {

    @GetMapping("/hystrix/feign_hystrix")
    String getPort();

}
--- 降级类 需要实现对应的Service接口 ---
package com.go.cn.service;

import org.springframework.stereotype.Component;

@Component
public class HystrixFeignBack implements HystrixFeignService {

    /**
     * 方法名和 feign 调用时的方法名一致
     */
    @Override
	public String getPort() {
		return "getPort:fail_back";
	}
}
--- controller ---
package com.go.cn.controller;

import com.go.cn.service.HystrixFeignService;
import com.go.cn.service.HystrixXRestTemplateService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HystrixController {
    private HystrixXRestTemplateService hystrixService;
    private HystrixFeignService hystrixFeignService;

    @Autowired
    public void setFeignApiService(HystrixXRestTemplateService hystrixService) {
        this.hystrixService = hystrixService;
    }
    @Autowired
    public void setHystrixFeignService(HystrixFeignService hystrixFeignService) {
        this.hystrixFeignService = hystrixFeignService;
    }

    @GetMapping("/restTemplate_hystrix")
    public String getPort(){
        return hystrixService.runFun();
    }

    @GetMapping("/feign_hystrix")
    public String feign_hystrix(){
        return hystrixFeignService.getPort();
    }
}

  • 注意 contextId = "hystrix" 配置后,之前配置的认证可能会失效,因为服务名变了;暂时的解决方式是去掉认证。//todo

  • 2-指定 FallbackFactory 工厂类: create(Throwable cause) 方法中传入了具体的异常类信息,所以可以使用FallbackFactory 定义具体不同的降级信息;

  • Factory 类 和 service 的调整:

package com.go.cn.service;

import feign.FeignException;
import feign.hystrix.FallbackFactory;
import org.springframework.stereotype.Component;

@Component
public class HystrixFeignFallbackFactory implements FallbackFactory<HystrixFeignService> {

	@Override
	public HystrixFeignService create(Throwable cause) {
		return new HystrixFeignService() {
            @Override
            public String getPort() {
                if(cause instanceof FeignException.InternalServerError) {
                    return "远程服务报错";
                }else if(cause instanceof RuntimeException) {
                    return "请求时异常:" + cause;
                }else {
                    return "其他情况";
                }
            }
        };
	}

}
--- service---
package com.go.cn.service;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

//@RequestMapping("/hystrix") // feign 有 fallback 属性时这个注解要去掉
//@FeignClient(name = "provider", configuration = FeignAuthConfiguration.class)
//@FeignClient(name = "provider", contextId = "hystrix", fallback = HystrixFeignBack.class, fallbackFactory=HystrixFeignFallbackFactory.class)
@FeignClient(name = "provider", contextId = "hystrix", fallbackFactory=HystrixFeignFallbackFactory.class)
public interface HystrixFeignService {

    @GetMapping("/hystrix/feign_hystrix")
    String getPort();

}

整合RestTemplate

  • 加好依赖
  • 启动类加:@EnableCircuitBreaker
  • service 和 controller:
---service---
package com.go.cn.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;

@Service
public class HystrixXRestTemplateService {


    @Autowired
    @Qualifier("restTemplate")
    RestTemplate template;
	
	@HystrixCommand(defaultFallback = "fail")
	public String runFun() {
		String url ="http://provider/restTemplate_hystrix";
        return template.getForObject(url, String.class);
	}

	public String fail() {
		return "rest_template:fail";
	}

}
--- controller ---
package com.go.cn.controller;

import com.go.cn.service.HystrixXRestTemplateService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HystrixController {
    private HystrixXRestTemplateService hystrixService;

    @Autowired
    public void setFeignApiService(HystrixXRestTemplateService hystrixService) {
        this.hystrixService = hystrixService;
    }

    @GetMapping("/restTemplate_hystrix")
    public String getPort(){
        return hystrixService.runFun();
    }
}

信号量与线程隔离

线程池隔离

  • 针对每个不同的服务维护一个线程池;
  • 不同服务互不影响; 不会由于某个服务调用导致当前服务卡死;
  • 缺点就是, 开心稍微有点大;
  • 官方推荐此方案:
    • 可以做失败策略;
    • 异常的隔离;
    • 异步请求, 解放 worker 线程池的阻塞;

信号量隔离

  • 根据 URI 设置信号量; 拿不到信号量 直接 fallback;
  • 更加轻量级;

常用配置

hystrix:
  command:
    default:
      execution:
        isolation:
          semaphore:
          # 最大并发请求数,默认10,该参数当使用ExecutionIsolationStrategy.SEMAPHORE策略时才有效。
          # 如果达到最大并发请求数,请求会被拒绝。理论上选择semaphore size的原则和选择thread size一致,
          # 但选用semaphore时每次执行的代码量比较小且执行速度快(ms级别),否则的话应该用thread。
            maxConcurrentRequests: 20
            # 隔离策略,默认是Thread, 可选Thread|Semaphore
            # - 通过semaphore count来限制并发请求数,适用于无网络的高并发请求,semaphore应该占整个容器(tomcat)的线程池的一小部分;
            #  通过线程数量来限制并发请求数,可以提供额外的保护,但有一定的延迟。一般用于网络调用
          strategy: Semaphore  # SEMAPHORE
          thread:
            # 发生超时是是否中断,默认 true
            interruptOnTimeout: true
            # 命令执行超时时间,默认1000ms
            timeoutInMilliseconds: 1000
        # 执行是否启用超时,默认启用 true    
        timeout:
          enabled: true
  • 使用信号量, 配置:
    • 配置文件:hystrix.command.default.execution.isolation.strategy=SEMAPHORE

hystrix 使用dashboard

  • 可以是一个独立项目,也可以在某个项目里;
  • 添加依赖:
<!-- 独立服务中需要的依赖 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
<!-- 被监控的服务需要的依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
  • 主类:@EnableHystrixDashboard
  • 被监控的服务中增加配置类:
import com.netflix.hystrix.Hystrix;
import com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class OrderActuator {

    @Bean
    public ServletRegistrationBean getServletRegistrationBean(){

        HystrixMetricsStreamServlet mss = new HystrixMetricsStreamServlet();

        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(mss);

        servletRegistrationBean.setName("servletRegistrationBean");
        servletRegistrationBean.setLoadOnStartup(1);
        servletRegistrationBean.addUrlMappings("/hystrix.stream");
        return servletRegistrationBean;
    }

}
  • 图形化查看: http://service_ip:port/hystirx;在其中输入框中输入 http://被监控ip:port/hystrix.stream
  • 查看 hystrix.stream: http://ip:port/actuator/hystrix.stream
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

4_hytrix_信号量_线程池 的相关文章

  • 检查双精度值的等于和不等于条件

    我在比较两者时遇到困难double values using and 我创建了 6 个双变量并尝试进行比较If健康 状况 double a b c d e f if a b c d e f My code here in case of t
  • jdbc-initialize-database 找不到脚本文件 - DataAccessResourceFailureException

    我无法让我的 Spring Web 应用程序找到我的脚本 我已经配置了 jdbc 命名空间 我已经写好了脚本 但是 我不明白为什么无论我把脚本放在哪里 都找不到它们 我特别将文件夹标记为 类文件夹 我把它们和我所有的罐子放在同一个文件夹里
  • 有没有好的方法来解析用户代理字符串?

    我有一个Java接收模块User Agent来自最终用户浏览器的字符串的行为需要略有不同 具体取决于浏览器类型 浏览器版本甚至操作系统 例如 FireFox 7 0 Win7 Safari 3 2 iOS9 我明白了User Agent由于
  • 使用 Spring 时实例化对象,用于测试与生产

    使用 Spring 时 应该使用 Spring 配置 xml 来实例化生产对象 并在测试时直接实例化对象 这样的理解是否正确 Eg MyMain java package org world hello import org springf
  • Spring云配置服务器-如何添加在En​​vironmentEncryptorEnvironmentRepository的findOne()方法中可见的自定义PropertySource

    My goal就是在spring cloud server中添加自定义的PropertySource 我想要实现的是从 spring cloud config client 应用程序中的自定义源获取一些自定义属性 根据来自的建议在 spri
  • 场景生成器删除 fxml 文件中的导入

    我使用场景构建器 Gluon Scene Builder JavaFX Scene Builder 8 1 1 来创建应用程序的 UI 并使用 Eclipse 开发 JavaFX 现在 每次我在场景生成器中保存某些内容时 它都会从 fxml
  • 如何将 XMP XML 块序列化为现有的 JPEG 图像?

    我有许多 JPEG 图像 其中包含损坏的 XMP XML 块 我可以轻松修复这些块 但我不确定如何将 固定 数据写回图像文件 我目前正在使用 JAVA 但我愿意接受任何能让这项任务变得容易的事情 这是目标关于 XMP XML 的另一个问题
  • 使用 Guava 联合两个 ImmutableEnumSets

    我想联合两个ImmutableEnumSets来自番石榴 这是我的尝试 public final class OurColors public enum Colors RED GREEN BLUE YELLOW PINK BLACK pub
  • Java:VM 如何在 32 位处理器上处理 64 位“long”

    JVM 如何在 32 位处理器上处理 64 位的原始 long 在多核 32 位机器上可以并行利用多个核心吗 64 位操作在 32 位机器上慢了多少 它可能使用多个核心来运行不同的线程 但不会并行使用它们进行 64 位计算 64 位长基本上
  • 参数动态时如何构建 JPQL 查询?

    我想知道是否有一个好的解决方案来构建基于过滤器的 JPQL 查询 我的查询太 富有表现力 我无法使用 Criteria 就像是 query Select from Ent if parameter null query WHERE fiel
  • 打印包含 JBIG2 图像的 PDF

    请推荐一些库 帮助我打印包含 JBIG2 编码图像的 PDF 文件 PDFRenderer PDFBox别帮我 这些库可以打印简单的 PDF 但不能打印包含 JBIG2 图像的 PDF PDFRenderer尝试修复它 根据 PDFRedn
  • jmap - 组织和堆操作会给 jvm 带来开销吗?

    正如标题所述 需要多少开销jmap histo and jmap heap分别带到jvm 如果一个内存敏感的 Java 进程处于OutOfMemory 例如 大约 96 的堆已满 并且无法通过 full gc 清除 其中一项操作是否有可能将
  • 让JScrollPane控制多个组件

    对于我的应用程序 我正在设计一个脚本编辑器 目前我有一个JPanel其中包含另一个JPanel保存行号 位于左侧 以及JTextArea用于允许用户输入代码 位于右侧 目前 我已经实施了JScrollPane on the JTextAre
  • 将 RSA 密钥从 BigIntegers 转换为SubjectPublicKeyInfo 形式

    WARNING 最初的问题是关于 PKCS 1 编码密钥 而问题中的实际示例需要SubjectPublicKeyInfo X 509 编码密钥 我目前正致力于在 java 中从头开始实现 RSA 算法 特别是密钥生成方面 现在我的代码可以给
  • 使用 Java 从 S3 上的文件在 S3 上创建 zip 文件

    我在 S3 上有很多文件 需要对其进行压缩 然后通过 S3 提供压缩文件 目前 我将它们从流压缩到本地文件 然后再次上传该文件 这会占用大量磁盘空间 因为每个文件大约有 3 10MB 而且我必须压缩多达 100 000 个文件 所以一个 z
  • 来自客户端的超时 Web 服务调用

    我正在使用 RestEasy 客户端调用网络服务 一项要求是 如果调用运行时间超过 5 秒 则中止 超时调用 我如何使用 RestEasy 客户端实现这一目标 我只看到服务器端超时 即如果在一定时间内未完成请求 Rest Easy 网络服务
  • struts 教程或示例

    我正在尝试在 Struts 中制作一个登录页面 这个想法是验证用户是否存在等 然后如果有错误 则返回到登录页面 错误显示为红色 典型的登录或任何表单页面验证 我想知道是否有人知道 Struts 中的错误管理教程 我正在专门寻找有关的教程 或
  • Java 编码风格、局部变量与重复方法调用

    我更喜欢使用局部变量而不是多次调用同一方法 I prefer this Vehicle vehicle person getVehicle if vehicle instanceof Car Car car Car vehicle car
  • 如何将实例变量传递到 Quartz 作业中?

    我想知道如何在 Quartz 中外部传递实例变量 下面是我想写的伪代码 如何将 externalInstance 传递到此作业中 public class SimpleJob implements Job Override public v
  • Java中获取集合的幂集

    的幂集为 1 2 3 is 2 3 2 3 1 2 1 3 1 2 3 1 假设我有一个Set在爪哇中 Set

随机推荐

  • kali Linux外网渗透控制Android安卓手机系统。

    免责声明 本文所介绍的内容仅做学习交流使用 严禁利用文中技术进行非法行为 否则造成一切严重后果自负 简介 Kali Linux的前身是BackTrack Linux发行版 Kali Linux是一个基于Debian的Linux发行版 它被认
  • 机器阅读理解相关论文汇总

    一 综述 1 Emergent Logical Structure in Vector Representations of Neural Readers 二 论文 1 Learning Recurrent Span Representat
  • EduCoder Java程序设计---Java面向对象(第八章) - 文件类答案

    第1关 创建文件 package step1 import java io File import java io FileFilter import java io IOException import java util Scanner
  • k8s基础11——安全控制之RBAC用户授权、RBAC用户组授权、SA程序授权

    文章目录 一 K8s安全框架 1 1 鉴权 1 1 1 HTTPS证书认证 1 1 2 HTTP Token认证 1 2 授权 1 3 准入控制 1 4 集群四大角色 二 RBAC给用户授权 TLS 2 1 签发客户端证书 2 2 生成ku
  • 使用Java的File类实现目录拷贝

    目录 准备工作 Case Analysis 代码实现 总结 准备工作 首先 我们来熟悉下File类 在 Java 中 File 类是 java io 包中唯一代表磁盘文件本身的对象 也就是说 如果希望在程序中操作文件和目录 则都可以通过 F
  • otsu算法_OTSU算法详解

    OTSU是阈值分割中一种常用的算法 它可以根据图像自动生成最佳分割阈值 OTSU的核心思想是类间方差最大化 OTSU算法详解 令 表示一幅大小为 像素的数字图像中的 个不同的灰度级 表示灰度级为 的像素数 图像中的像素总数为 像素的灰度级为
  • VS2017序列号

    趁着这两天微软发布了Visual Studio 2017 安装体验了这个史上最强IDE最新版 分享一下自己的安装过程 下载地址点击这里 该版本堪称史上最大IDE 随便勾了几个选项 就要占用几十个GB的安装空间 最后果断选择了最小安装包 只要
  • uniapp中单选按钮的实现

    标签说明 radio group 单项选择器 内部由多个
  • Java核心技术卷 学习Day02

    java学习 复习 本文主要参照 Java核心技术卷 作为学习对象 第四章 对象与类 1 类 面向对象程序设计OOP 类 封装实例字段 方法 类 gt 继承 is a 依赖 uses a 聚合 has a gt 类 2 预定义类 Math
  • JAVA---抽象类和接口基础知识详解(及两者异同点)

    在本篇博客中将介绍JAVA里抽象类和接口的基础知识以及两者的异同点 在有继承和多态的基础知识上学习会更好 目录 抽象类基础知识 抽象类的定义 创建等基础 抽象类的几点说明 一 为何使用抽象方法 抽象类的几点说明 二 接口基础知识 接口的定义
  • 【Zotero高效知识管理】(1)Zotero介绍

    Zotero高效知识管理 专栏其他文章 Zotero文献管理软件的系统性教程 包括安装 全面的配置 基于众多插件的文献导入 管理 引用 笔记方法 Zotero高效知识管理 2 Zotero的安装 百度云存储配置及常用插件安装 Zotero高
  • jsp调用controller方法_SpringMVC五大核心组件及调用过程

    Spring Web MVC 五大核心组件 DispatcherServlet 控制器入口 负责分发请求 HandlerMapping 负责根据请求 找到对应的控制器 Controller 真正处理请求的控制器 ModelAndView 封
  • 用于光栅仿真的非偏振光–实例讨论

    摘要 像光栅这样的光学设备对光的偏振比较敏感 因此 在仿真中适当考虑光的偏振非常重要 在实际中 光栅有时会以非偏振光作为输入 作为两个正交偏振态的平均值 我们为您展示了如何在VirtualLab Fusion中建模这种用于光栅仿真的非偏振光
  • C语言《文件操作》事无巨细,保姆级介绍,通俗易懂

    目录 1 文件名与文件分类 2 文件操作使用 2 1文件的打开与关闭 3 文件操作函数 3 1其他文件函数 1 fseek 2 ftell 3 rewind 4 文件结束的判定 4 1被错误使用的 feof 4 2文件结束的正确判断 5 文
  • negix安装部署

    1 从nginx官网下载Nginx wget http nginx org download nginx 1 8 1 tar gz 2 解压Nginx tar zxvf nginx 1 8 1 tar gz 3 初始化配置 configur
  • OpenCV(3.4.1) Error: Assertion failed (scn == 3

    错误 OpenCV 3 4 1 Error Assertion failed scn 3 scn 4 in cv cvtColor file D Build OpenCV opencv 3 4 1 modules imgproc src c
  • vi的一些操作

    1 u可撤销操作 2 yy复制当前行 3 p粘贴复制的行 4 dd删除一行 5 xxx可以定位xxx所在位置 6 n或ngg或nG可以跳转到第n行 以下设置是临时的 只在当前vi中生效 但可将其添加在配置文件 etc virc中使每次按文件
  • STM32CubeMX的使用教程

    STM32 关于STM32CubeMX的使用 打开Cube 点击File New Project 搜索芯片型号这边选择的是STM32L071CB系列上面菜单Docs Resources可以下载数据手册程序手册等 点击Start Projec
  • DEBUG:only Tensors of floating point dtype can require gradients

    DEBUG only Tensors of floating point dtype can require gradients 解决 x V t arange 2 4 float requires grad True
  • 4_hytrix_信号量_线程池

    文章目录 Hystrix 核心特性和原理 使用 单独使用 整合 Feign 整合RestTemplate 信号量与线程隔离 线程池隔离 信号量隔离 常用配置 hystrix 使用dashboard Hystrix 核心特性和原理 熔断 连续