TZ_13_Hystix的服务降级_线程隔离
1.微服务中,服务之间的调用关系复杂。
一个请求有可能需要多个微服务接口才能实现。如果一次请求出现问题就会直接堵塞,占用一次tomcat链接。如果访问这个出现问题的请求就会造成tomcat请求链接都被占用,最终导致整个服务崩溃
2.解决方法
1>线程隔离:为没一个微服务提供对应数量的tomcat线程。即使当前微服务端口的线程堵塞,也不会影响其他的微服务端口
2>服务降级:线程堵塞后抛出一个友好的提示。保证核心服务的真常运行,而非核心服务不可用或弱可用
服务降级在服务的调用方使用:
1>导入起步器坐标
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
2>加注解在起步器上加上 @EnableDiscoveryClient @SpringBootApplication @EnableCircuitBreaker==@SpringCloudApplication
//拉取在注册中心注册过的服务
//@EnableDiscoveryClient
//@SpringBootApplication
//@EnableCircuitBreaker
@SpringCloudApplication
public class ApplicationService {
@Bean
//对json数据自动处理
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
} public static void main(String[] args) {
SpringApplication.run(ApplicationService.class);
} }
3.@HystrixCommand(fallbackMethod = "queryUserByIdFallback")当发生堵塞是执行该方法
@RestController
@RequestMapping("User")
public class UserController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("{id}")
@HystrixCommand(fallbackMethod = "queryUserByIdFallback")
public String selectById(@PathVariable(name = "id") Integer id) {
String url = "http://user-service/User/" + id;
String user = restTemplate.getForObject(url, String.class);
return user;
} public String queryUserByIdFallback(Integer id){
return "系统繁忙。。。";
}
}
当加在类上时使用
DefaultProperties(defaultFallback = "queryUserByIdFallback")
为当前类中的任意一个微服务请求堵塞时调用该方法(此时返回值当为String 参数为空)
@RestController
@RequestMapping("User")
@DefaultProperties(defaultFallback = "queryUserByIdFallback")
public class UserController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("{id}")
//此时只需要开启降级服务就好 在类上已经提供了默认的回退设置
@HystrixCommand
public String selectById(@PathVariable(name = "id") Integer id) {
String url = "http://user-service/User/" + id;
String user = restTemplate.getForObject(url, String.class);
return user;
}
public String queryUserByIdFallback(){
return "系统繁忙。。。";
}
}

堵塞的默认超时时长为1秒也可以自己定义

找到自定义时长的key execution.isolation.thread.timeoutInMilliseconds

修改默认时长为2秒(只能修改单个的请求时长)
@HystrixCommand(commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "2000")
})
public String selectById(@PathVariable(name = "id") Integer id) {
String url = "http://user-service/User/" + id;
String user = restTemplate.getForObject(url, String.class);
return user;
}
配置全局的请求默认时长 application.yaml
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 2000
只针对其中的一个Controller配置
hystrix:
command:
user-service:
execution:
isolation:
thread:
timeoutInMilliseconds: 2000
TZ_13_Hystix的服务降级_线程隔离的更多相关文章
- Spring Cloud--Hystrix服务熔断(线程隔离/服务降级)代码实现
一旦服务阻塞就进行服务降级或线程隔离.要不然就会导致大面积服务的瘫痪,Hystrix就是干这个的,一出现不健康的服务就进行熔断,不阻塞后面线程的执行. 引入依赖: 加注解: 这三个注解可以用一个注解搞 ...
- Spring Cloud (7) 服务容错保护-Hystrix服务降级
在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以互相调用,在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用.为了保证其高可用,单个服务通常会集群 ...
- 五. SpringCloud服务降级和熔断
1. Hystrix断路器概述 1.1 分布式系统面临的问题 复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败.这就造成有可能会发生服务雪崩.那么什么是服务雪崩呢 ...
- 使用Hystrix实现自动降级与依赖隔离-微服务
转载: https://www.jianshu.com/p/138f92aa83dc Hystrix出现的原因: hystrix是netflix开源的一个容灾框架,解决当外部依赖故障时拖垮业务系统.甚 ...
- SpringCloud实战-Hystrix请求熔断与服务降级
我们知道大量请求会阻塞在Tomcat服务器上,影响其它整个服务.在复杂的分布式架构的应用程序有很多的依赖,都会不可避免地在某些时候失败.高并发的依赖失败时如果没有隔离措施,当前应用服务就有被拖垮的风险 ...
- 服务容错保护断路器Hystrix之六:服务熔断和服务降级
伴随着微服务架构被宣传得如火如荼,一些概念也被推到了我们面前(管你接受不接受),其实大多数概念以前就有,但很少被提的这么频繁(现在好像不提及都不好意思交流了).想起有人总结的一句话,微服务架构的特点就 ...
- 转: 使用Hystrix实现自动降级与依赖隔离
使用Hystrix实现自动降级与依赖隔离 原创 2017年06月25日 17:28:01 标签: 异步 / 降级 869 这篇文章是记录了自己的一次集成Hystrix的经验,原本写在公司内部wiki里 ...
- dubbo熔断,限流,服务降级
1 写在前面 1.1 名词解释 consumer表示服务调用方 provider标示服务提供方,dubbo里面一般就这么讲. 下面的A调用B服务,一般是泛指调用B服务里面的一个接口. 1.2 拓扑图 ...
- 使用Hystrix进行微服务降级管理
前言:目前我们的项目是微服务架构,基于dubbo框架,服务之间的调用是通过rpc调用的.刚开始没有任何问题,项目运行健康.良好.可是过了一段时间,线上总有人反应查询订单失败,等过了一段时间才能查到.这 ...
随机推荐
- [转]Hessian——轻量级远程调用方案
Hessian是caucho公司开发的一种基于二进制RPC协议(Remote Procedure Call protocol)的轻量级远程调用框架.具有多种语言的实现,但用的最多的当然是Java实现 ...
- DISTINCT 方法用于返回唯一不同的值 。
DISTINCT 方法用于返回唯一不同的值 . 例如: $Model->distinct(true)->field('name')->select(); 生成的SQL语句是: SEL ...
- Eclipse连接android模拟器
1.打开eclipse 2.打开MuMu模拟器 3.去到MuMu模拟器 adb_server.exe 文件所在目录:(我的:I:\Android\mumu\emulator\nemu\vmonitor ...
- SQLite C++操作类
为了方便SQLite的使用,封装了一个SQLite的C++类,同时支持ANSI 和UNICODE编码.代码如下: 头文件(SQLite.h) [cpp] view plaincopy /***** ...
- codevs1222 信与信封的问题
二分图匹配. 先匹配一次,一定是完美匹配.然后枚举每条边,去掉它,若是不能完美匹配,这条边就必须. #include<cstdio> #include<cstring> #in ...
- 查看pip install *.whl 支持的文件版本
import pip._internalprint(pip._internal.pep425tags.get_supported())[('cp37', 'cp37m', 'manylinux2010 ...
- React中的this.props.children
React this.props.children this.props对象的属性与组件的属性一一对应,但是有一个例外,就是this.props.children属性.它表示组件的所有子节点. var ...
- python实现批量修改服务器密码
需求:机房.线上有多台主机,为了保障安全,需要定期修改密码.若手动修改,费时费力易出错. 程序应该满足如下需求 : 1.在现有的excel密码表格,在最后一个字段后面生成新的密码,另存为一个新的exc ...
- logcat日志文件
android日志系统提供了记录和查看系统调试信息的功能,日志都是从各个软件和一些系统的缓冲区中记录下来的,缓冲区可以通过logcat命令来进行查看和使用 开发者选项,有个选项叫做“日志记录器缓冲区大 ...
- 百度编辑器上传视频以及视频编辑器预览bug解决
百度编辑器目前来讲是运用比较广泛的一个编辑器了,不仅开源还有中文的文档,所以很受欢迎,不过里面也有许多地方需要开发人员自己调试,其中一个比较常见的问题就是上传视频了,上传视频本身有一些小bug,这个基 ...