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. DMZ在虚拟化环境中的部署

    常见的方法有三种: 1.分别部署 2.部分虚拟化 3.全部虚拟化 传统DMZ部署结构: 分别部署: 想要保持DMZ区域物理隔离采用这种方法,每个区域分别部署进入不同的服务器集群,区域之间的连接采用物理 ...

  2. Jsp Layout 布局页

    本文章仅用于知识记录 /WEB-INF/tags/layout.tag <%@ tag language="java" pageEncoding="UTF-8&qu ...

  3. 拓扑排序+并查集——cf1131D

    以前做过了忘记掉了..拓扑排序如果要处理等于关系,就要用并查集把相等关系进行缩点 /* 1.相等关系用并查集合并 2.不等关系用有向边链接 3.拓扑排序求顺序 */ #include<bits/ ...

  4. import: not authorized `time' @ error/constitute.c/WriteImage/1028. import: not authorized `rospy' @ error/constitute.c/WriteImage/1028.

  5. VUE下echarts宽度响应式

    window.addEventListener("resize", () => { myChart2.resize();});

  6. iOS7新特性-完美解决iOS7关于自定义导航条UIBarButtonItem偏移的问题

    前言: 本文由DevDiv社区@Vincent 原创,转载请注明出处! http://www.devdiv.com/iOS_iPhone-ios_ios_uibarbuttonitem_-thread ...

  7. redis深入学习(一)-----CAP、redis数据类型

    NoSQL数据库的四大分类 KV键值: memcache+redis 文档型数据库(bson格式比较多): MongoDB MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在 ...

  8. Android基础控件ToggleButton和Switch开关按钮

    1.简介 ToggleButton和Switch都是开关按钮,只不过Switch要Android4.0之后才能使用! ToggleButton <!--checked 是否选择--> &l ...

  9. R语言:表格的线图转化

    R语言:表格的线图转化 最先选取的是北京各区普通住宅成交十年(2016年及2006年)涨幅对比.这张图比较plain,主要拿来练习: 1.数据表格的基本整理及计算 2. 数据的初步分析 3.线图的基本 ...

  10. 接口Interface解耦的理解

    定义一个接口 磁盘 interface Disk(){   void save(File file);   } U盘和硬盘都是磁盘,都实现这个接口 class UDisk implement Disk ...