1. 概述

老话说的好:做人要正直,做事要正派,胸怀坦荡、光明磊落,才会赢得他人的信赖与尊敬。

言归正传,之前聊了服务间通信的组件 Feign,今天我们来聊聊服务降级。

服务降级简单的理解就是给一个备选方案,当服务调用报错或者超时时,能终止远程调用,并很快的返回备选的结果,避免引发服务雪崩。

今天我们用两个例子,模拟一下 接口报错 和 接口超时 的服务降级实现。

我们使用 hystrix 实现服务降级,虽然从 Spring Cloud 2020.0 版本开始,移除了 hystrix 组件,但并不影响我们对他的使用。

闲话不多说,直接上代码。

2. 接口报错的服务降级

2.1 被调用服务

2.1.1 接口代码

    @GetMapping("/exception")
String exception() throws Exception;

2.1.2 实现类代码

    @Override
public String exception() throws Exception {
if(1==1) {
throw new Exception("模拟异常");
}
return null;
}

2.2 调用服务

2.2.1 主要依赖

        <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 健康检查 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency> <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.2.9.RELEASE</version>
</dependency>

这里 hystrix 使用目前的最新版本 2.2.9.RELEASE。

2.2.2 主要配置

feign:
circuitbreaker:
enabled: true # 开启 feign 的断路器 hystrix:
command:
default:
fallback:
enabled: true # 开启服务降级

2.2.3 降级工厂类的开发

@Component
public class MyEurekaClientServiceFactory implements FallbackFactory<EurekaClientService> {
@Override
public EurekaClientService create(Throwable cause) { return new EurekaClientService() { @Override
public String exception() throws Exception {
System.out.println("exception方法 降级");
return "exception方法 降级";
}
};
}
}

2.2.4 在 Feign 接口配置降级工厂类

@FeignClient(name = "my-eureka-client", fallbackFactory = MyEurekaClientServiceFactory.class)  // name为 调用服务的名称
@RequestMapping("/api")
public interface EurekaClientService { @GetMapping("/exception")
String exception() throws Exception; }

2.2.5 启动类增加 @EnableHystrix 注解

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@EnableHystrix
public class MyFeignApplication { public static void main(String[] args) {
SpringApplication.run(MyFeignApplication.class, args);
}
}

2.2.6 启动服务测试

可以正常进入降级方法。

3. 接口超时的服务降级

3.1 被调用服务

3.1.1 接口代码

    @GetMapping("/timeout")
String timeout(@RequestParam Integer timeoutSecond);

3.1.2 实现类代码

    @Override
public String timeout(Integer timeoutSecond) {
System.out.println("调用timeout方法");
try {
Thread.sleep(timeoutSecond * 1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "success:" + port;
}

3.2 调用服务

3.2.1 主要配置

feign:
client:
config:
# 全局配置
default:
connectTimeout: 1000 # 连接超时时间,单位ms
readTimeout: 3000 # 获取Response响应超时时间,单位ms # 针对 my-eureka-client 的 feign 配置,优先级高于全局配置
my-eureka-client:
connectTimeout: 300 # 连接超时时间,单位ms
readTimeout: 5000 # 获取Response响应超时时间,单位ms
circuitbreaker:
enabled: true # 开启 feign 的断路器 hystrix:
command:
default:
fallback:
enabled: true # 开启服务降级
execution:
timeout:
enabled: true # 全局超时配置
isolation:
thread:
timeoutInMilliseconds: 3000 # 超时时间配置
interruptOnTimeout: true # 超时后是否终止线程
interruptOnFutureCancel: true # 取消后是否终止线程

注意:feign 的 readTimeout 属性和 hystrix 的 timeoutInMilliseconds 属性会同时生效,以超时时间最短的为准。

3.2.2 降级工厂类的开发

@Component
public class MyEurekaClientServiceFactory implements FallbackFactory<EurekaClientService> {
@Override
public EurekaClientService create(Throwable cause) { return new EurekaClientService() { @Override
public String exception() throws Exception {
System.out.println("exception方法 降级");
return "exception方法 降级";
} @Override
public String timeout(Integer timeoutSecond) {
return "timeout方法 降级";
}
};
}
}

3.2.3 启动服务测试

可以正常进入降级方法。

4. 综述

今天聊了一下 服务降级 的相关知识,希望可以对大家的工作有所帮助。

欢迎帮忙点赞、评论、转发、加关注 :)

关注追风人聊Java,每天更新Java干货。

5. 个人公众号

追风人聊Java,欢迎大家关注

SpringCloud 2020.0.4 系列之服务降级的更多相关文章

  1. SpringCloud 2020.0.4 系列之服务降级的其他用法与熔断

    1. 概述 老话说的好:控制好自己的情绪,才能控制好自己的人生.冲动是魔鬼,冷静才最重要. 言归正传,之前聊了在 Feign 调用时,如何给整个 Feign接口类 增加降级策略. 今天我们来聊一下 H ...

  2. SpringCloud 2020.0.4 系列之 Feign

    1. 概述 老话说的好:任何问题都有不止一种的解决方法,当前的问题没有解决,只是还没有发现解决方法,而并不是无解. 言归正传,之前我们聊了 SpringCloud 的服务治理组件 Eureka,今天我 ...

  3. SpringCloud 2020.0.4 系列之 Stream 消息广播 与 消息分组 的实现

    1. 概述 老话说的好:事情太多,做不过来,就先把事情记在本子上,然后理清思路.排好优先级,一件一件的去完成. 言归正传,今天我们来聊一下 SpringCloud 的 Stream 组件,Spring ...

  4. SpringCloud 2020.0.4 系列之 Stream 延迟消息 的实现

    1. 概述 老话说的好:对待工作要有责任心,不仅要完成自己的部分,还要定期了解整体的进展. 言归正传,我们在开发产品时,常常会遇到一段时间后检查状态的场景,例如:用户下单场景,如果订单生成30分钟后, ...

  5. SpringCloud 2020.0.4 系列之 Stream 消息出错重试 与 死信队列 的实现

    1. 概述 老话说的好:出错不怕,怕的是出了错,却不去改正.如果屡次出错,无法改对,就先记下了,然后找援军解决. 言归正传,今天来聊一下 Stream 组件的 出错重试 和 死信队列. RabbitM ...

  6. SpringCloud 2020.0.4 系列之Eureka

    1. 概述 老话说的好:遇见困难,首先要做的是积极的想解决办法,而不是先去泄气.抱怨或生气. 言归正传,微服务是当今非常流行的一种架构方式,其中 SpringCloud 是我们常用的一种微服务框架. ...

  7. SpringCloud 2020.0.4 系列之 Bus

    1. 概述 老话说的好:会休息的人才更会工作,身体是革命的本钱,身体垮了,就无法再工作了. 言归正传,之前我们聊了 SpringCloud 的 分布式配置中心 Config,文章里我们聊了config ...

  8. SpringCloud 2020.0.4 系列之 Gateway入门

    1. 概述 老话说的好:做人要有幽默感,懂得幽默的人才会活的更开心. 言归正传,今天我们来聊聊 SpringCloud 的网关组件 Gateway,之前我们去访问 SpringCloud 不同服务的接 ...

  9. SpringCloud 2020.0.4 系列之Hystrix看板

    1. 概述 老话说的好:沉默是金,有时适当的沉默,比滔滔不绝更加有效. 言归正传,前面我们聊了有关 Hystrix 降级熔断的话题,今天我们来聊聊如何使用 turbine 和 hystrix dash ...

随机推荐

  1. 将两个byte型拼接成16位二进制,再转化为十进制

    short s = 0; //一个16位整形变量,初值为 0000 0000 0000 0000 byte b1 = 1; //一个byte的变量,作为转换后的高8位,假设初值为 0000 0001 ...

  2. wpf 多表头

    WPF多表头技术探索总结 方案一:Grid+TextBlock嵌套DataGrid方式. 该方案是现在项目中已使用的方案.实现起来比较简单,但不具有通用性,不同数据DataGrid需要指定不同的Tex ...

  3. 【转】Linux 查看端口占用情况

    Linux 查看端口占用情况可以使用 lsof 和 netstat 命令. lsof lsof(list open files)是一个列出当前系统打开文件的工具. lsof 查看端口占用语法格式: l ...

  4. jmeter之聚合报告(Aggregate Report)

    jmeter最常用的listener--聚合报告Aggregate Report,每一个字段的具体含义是什么? Label:每个请求的名称.每个 JMeter 的 element(例如 HTTP Re ...

  5. 自己写登陆验证及借用auth的is_authenticated验证是否登陆

    一. 自己写登陆需要注册,一个session的处理,还有一个session的删除 #自定义一个闭包装饰器,来验证def checkLogin(func): def wrapper(request, * ...

  6. 服务器内部模拟Http请求

    前言: 在做小程序的开发时需要获取用户的openId用来做唯一标识,来获取对应用户的相关数据 官方的文档说明上有四个必须传的参数 其中appId和appSecret可在自己的微信公众号平台上获取,同时 ...

  7. Docker安装Jenkins 从GitLab上拉取代码打包SpringBoot项目并部署到服务器

    1.  安装Jenkins 采用 Docker 方式安装 jenkins 首先,宿主机上需要安装java和maven,这里我的安装目录如下: 由于是docker安装,jenkins将来是在容器里面运行 ...

  8. 借jQuery对象拷贝学习深拷贝与浅拷贝

    jQuery.extend([deep], target, object1, [objectN]) 即用一个或多个其他对象来扩展一个对象,返回被扩展的对象. deep:如果设为true,则递归合并. ...

  9. Ysoserial Commons Collections2分析

    Ysoserial Commons Collections2分析 About Commons Collections2 CC2与CC1不同在于CC2用的是Commons Collections4.0; ...

  10. js 判断两个对象是否相等

    最近碰到的一个面试题,不算高频,记录一下 判断两个对象是否相等,大致分为三步 首先判断两个比较对象是不是 Object 如果都是对象 再比较 对象的长度是否相等 如果两个对象的长度相等 再比较对象属性 ...