SpringCloud系列(31)--使用Hystrix进行服务降级

前言:在上一章节中我们创建了服务消费者模块,而本节内容则是使用Hystrix对服务进行服务降级处理。

1、首先我们先对服务提供者的服务进行服务降级处理
(1)修改cloud-provider-hystrix-payment8001子模块的PaymentServiceImpl类

注:@HystrixProperty注解的更多key/value参数设置可以查看HystrixCommandProperties 类

package com.ken.springcloud.service.impl;

import com.ken.springcloud.service.PaymentService;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

@Service
public class PaymentServiceImpl implements PaymentService {

    @Override
    public String paymentInfoOK(Integer id) {
        return "线程池:" + Thread.currentThread().getName() + "paymentInfoOK,id: " + id;
    }

    @Override
    //一旦调用服务方法失败并抛出了错误信息后,会自动调用@HystrixCommand标注好的fallbackMethod调用类中的指定方法,这里设置服务降级的条件为连接超时超过3秒,即3秒内走paymentInfoTimeOut方法内的业务逻辑,超过3秒走paymentInfoTimeOutHandler方法
    @HystrixCommand(fallbackMethod = "paymentInfoTimeOutHandler",commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")})
    public String paymentInfoTimeOut(Integer id) {
        int timeNumber = 5;
        try {
            TimeUnit.SECONDS.sleep(timeNumber);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "线程池:" + Thread.currentThread().getName() + "paymentInfoTimeOut,id: " + id + "耗时" + timeNumber + "秒";
    }

    public String paymentInfoTimeOutHandler(Integer id) {
        return "系统繁忙,请稍后再试";
    }

}
(2)修改cloud-provider-hystrix-payment8001子模块的PaymentHystrixMain8001启动类
package com.ken.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
//使用Feign,激活并开启
@EnableEurekaClient
//开启断路器功能
@EnableCircuitBreaker
public class PaymentHystrixMain8001 {

    public static void main(String[] args) {
        SpringApplication.run(PaymentHystrixMain8001.class, args);
    }

}
(3) 分别启动eureka-server7001、cloud-provider-hystrix-payment8001服务

效果图:

(4) 在浏览器的地址栏里分别输入http://localhost:8001/payment/hystrix/timeout/1通过调用这个接口查看服务提供者的服务降级功能是否正常运行

效果图:

由图可知服务提供者的服务降级成功,客户端连接cloud-provider-hystrix-payment8001服务超时后最后执行了paymentInfoTimeOutHandler方法,由paymentInfoTimeOutHandler方法进行兜底处理,而且值得注意的是正常调用服务使用到的线程池和服务降级时使用到的线程池不是同一个,这意味着hystrix用单独的一个线程池作服务降级处理,起到了隔离的效果

正常的:

降级处理的:

2、在上述的操作中我们对服务提供者的服务成功地进行了服务降级处理,接下来我们对服务消费者的服务同样进行服务降级处理
(1)修改cloud-consumer-feign-hystrix-order80子模块的application.yml文件,加上feign:hystrix:enabled:true的配置,使feign调用启用hystrix

关于feign:hystrix:enabled:true配置的相关官方文档,官方文档介绍如果配置feign.hystrix.Enabled=true,则Feign将使用断路器包装所有方法https://cloud.spring.io/spring-cloud-openfeign/reference/html/#spring-cloud-feign-hystrix-fallback

server:
  port: 8080
eureka:
  client:
    #表示是否将自己注册进Eureka Server里,默认为true
    register-with-eureka: false
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/

feign:
  client:
    config:
      default:
        #指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间
        connect-timeout: 5000
        #指的是建立连接后从服务器读取到可用资源所用的时间
        read-timeout: 5000
  #feign调用启用hystrix,启用后feign调用可以使用hystrix的服务降级、服务熔断、服务隔离等,从上述的设置可知feign请求超过5s就会进行服务降级、服务熔断、服务隔离等相关操作
  hystrix:
    enabled: true

#设置命令执行的超时时间,默认1000ms,因为开启了feign:hystrix:enabled:true,这里要设置为5000ms,否则设置ribbon的超时时间也没用,ribbon的超时时间会被强制改为了1000ms
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 5000
(2)修改cloud-consumer-feign-hystrix-order80子模块的OrderHystrixMain80启动类,开启断路器功能
package com.ken.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
//使用Feign,激活并开启
@EnableFeignClients
//开启断路器功能
@EnableCircuitBreaker
public class OrderHystrixMain80 {

    public static void main(String[] args) {
        SpringApplication.run(OrderHystrixMain80.class, args);
    }

}
(3)修改cloud-provider-hystrix-payment8001子模块的PaymentServiceImpl类,把睡眠时间调为2秒,模拟服务提供者正常运行
package com.ken.springcloud.service.impl;

import com.ken.springcloud.service.PaymentService;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

@Service
public class PaymentServiceImpl implements PaymentService {

    @Override
    public String paymentInfoOK(Integer id) {
        return "线程池:" + Thread.currentThread().getName() + "paymentInfoOK,id: " + id;
    }

    @Override
    //一旦调用服务方法失败并抛出了错误信息后,会自动调用@HystrixCommand标注好的fallbackMethod调用类中的指定方法,这里设置服务降级的条件为连接超时超过3秒,即3秒内走paymentInfoTimeOut方法内的业务逻辑,超过3秒走paymentInfoTimeOutHandler方法
    @HystrixCommand(fallbackMethod = "paymentInfoTimeOutHandler",commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")})
    public String paymentInfoTimeOut(Integer id) {
        int timeNumber = 2;
        try {
            TimeUnit.SECONDS.sleep(timeNumber);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "线程池:" + Thread.currentThread().getName() + "paymentInfoTimeOut,id: " + id + "耗时" + timeNumber + "秒";
    }

    public String paymentInfoTimeOutHandler(Integer id) {
        return "线程池:" + Thread.currentThread().getName() + "系统繁忙,请稍后再试";
    }

}
(4)修改cloud-consumer-feign-hystrix-order80子模块的OrderHystrixController类,设置超时时间为1.5秒,这里是模拟服务消费者端的响应时间短但是服务提供者端返回资源的时间长,从而观察服务消费者端在超时后会作出什么反应
package com.ken.springcloud.controller;

import com.ken.springcloud.service.PaymentHystrixService;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController
public class OrdertHystrixController {

    @Resource
    private PaymentHystrixService paymentHystrixService;

    @GetMapping("/consumer/payment/hystrix/ok/{id}")
    public String paymentInfoOK(@PathVariable("id") Integer id) {
        String result = paymentHystrixService.paymentInfoOK(id);
        return result;
    }

    @GetMapping("/consumer/payment/hystrix/timeout/{id}")
    //一旦调用服务方法失败并抛出了错误信息后,会自动调用@HystrixCommand标注好的fallbackMethod调用类中的指定方法,这里设置服务降级的条件为连接超时超过3秒,即3秒内走paymentInfoTimeOut方法内的业务逻辑,超过3秒走paymentInfoTimeOutHandler方法
    @HystrixCommand(fallbackMethod = "paymentInfoTimeOutHandler",commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "1500")})
    public String paymentInfoTimeOut(@PathVariable("id") Integer id) {
        String result = paymentHystrixService.paymentInfoTimeOut(id);
        return result;
    }

    public String paymentInfoTimeOutHandler(Integer id) {
        return "服务提供者繁忙,请稍后再试";
    }

}
(5) 分别启动eureka-server7001、cloud-provider-hystrix-payment8001服务、cloud-consumer-feign-hystrix-order80服务

效果图:

(6) 在浏览器的地址栏里分别输入http://localhost:8080/consumer/payment/hystrix/timeout/1通过调用这个接口查看服务消费者的服务降级功能是否正常运行

由图可知服务消费者的服务降级成功,服务消费者连接服务提供者的服务超过1.5秒后超时,最后执行了paymentInfoTimeOutHandler方法,由paymentInfoTimeOutHandler方法进行兜底处理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/644776.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Stream流的使用

目录 一,Stream流 1.1 概述 1.2 Stream代码示例 二,Stream流的使用 2.1 数据准备 2.2 创建流对象 2.3 中间操作 filter map distinct sorted limit skip flatMap 2.4 终结操作 foreach count max&min collect 2.5 查找与匹配 a…

秒级达百万高并发框架Disruptor

1、起源 Disruptor最初由lmax.com开发,2010年在Qcon公开发表,并于2011年开源,企业应用软件专家Martin Fowler专门撰写长文介绍,同年它还获得了Oracle官方的Duke大奖。其官网定义为:“High Performance Inter-Thread M…

2022年CSP-J入门级第一轮初赛真题

一、单项选择题(共15题,每题2分,共计30分;每题有且仅有一个正确选项) 第 1 题 在内存储器中每个存储单元都被赋予一个唯一的序号,称为()。 A. 地址B. 序号C. 下标D. 编号 第 2 题 编…

Spring MVC+mybatis 项目入门:旅游网(三)用户注册——控制反转以及Hibernate Validator数据验证

个人博客:Spring MVCmybatis 项目入门:旅游网(三)用户注册 | iwtss blog 先看这个! 这是18年的文章,回收站里恢复的,现阶段看基本是没有参考意义的,技术老旧脱离时代(2024年辣铁铁&…

Leetcode 剑指 Offer II 079.子集

题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定一个整数数组 nums ,数组中的元素 互不相同 。返…

Introduction of Internet 计算机网络概述

计算机网络的概念 计算机网络的定义: 多台独立的计算机通过通信线路实现资源共享的计算机系统 计算机网络的组成 资源子网:提供共享的软件资源和硬件资源 通信子网:提供信息交换的网络结点和通信线路 计算机网络类型 按照拓扑排序 星型…

KVM+GFS分布式存储系统构建KVM高可用

KVMGFS分布式存储系统构建KVM高可用 文章目录 KVMGFS分布式存储系统构建KVM高可用资源列表基础环境一、安装部署KVM1.1、安装KVM1.2、验证1.3、开启libvirtd服务1.4、配置KVM桥接网络 二、部署GlusterFS2.1、安装GlusterFS软件2.2、所有node节点启动GFS2.3、创建GFS群集2.4、查…

[Linux]网络原理与配置

一.NAT模式网路配置 虚拟系统的IP地址处于随机网段,同时在母机上会额外有一个与虚拟IP地址网段相同的IP地址,可以实现母机与虚拟机的通信。虚拟系统的IP地址可以通过主机实际的IP地址作为代理IP,与外部系统进行通信。 优点:不造…

医疗科技:UWB模块为智能医疗设备带来的变革

随着医疗科技的不断发展和人们健康意识的提高,智能医疗设备的应用越来越广泛。超宽带(UWB)技术作为一种新兴的定位技术,正在引领着智能医疗设备的变革。UWB模块作为UWB技术的核心组成部分,在智能医疗设备中发挥着越来越…

JDBC总结

目录 JDBC(java database connection) JDBC连接数据库步骤: 1. 在项目中添加jar文件,如图所示 2.加载驱动类 向数据库中插入数据代码示例: 第一种: 第二种: 查询操作 : 第一种: 第二种: JDBC(java database connection) java数据库连接.api(应用程序编程接口) ,可…

怎么理解直接程序控制和中断方式?

直接程序控制 看完之后是不是依然一头雾水?来看下面两个例子 无条件传送 假设你正在使用键盘打字。当你敲击键盘上的一个键时,键盘会立即产生一个信号(即输入数据),并且这个信号会立即被电脑接收。在这个过程中&…

颜色值进制转换

颜色值进制转换 专业的和非专业程序员在编程时都碰到过颜色值的表达式。特别是在编制网页和设计界面时,都要选择颜色。各语言的颜色值表达式就两种,十六进制的颜色值hex$和十进制的RGB格式。现成的调色板颜色表也是这两种格式。写代码时会遇到写颜色值码…

懒人网址导航页 search.html SQL注入漏洞复现

0x01 产品简介 懒人网址导航系统是一种智能化的网址导航平台,旨在帮助用户快速找到所需的网址和资源。该系统提供了智能化的网址搜索和推荐功能,能够根据用户的搜索习惯和偏好推荐相关的网址和资源。同时,系统还提供了网址分类、网址收藏和网址分享等功能,方便用户管理和共…

镜子摆放忌讳多

镜子是我们日常生活中不可或缺的物品。在风水中,镜子的作用非常多,能够起到一定的作用。镜子的摆放位置也是非常有讲究的,摆放不好会直接影响到家人的事业、财运、婚姻乃至健康等诸多方面。 第一个风水忌讳,镜子对大门。大门的正前…

服务器硬件全攻略:从入门到精通,全面解析服务器性能与稳定性!

服务器是计算机网络中提供特定服务的计算机系统,其硬件配置和性能直接影响到整个网络系统的运行效率和稳定性。作为一个资深的技术人员,本文将全面详细地介绍服务器硬件基础知识,包括介绍、命令或语法、主要作用以及使用方法等。 一、介绍 服…

CV大作业28期-使用TensorFlow快速实现图像风格迁移系统

使用TensorFlow快速实现图像风格迁移系统 资源地址:待更新 视频地址:待更新 随着GPT的横空出世,生成式网络也越来越活,现在的大语言模型除了能回答文字上面的内容,并且在图像和视频创作中也表现除了巨大的潜力&#xf…

探索 Mistral 新发布的具有原生函数调用功能的 7B 模型【附notebook文件】

引言 Mistral 发布了新版的 7B 模型,这次更新引入了原生函数调用功能。对于开发者和 AI 爱好者来说,这一更新极具吸引力,因为它增强了模型的功能和实用性。在这篇博客中,我们将深入探讨这些新功能,展示如何使用该模型…

击穿盲点——【网络安全】社会工程学中的网络欺骗

社会工程学起源于上世纪60年代左右,是一种通过人际交流的方式来获得情报的非技术渗透手段。这种手段无需过多技术要求,却非常有效,目前已成为危害企业网络安全的重大威胁之一。著名黑客凯文米特尼克在《反欺骗的艺术》中曾提到,人…

深入理解计算机系统 家庭作业4.52

练习题4.3 p.254 \sim\seq\seq-full.hcl文件内已经说的很清楚了哪些不能更改,哪些是题目要求更改的控制逻辑块. 依据家庭作业4.51的答案,在seq-full.hcl文件内更改对应的HCL描述即可 以下答案注释了#changed的就是更改部分 #/* $begin seq-all-hcl */ ######################…