Hystrix (容错,回退,降级,缓存)
Hystrix熔断机制就像家里的保险丝一样,若同时使用高功率的电器,就会烧坏电路,这时候保险丝自动断开就有效的保护了电路。而我们程序中也同样是这样。例如若此时数据库压力太大速度很慢,此时还有不断的请求访问后台,就会造成数据库崩溃。这时候hystrix容错机制,可以为客户端请求设置超时链接,添加回退的逻辑,减少集群压力。

1.1 导依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.8.RELEASE</version>
<relativePath/>
</parent>
<!-- springCloud -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- eureka客户端依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<!-- hystrix -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
1.2 配置application.yml
# 指定端口
server:
port: 8085
context-path: /demo
# 服务名称
spring:
application:
name: hystrix # eureka服务器地址
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
1.3 配置Hystrix过滤器
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import com.netflix.hystrix.strategy.concurrency.HystrixRequestContext;
/**
* urlPatterns:拦截所有路径(拦截规则)
* filterName:过滤器名称
*/
@WebFilter(urlPatterns = "/*", filterName = "hystrixFilter")
public class HystrixFilterConf implements Filter{
public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 初始化Hystrix上下文
HystrixRequestContext ctx = HystrixRequestContext.initializeContext();
try {
chain.doFilter(request, response);
} catch (Exception e) { } finally {
ctx.shutdown();
}
}
public void init(FilterConfig arg0) throws ServletException { }
}
1.4 主函数入口
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient //开启Eureka
@EnableCircuitBreaker//开启断路器
@ServletComponentScan//扫描servlet过滤器监听器
public class ServerMain { public static void main(String[] args) {
new SpringApplicationBuilder(ServerMain.class).web(true).run(args);
}
}
二: hystrix 的 熔断,降级 机制。
2.1 回退机制案例
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* Hystrix回退机制(熔断,降级)
*/
@Service
public class RollbackService { /**
* fallbackMethod: 指定回退方法
*
* coreSize: 线程池最大数量
* maxQueueSize: 线程池最大队列,默认-1通过SynchronousQueue来实现; 否则使用LinkedBlockingQueue实现
* queueSizeRejectionThreshold: 当maxQueueSize是LinkedBlockingQueue时,即使没有达到最大列队也会据绝请求。
*
* timeoutInMilliseconds: 超时时间
* requestVolumeThreshold: 单位时间内超过这个多个请求失败才执行熔断
*/
@RequestMapping(value = "/testRollback")
@HystrixCommand(fallbackMethod = "myRollback",
threadPoolProperties = {
@HystrixProperty(name = "coreSize", value = "30"),
@HystrixProperty(name = "maxQueueSize", value = "-1"),
@HystrixProperty(name = "queueSizeRejectionThreshold", value = "-1")
},
commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000"),
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "1")
})
public String testRollback() {
try {// 模拟请求阻塞
Thread.sleep(4000);
} catch (Exception e) {
}
return "恭喜你访问成功!";
}
/** 回退方法 */
public String myRollback() {
return "服务器压力过大,明年再来吧!";
}
}
2.2 编写接口, 调用测试。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class RollbackController { @Autowired
private RollbackService rollbackService; @RequestMapping("/testRollback")
public String testRollback() {
return rollbackService.testRollback();
}
}

三: hystrix 缓存机制:hystrix的缓存有点像mybatis默认开启的一级缓存:在session关闭之前(一次会话期间),使用同样的参数调用同一个方法,实际只查询一次。
3.1 缓存逻辑
import org.springframework.stereotype.Service;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.cache.annotation.CacheRemove;
import com.netflix.hystrix.contrib.javanica.cache.annotation.CacheResult;
@Service
public class CacheService { @CacheResult
@HystrixCommand
public void cacheMember(Integer id) {
System.out.println("调用 cacheMember 方法");
} /**
* commandKey:缓存的key
* 获取和删除必须用同一个key,并必须是同一次请求。
*/
@CacheResult
@HystrixCommand(commandKey = "myCacheKey")
public void getCache(Integer id) {
System.out.println("执行查询方法");
}
@CacheRemove(commandKey = "myCacheKey")
@HystrixCommand
public void removeCache(Integer id) {
System.out.println("删除缓存方法");
}
}
3.2 缓存接口开发
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class CacheController { @Autowired
private CacheService cacheService; @RequestMapping(value = "/cache", method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE)
public String cache() {
for(int i = 0; i < 3; i++) {
/** 在同一次请求里面调用了3次同一方法,会发现,控制台只
* 输出了一次,说明后2次走的缓存没调方法的逻辑 */
cacheService.cacheMember(1);
}
System.out.println("测试完毕");
return "";
}
@RequestMapping(value = "/rc", method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE)
public String testRemoveCache() {
cacheService.getCache(1);
cacheService.getCache(1); cacheService.removeCache(1);
System.out.println("######### 分隔线 ###########");
cacheService.getCache(1);
System.out.println("测试完毕");
return "";
}
}

Hystrix (容错,回退,降级,缓存)的更多相关文章
- Spring Cloud入门教程-Hystrix断路器实现容错和降级
简介 Spring cloud提供了Hystrix容错库用以在服务不可用时,对配置了断路器的方法实行降级策略,临时调用备用方法.这篇文章将创建一个产品微服务,注册到eureka服务注册中心,然后我们使 ...
- dubbo学习实践(4)之Springboot整合Dubbo及Hystrix服务熔断降级
1. springboot整合dubbo 在provider端,添加maven引入,修改pom.xml文件 引入springboot,版本:2.3.2.RELEASE,dubbo(org.apache ...
- SpringCloud之Hystrix容错保护原理及配置
1 什么是灾难性雪崩效应? 如下图的过程所示,灾难性雪崩形成原因就大致如此: 造成灾难性雪崩效应的原因,可以简单归结为下述三种: 服务提供者不可用.如:硬件故障.程序BUG.缓存击穿.并发请求量过大等 ...
- 转: 使用Hystrix实现自动降级与依赖隔离
使用Hystrix实现自动降级与依赖隔离 原创 2017年06月25日 17:28:01 标签: 异步 / 降级 869 这篇文章是记录了自己的一次集成Hystrix的经验,原本写在公司内部wiki里 ...
- (四)Hystrix容错保护
Feign默认是整合了Ribbon和Hystrix这两个框架,所以代码我们在上一篇的基础上进行修改,启动Eureka,service-hello,Feign 所谓的熔断机制和日常生活中见到电路保险丝是 ...
- SpringCloud实战-Hystrix线程隔离&请求缓存&请求合并
接着上一篇的Hystrix进行进一步了解. 当系统用户不断增长时,每个微服务需要承受的并发压力也越来越大,在分布式环境中,通常压力来自对依赖服务的调用,因为亲戚依赖服务的资源需要通过通信来实现,这样的 ...
- Hystrix的回退和zuul的回退总结
1.Hystrix的回退: Ribbon: Feign: zuul的回退:
- Hystrix 容错处理
目录 雪崩效应 容错的基本思想 什么是Hystrix 简单使用 消费端使用Hystrix 注解开启 改造消费方法 @HystrixCommand 详细配置 Hystrix线程隔离策略与传播上下文 Hy ...
- SpringCloud断路器(Hystrix)和服务降级案列
断路器(Hystrix) 为什么需要 Hystrix? 在微服务架构中,我们将业务拆分成一个个的服务,服务与服务之间可以相互调用(RPC).为了保证其高可用,单个服务又必须集群部署.由于网络原因或者自 ...
随机推荐
- js原生高逼格插件
如何定义一个高逼格的原生JS插件 作为一个前端er,如果不会写一个小插件,都不好意思说自己是混前端界的.写还不能依赖jquery之类的工具库,否则装得不够高端.那么,如何才能装起来让自己看起来逼格更高 ...
- 0-4评价一个语言模型Evaluating Language Models:Perplexity
有了一个语言模型,就要判断这个模型的好坏. 现在假设: 我们有一些测试数据,test data.测试数据中有m个句子;s1,s2,s3-,sm 我们可以查看在某个模型下面的概率: 我们也知道,如果计算 ...
- layui js动态添加的面板不能折叠
layui 动态添加dom后一般调用 layer.form.render()更新dom就可以了,但是我动态添加一个面板后form.render()就没有效果,要用layui.element.rende ...
- 【leetcode】848. Shifting Letters
题目如下: 解题思路:本题首先要很快速的计算出任意一个字符shift后会变成哪个字符,其实也很简单,让shift = shift % 26,接下来再做计算.第二部是求出每个字符要shift的次数.可以 ...
- 一篇文章带你了解JavaScript中的语法,数据类型,流程控制语句以及函数
作者 | Jeskson 来源 | 达达前端小酒馆 1 JavaScript有多重要啊,才能让我说说一下,其中的语法,操作符,数据类型,内置功能等. 语法: 在JavaScript中的变量,函数名和操 ...
- JS循环结构
什么是循环结构? 反复一遍又一遍做着相同(相似)的事情 循环结构的两大要素? 循环条件:什么时候开始,什么时候结束 循环操作:循环体,循环过程中 做了什么 一.while语句 while语句 属于前测 ...
- Logstash介绍及Input插件介绍
一.Logstash简介 Logstash是一个开源数据收集引擎,具有实时管道功能.Logstash可以动态地将来自不同数据源的数据统一起来,并将数据标准化到你所选择的目的地. Logstash管 ...
- dispatch_sync 与 dispatch_barrier_sync 区别
最后更新:2017-12-12 dispatch_sync 与 dispatch_barrier_sync https://github.com/rs/SDWebImage/pull/818 The ...
- percona-toolkit 工具介绍
percona-toolkit 工具介绍 percona-toolkit 是一组高级命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的mysql和系统任务.这些任务包括: 检查master和s ...
- 清北学堂2019NOIP提高储备营DAY4
今天只有一上午,讲的东西不多,这里就整理一下高精的东西,数论部分请见my blog 高精度: 先讲一讲进制问题:十进制的二进制表示:以10为例, 10的二进制表示为1010 10的三进制表示为101 ...