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的服务降级_线程隔离的更多相关文章

  1. Spring Cloud--Hystrix服务熔断(线程隔离/服务降级)代码实现

    一旦服务阻塞就进行服务降级或线程隔离.要不然就会导致大面积服务的瘫痪,Hystrix就是干这个的,一出现不健康的服务就进行熔断,不阻塞后面线程的执行. 引入依赖: 加注解: 这三个注解可以用一个注解搞 ...

  2. Spring Cloud (7) 服务容错保护-Hystrix服务降级

    在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以互相调用,在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用.为了保证其高可用,单个服务通常会集群 ...

  3. 五. SpringCloud服务降级和熔断

    1. Hystrix断路器概述 1.1 分布式系统面临的问题 复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败.这就造成有可能会发生服务雪崩.那么什么是服务雪崩呢 ...

  4. 使用Hystrix实现自动降级与依赖隔离-微服务

    转载: https://www.jianshu.com/p/138f92aa83dc Hystrix出现的原因: hystrix是netflix开源的一个容灾框架,解决当外部依赖故障时拖垮业务系统.甚 ...

  5. SpringCloud实战-Hystrix请求熔断与服务降级

    我们知道大量请求会阻塞在Tomcat服务器上,影响其它整个服务.在复杂的分布式架构的应用程序有很多的依赖,都会不可避免地在某些时候失败.高并发的依赖失败时如果没有隔离措施,当前应用服务就有被拖垮的风险 ...

  6. 服务容错保护断路器Hystrix之六:服务熔断和服务降级

    伴随着微服务架构被宣传得如火如荼,一些概念也被推到了我们面前(管你接受不接受),其实大多数概念以前就有,但很少被提的这么频繁(现在好像不提及都不好意思交流了).想起有人总结的一句话,微服务架构的特点就 ...

  7. 转: 使用Hystrix实现自动降级与依赖隔离

    使用Hystrix实现自动降级与依赖隔离 原创 2017年06月25日 17:28:01 标签: 异步 / 降级 869 这篇文章是记录了自己的一次集成Hystrix的经验,原本写在公司内部wiki里 ...

  8. dubbo熔断,限流,服务降级

    1 写在前面 1.1 名词解释 consumer表示服务调用方 provider标示服务提供方,dubbo里面一般就这么讲. 下面的A调用B服务,一般是泛指调用B服务里面的一个接口. 1.2 拓扑图 ...

  9. 使用Hystrix进行微服务降级管理

    前言:目前我们的项目是微服务架构,基于dubbo框架,服务之间的调用是通过rpc调用的.刚开始没有任何问题,项目运行健康.良好.可是过了一段时间,线上总有人反应查询订单失败,等过了一段时间才能查到.这 ...

随机推荐

  1. [转]Hessian——轻量级远程调用方案

    Hessian是caucho公司开发的一种基于二进制RPC协议(Remote Procedure Call protocol)的轻量级远程调用框架.具有多种语言的实现,但用的最多的当然是Java实现 ...

  2. DISTINCT 方法用于返回唯一不同的值 。

    DISTINCT 方法用于返回唯一不同的值 . 例如: $Model->distinct(true)->field('name')->select(); 生成的SQL语句是: SEL ...

  3. Eclipse连接android模拟器

    1.打开eclipse 2.打开MuMu模拟器 3.去到MuMu模拟器 adb_server.exe 文件所在目录:(我的:I:\Android\mumu\emulator\nemu\vmonitor ...

  4. SQLite C++操作类

    为了方便SQLite的使用,封装了一个SQLite的C++类,同时支持ANSI 和UNICODE编码.代码如下:   头文件(SQLite.h) [cpp] view plaincopy /***** ...

  5. codevs1222 信与信封的问题

    二分图匹配. 先匹配一次,一定是完美匹配.然后枚举每条边,去掉它,若是不能完美匹配,这条边就必须. #include<cstdio> #include<cstring> #in ...

  6. 查看pip install *.whl 支持的文件版本

    import pip._internalprint(pip._internal.pep425tags.get_supported())[('cp37', 'cp37m', 'manylinux2010 ...

  7. React中的this.props.children

    React this.props.children this.props对象的属性与组件的属性一一对应,但是有一个例外,就是this.props.children属性.它表示组件的所有子节点. var ...

  8. python实现批量修改服务器密码

    需求:机房.线上有多台主机,为了保障安全,需要定期修改密码.若手动修改,费时费力易出错. 程序应该满足如下需求 : 1.在现有的excel密码表格,在最后一个字段后面生成新的密码,另存为一个新的exc ...

  9. logcat日志文件

    android日志系统提供了记录和查看系统调试信息的功能,日志都是从各个软件和一些系统的缓冲区中记录下来的,缓冲区可以通过logcat命令来进行查看和使用 开发者选项,有个选项叫做“日志记录器缓冲区大 ...

  10. 百度编辑器上传视频以及视频编辑器预览bug解决

    百度编辑器目前来讲是运用比较广泛的一个编辑器了,不仅开源还有中文的文档,所以很受欢迎,不过里面也有许多地方需要开发人员自己调试,其中一个比较常见的问题就是上传视频了,上传视频本身有一些小bug,这个基 ...