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. Hibernate的Hello World!

    一.创建Java工程,新建Lib文件夹,加入Hibernate和数据库(如MySql.Oracle.SqlServer等)的Jar包 二.创建 hibernate.cfg.xml 文件,并配置,配置项 ...

  2. leetcode-80-删除排序数组中的重复项②

    题目描述: 第一次提交: class Solution: def removeDuplicates(self, nums: List[int]) -> int: nums.reverse() f ...

  3. 【JZOJ3423】Vani和Cl2捉迷藏&【BZOJ1143】祭祀river

    description vani和cl2在一片树林里捉迷藏-- 这片树林里有N座房子,M条有向道路,组成了一张有向无环图. 树林里的树非常茂密,足以遮挡视线,但是沿着道路望去,却是视野开阔.如果从房子 ...

  4. pandas的使用方法

    一.基本使用方法 # pandas引入约定 import pandas as pd from pandas import Series,DataFrame import numpy as np imp ...

  5. 凉凉了,Eureka 2.x 停止维护,Spring Cloud 何去何从?

    今年 Dubbo 活了,并且被 Apache 收了.同时很不幸,Spring Cloud 下的 Netflix Eureka 组件项目居然宣布停止开发了.. 已经从 Dubbo 迁移至 Spring ...

  6. ubuntu 更新国内源

    1.备份原有源列表 sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup 2. 修改文件并添加国内源 vi /etc/apt/sourc ...

  7. HttpException (0x80004005): 无法连接到 SQL Server 会话数据库

    ASP.NET 项目运行时出现错误提示:[HttpException (0x80004005): 无法连接到 SQL Server 会话数据库.] ,后排查问题发现是由于项目的Session模式是使用 ...

  8. ES6之主要知识点(六)数组

    引自http://es6.ruanyifeng.com/#docs/array 1.扩展运算符(...) 扩展运算符(spread)是三个点(...).它好比 rest 参数的逆运算,将一个数组转为用 ...

  9. elasticsearch 中文API 记数(八)

    计数API 计数API允许开发者简单的执行一个查询,返回和查询条件相匹配的文档的总数.它可以跨多个索引以及跨多个类型执行. import static org.elasticsearch.index. ...

  10. 2019-8-31-dotnet-通过-WMI-获取系统安装的驱动

    title author date CreateTime categories dotnet 通过 WMI 获取系统安装的驱动 lindexi 2019-08-31 16:55:59 +0800 20 ...