Hystix熔断解决雪崩问题

1.线程隔离,服务降级(服务的消费方做降级处理)

当服务繁忙时,如果服务出现异常,不是粗暴的直接报错,而是返回一个友好的提示,虽然拒绝了用户的访问,但是会返回一个结果。

这就好比去买鱼,平常超市买鱼会额外赠送杀鱼的服务。等到逢年过节,超时繁忙时,可能就不提供杀鱼服务了,这就是服务的降级。

系统特别繁忙时,一些次要服务暂时中断,优先保证主要服务的畅通,一切资源优先让给主要服务来使用,在双十一、618时,京东天猫都会采用这样的策略。

pom.xml

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

UserConsumerApplication.java

 
package cn.itcast.user;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.http.client.OkHttp3ClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

//@EnableDiscoveryClient
//@SpringBootApplication
//@EnableCircuitBreaker //服务的熔断
@SpringCloudApplication //SpringCloudApplication可以替代上面三个
public class UserConsumerDemoApplication {

@Bean
@LoadBalanced //负载均衡
public RestTemplate restTemplate() {
// 这次我们使用了OkHttp客户端,只需要注入工厂即可
return new RestTemplate(new OkHttp3ClientHttpRequestFactory());
}

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

 3.UserHController.java

package cn.itcast.user.controller;import cn.itcast.user.pojo.User;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;@RestController
@RequestMapping("consumerH")
public class UserHController {@Autowiredprivate RestTemplate restTemplate;@GetMapping("{id}")@HystrixCommand(fallbackMethod = "queryUserByIdFallback")   //单个方法的超时返回public String queryUserById(@PathVariable("id") Long id){String url = "http://user-service/user/" + id;//User user = restTemplate.getForObject(url, User.class);//return  user;String user = restTemplate.getForObject(url, String.class);return user;}public String queryUserByIdFallback(@PathVariable("id") Long id){return "用户信息查询出现异常!";
//        User user = new User();
//        user.setId(id);
//        user.setNickName("用户信息查询出现异常!");
//        return user;
    }
}

==========================
配置统一超时信息
package cn.itcast.user.controller;

import cn.itcast.user.pojo.User;
import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
@RequestMapping("consumerH")
@DefaultProperties(defaultFallback = "queryUserByIdFallback")
public class UserHController {
@Autowired
private RestTemplate restTemplate;

@GetMapping("{id}")
//@HystrixCommand(fallbackMethod = "queryUserByIdFallback")
@HystrixCommand
public String queryUserById(@PathVariable("id") Long id){
String url = "http://user-service/user/" + id;
//User user = restTemplate.getForObject(url, User.class);
//return user;
String user = restTemplate.getForObject(url, String.class);
return user;
}

//public String queryUserByIdFallback(@PathVariable("id") Long id){
//return "用户信息查询出现异常!";
// User user = new User();
// user.setId(id);
// user.setNickName("用户信息查询出现异常!");
// return user;
//}

public String queryUserByIdFallback(){
return "用户信息查询出现异常!";
}
}

=============================================================

package cn.itcast.user.controller;

import cn.itcast.user.pojo.User;
import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
@RequestMapping("consumerH")
@DefaultProperties(defaultFallback = "queryUserByIdFallback")
public class UserHController {
@Autowired
private RestTemplate restTemplate;

@GetMapping("{id}")
@HystrixCommand(commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000"), //响应超时时间
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"),
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"),
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60")
})
public String queryUserById(@PathVariable("id") Long id){
if(id % 2 ==0){
throw new RuntimeException("");
}
String url = "http://user-service/user/" + id;
String user = restTemplate.getForObject(url, String.class);
return user;
}

public String queryUserByIdFallback(){
return "用户信息查询出现异常!";
}
}
 

 

转载于:https://www.cnblogs.com/wuxiang12580/p/10785643.html

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

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

相关文章

Docker 环境下如何 安装 Zookeeper

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 第一步&#xff1a;首先下载Zookeeper的镜像文件&#xff1a; 从仓库中pull 这个zookeeper镜像&#xff1a;docker pull jplock/zookeep…

office教程:教你Excel 怎么样使用信息函数

Excel如何使用信息函数信息函数专门用来返回某些指定单元格或区域的信息&#xff0c;例如获取文件路径、单元格格式信息或操作环境信息等。一&#xff0c;使用CELL函数返回引用单元格信息工作表中的每一个单元格都有对应的单元格格式、位置和内容等信息&#xff0c;在Excel中可…

【C基础】指针/指针运算/二级指针/函数指针

指针定义&#xff1a; 指针是一种数据类型&#xff0c;使用它可以用来定义指针变量&#xff0c;指针变量中存储的其实是整数&#xff0c;这种整数代表了内存的编号。指针的使用&#xff1a; 1、函数之间相独立&#xff0c;但有些时候需要共享变量。传参是值传递全局变量容易命…

中医养生 选对方法就成功一半

在医院门诊室&#xff0c;因为肠胃不适前来看病的林先生。问及他平时的养生之道&#xff0c;他笑谈&#xff0c;现在也正困惑着呢。 原来&#xff0c;最近他有两个朋友&#xff0c;在单位体检时分别被查出患有肾结石和胆囊炎&#xff0c;他本人最近也犯胃病。 最令人奇怪的一…

二叉查找树,红黑树

漫画算法&#xff1a;什么是红黑树&#xff1f;&#xff08;适合初学红黑树小白简单易懂&#xff09; 2018年09月14日 09:55:54 苏杭-Java工程师 阅读数&#xff1a;494———————————— 二叉查找树&#xff08;BST&#xff09;具备什么特性呢&#xff1f; 1.左子树上所…

如何在 CentOS 7上安装和使用 Docker Compose

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 介绍 Docker是一个很好的工具&#xff0c;但要真正充分利用它的潜力&#xff0c;最好是应用程序的每个组件都在它自己的容器中运行。对于…

WebSSH2安装过程可实现WEB可视化管理SSH工具

目录 Chrome web Secure Shell Extension gotty GateOne noVNCvncserver XtermjsSSH2nodejs nodejstty.js CheungSSH TriAquae https://github.com/Scirh/Python/tree/master/django https://www.smarthomebeginner.com/install-shellinabox-on-ubuntu/#64-bit https://gist.gi…

原码反码补码位运算,

进制转换&#xff1a; 十进制转二进制&#xff1a; 求余法&#xff1a;用2对数据求余&#xff0c;然后再对商继续求余&#xff0c;直到商为0结束&#xff0c;过程中产生的余数就是该数据的二进制(逆序)。 求权法&#xff1a;数据 - 2^(n-1) 如果可以减 第n位就是1&#xff0c;否…

一个人幸运的前提,是他有能力改变自己

很多时候&#xff0c;我们羡慕那些幸运的人&#xff0c;却看不到他们为此做出的努力和改变。 其实&#xff0c;一个人的幸运并不是偶然的&#xff0c;美国成功哲学家金洛恩说过这么一句话&#xff1a;“成功不是追求得来的&#xff0c;而是被改变后的自己主动吸引来的。” …

剑指Offer-正则表达式匹配(Python)

1 题干内容 请实现一个函数用来匹配包括.和*的正则表达式。模式中的字符.表示任意一个字符&#xff0c;而*表示它前面的字符可以出现任意次&#xff08;包含0次&#xff09;。 在本题中&#xff0c;匹配是指字符串的所有字符匹配整个模式。 例如&#xff0c;字符串aaa与模式a.a…

Docker 制作镜像的方式

其它制作镜像的方式 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 除了标准的使用 Dockerfile 生成镜像的方法外&#xff0c;由于各种特殊需求和历史原因&#xff0c;还提供了一些其它…

【算法】快排

快速排序 其利用的思想就是分治思想&#xff0c;最开始先从数组中随机选择一个元素p&#xff08;为什么随机下面解释&#xff09;&#xff0c;然后以这个元素对数组中的元素进行分类&#xff0c;数组左侧都是小于p的元素&#xff0c; 右侧都是大于等于p的元素。这样就让数组分成…

【C基础】堆内存创建/释放和内存清理函数/内存泄漏

本期涉及到了较多的指针&#xff0c;没有彻底领悟的同学请翻阅之前的博文~ 一闪一闪亮晶晶&#xff0c;满天都是小星星*** 什么是堆内存&#xff1a; 是进程的一个内存段(text、data、bss、heap、stack)之一&#xff0c;由程序员手动管理&#xff0c; 特点就是足够大&#x…

19_05_01校内训练[polygon]

题意 把一个边长为1的正n边形放到一个正m边形中&#xff0c;要求m边形完全覆盖n边形&#xff0c;可以有交点&#xff0c;并且中心重合。求正m边形的最小边长&#xff0c;至少精确到6位。要求logn计算。 思考 先考虑m|n的情况。 我们知道&#xff0c;正m边形的边长与可行区域&am…

六度人脉 全球最高效的人脉法则(图)

六度人脉这一概念&#xff0c;在20世纪60年代由美国心理学家Stanley Milgram提出并验证。 所谓六度人脉&#xff0c;即地球上所有的人都可以通过六层以内的熟人关系链和其他人联系起来。 通俗地说&#xff1a;“最多通过六个人你就可以认识地球上任何一个陌生人。” SNS(社会…

[转]numpy中的np.max 与 np.maximum区别

转自&#xff1a;https://blog.csdn.net/lanchunhui/article/details/52700895 转载于:https://www.cnblogs.com/xianhan/p/10609319.html

JVM 的 Finalization Delay 引起的 OOM(java.lang.OutOfMemoryError:null at sun.misc.Unsafe.allocateMemory.)

今天在压力测试环境某一个服务出现crash了&#xff0c;经过一番检查&#xff0c;终于发现是由于JVM的Finalization Delay引起的&#xff0c;这个问题比较特殊&#xff0c;这里记录一下。 这个服务是用Java写的&#xff0c;主要完成的功能是根据特定的指令文件生成mp4文件&#…

win10 php7+apache2.4的配置以及遇到的问题及解决

首先进入PHP官网下载php7的版本,我下的是PHP7.1.28,在PHP的下载页面注意划红线和绿线的地方(我画的) 1.画了红线的意思是请使用由apache lounge提供的编译文件,也就是点进蓝色Apache lounge这里下载. 2.画了绿色的线的意思是用Apache的话你必须使用Thread Safe(线程安全)的PHP…

缓存区的输入输出,字符串常用操作,实现strlen/strcpy/strcat/strcmp函数)

输出缓冲区&#xff1a; 程序输入的数据并不能立即显示在屏幕上&#xff0c;而是先存储在输出缓冲区中&#xff0c;满足一些条件后才显示出来。 1、遇到\n后 2、遇到输入语句 3、当输出缓冲区满4K 4、当程序结束 5、手动刷新 fflush(stdout) 缓冲区机制可以提高数据的读写速度…

理性分散投资 收益袋袋平安

理财锦囊 想要投资理财&#xff0c;不光可以选择股票和债券这类入门产品&#xff0c; 实际上&#xff0c;还可选择其他低风险及高回报的投资产品&#xff0c;例如外汇、期货和商品。 针对此&#xff0c;几位分析师预测了2014年各国经济走势的重点&#xff0c;协助散户们分配…