Spring Cloud 容错机试 Hystrix 服务降级 RestTemplate:

Ribon的服务降级操作

雪崩效应:

 如果短信服务炸了后面的所有服务就会起连锁反应造成全部服务挂掉这就是雪崩效应那么其实短信服务又不是我们主要业务这个时候我们可以采用服务降级服务降级就是暂时的把短信服务停掉能用就返回不能用就返回个错误但是它也不会影响到我们的主业务,这样就会保障我们主要服务的正常运行

总结下其实就是对于我们的非主线业务我们一般会才去服务降级的方式保证我们的主要业务正常的运行

服务降级或者是容错我们才使用springcloud提供的Hystrix(豪猪)进行操作:

首先我们在member项目上进行测试

输入测试地址:http://localhost:8088/test?bid=1返回的信息如下图所示

 返回的controller使我们的Ribbon对RestTemplate做的集群请求,如下所示:

 我们把book的服务停掉来看下结果:

我们发现我们的book服务访问不到了但是这样是不成的我们来给用户看其实是因为book的模块因为压力太大我手动的给停掉了(后续会使用熔断器进行操作)

所以下面我们使用Hyxtrix进行操作,首先我们先导入Hyxtrix的依赖,在member的pom.xml文件中

<!--Hyxtrix的依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

然后在Member项目启动类添加一个注解:

package com.laosan.member;
@SpringBootApplication
@EnableFeignClients     //开启feign客户端
@EnableCircuitBreaker   //开启断路器
public class MemberApplication {
   public static void main(String[] args) {
      SpringApplication.run(MemberApplication.class, args);
   }
    /**
     * 注入一个RestTemplate
     * @return
     */
   @Bean
    @LoadBalanced   //对RestTemplate对象进行负载均衡操作
   public RestTemplate  getRestTemplate() {
        RestTemplate restTemplate = new RestTemplate();
        return restTemplate;
    }
}

回到我们Controller中要对test这个方法写一个服务降级的方法

具体的解决如下所示:

/**
 * 远程调用我们需要的book服务里面对应的操作
 * @param bid
 * @return
 */
@GetMapping("/test")
@ResponseBody
@HystrixCommand(fallbackMethod = "fallbback")   //服务降级对应的方法
public String test(Long bid) {
    String json = restTemplate.getForObject("http://book/info?bid="+bid, String.class);
    return json;
}

/**
 * 服务降级
 * 该方法的名字随便起
 * 但是该服务降级的方法要求返回值和参数与目标方法保持一致
 * 最后还要在目标方法上添加一个注解
 * @param bid
 * @return
 */
private String fallbback(Long bid) {
    return "当前服系统正忙,请稍后再试。。。";
}

然后我们通过浏览器进行测试

返回我们对服务降级所要的结果

但是我们还是有个问题,就是Controller中有多个方法需要服务降级,那么我们就要为每一个方法写一个对应的降级方法,这个时候我们就需要写一个通用的全局的服务降级方法

首先我们要在该Controller中添加一个注解

@Controller
@CrossOrigin    //跨域问题的解决
@DefaultProperties(defaultFallback = "defaultFallBack")
public class MemberController {
    @Autowired
    private MemberService memberServic

定义一个服务降级的方法

/**
 * 全局的默认的服务降级方法,不需要参数,且返回String或者任何可以被Json序列化的对象
 * @return
 */
private String defaultFallBack() {
     return "【默认服务降级】当前服系统正忙,请稍后再试。。。";
}

对应的服务降级的方法上面的注解也需要改变下,如下所示:

/**
 * 远程调用我们需要的book服务里面对应的操作
 * @param bid
 * @return
 */
@GetMapping("/test")
@ResponseBody
//@HystrixCommand(fallbackMethod = "fallbback")   //服务降级对应的方法
@HystrixCommand     //找的是上面定义的默认的服务降级的方法
public String test(Long bid) {

}

但是现在还有个问题就是超时的问题,如果请求超出了时间Hystrix也会对我们进行服务的降级,测试如下所示,我们把我们的book服务启动,并在book的Controller的info方法中设置一个时间:

@GetMapping("/info")
@ResponseBody
public Map<String, Object> info(Long bid){
    //测试服务降级我们在这里添加了一个2秒的等待时间
    try {
        Thread.sleep(2000L);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    Map<String, Object> map = new HashMap<String, Object>();
    try {
        Book book = bookService.getInfo(bid);
        map.put("code", "0");
        map.put("message", "success");
        map.put("data", book);
    } catch (Exception e) {
        e.printStackTrace();
        map.put("code", e.getClass().getSimpleName());
        map.put("message", e.getMessage());
    }
    return map;
}

启动book服务

我们通过浏览器来查看会不会对我们进行一个服务降级的操作呢,在浏览器进行测试,如下所示:

 我们发现也发生了服务降级

这样的话是不太好的我们需要对服务降级的时间进行设置,因为他的默认服务降级的时间是1秒,多于1秒立刻服务降级

具体操作如下所示:

我们要在member项目中创建一个配置文件application.yml文件进行配置:


#设置服务降级的最大降级时间
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 3000

最后在浏览器进行测试

Spring Cloud 容错机试 Hystrix 服务降级 Feign

我们回到book项目进行操作:

首先我们打开bootstrap.yml进行操作:

spring:
  application:
    name: book   #这里的名字必须要和Eureka中的服务名称,和配置中心的名字保持一致
  #开启配置中心
  cloud:
    config:
      discovery:
        enabled: true
        service-id: config   #这里的名字要和我Eureka服务中的配置中心名称的服务保持一致
      profile: dev
#注册进服务
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
#在feign中开启hystrix
feign:
  hystrix:
    enabled: true

然后我们打开book项目client包下feign的客户端进行操作:

具体的想法是虽然你的服务挂掉的但是通过hystriy返回一个类似的真实数据

我们发现因为我们feign是个接口没办法进行操作那么我们可以在接口中写一个静态内部类进行实现就好具体的如下所示:boot服务中

package com.pb.client;

import com.pb.dto.MemberDTO;
import com.pb.vo.ResultVo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.Map;

@FeignClient(name="member",fallback = MemberClient.MemberClientFallBack.class)
public interface MemberClient {
        //调用member的服务请求为selectMemberByMobile的
        @RequestMapping("/selectMemberByMobile")
        ResultVo<MemberDTO> selectMemberByMobile(@RequestParam("mobile") String mobile);


        @Component
        //通过静态内部类来实现自己进行完成操作
        static  class MemberClientFallBack implements MemberClient{

                @Override
                public ResultVo<MemberDTO> selectMemberByMobile(String mobile) {
                        //启动服务降级并给一个假的数据返回个调用方
                        ResultVo<MemberDTO> resultVO = new ResultVo<>();
                        resultVO.setCode(200);
                        resultVO.setMessage("success");
                        MemberDTO memberDTO = new MemberDTO();
                        memberDTO.setMid(0L);
                        resultVO.setData(memberDTO);
                        return resultVO;
                }
        }

}
@Transactional
@Override
public void takeBookBookrow(String mobile,Long bid,  Date takedate, Date returndate) {
    Book book=null;
    Optional<Book> option = bookRespository.findById(bid);
    if (option.isPresent()){
        book=option.get();
    }else {
        throw  new BookNotFoundException("图书未找到");
    }

    //库存是否为0
    if (book.getStock()<=0){
        throw  new BookLessException("库存不足");
    }

    //开始插入借书的记录 ,有个数据要先处理一下  mid
    MemberDTO memberDTO=null;

    ResultVo<MemberDTO> result = memberClient.selectMemberByMobile(mobile);
    if (result.getCode() == 200){
        memberDTO=result.getData();
        if (memberDTO.getMid()==0){
            throw  new RuntimeException("输入错误");
        }
    }

    //借书记录插入
    Borrow borrow=new Borrow();
    borrow.setBid(bid);
    borrow.setMid(memberDTO.getMid());  //*
    borrow.setCreatetime(new Date());
    borrow.setTakedate(takedate);
    borrow.setReturndate(returndate);

    //插入下
    borrowRepository.save(borrow);

    //修改库存
    book.setStock(book.getStock()-1);
    bookRespository.saveAndFlush(book);
}

好我们先把book的服务停掉然后启动我们的前台页面index.html

Hystrix断路器:(必须和服务降级联合使用)

改造member项目的Controller里面的内容:

/**
 * 远程调用我们需要的book服务里面对应的操作

*/
@GetMapping("/test")
@ResponseBody
//@HystrixCommand(fallbackMethod = "fallbback")   //服务降级对应的方法
@HystrixCommand
public String test(Long bid) {
        String json = null;
    if(bid % 2 == 0) {
       json = restTemplate.getForObject("http://book/info?bid=" + bid, String.class);
    }
    else {
        json = "success";
    }
    return json;
}

进行对断路器时间的设置:

hystrix:

  command:

    default:

      execution:

        isolation:

          thread:

            timeoutInMilliseconds: 3000

      circuitBreaker:

        requestVolumeThreshold : 10   #10个请求

        sleepWindowInMilliseconds: 10000   #休息10秒 中

        errorThresholdPercentage: 60    #错误的请求达到60%

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

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

相关文章

springboot服务端接口公网远程调试 - 实现HTTP服务监听【端口映射】

文章目录 前言1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 windows系统2.1.2 linux系统 2.2 创建隧道映射本地端口2.3 测试公网地址 3. 固定公网地址3.1 保留一个二级子域名3.2 配置二级子域名3.2 测试使用固定公网地址…

安装CHATGPT保姆级教程(windows版)

ai包链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1tKuG4OfkewlDRU292vx8mw?pwdtw8t 提取码&#xff1a;tw8t 一、安装篇 安装python&#xff0c;使用软件包中的python安装程序安装后检查是否安装成功&#xff0c;cmd窗口运行命令&#xff1a; python –vers…

python自动化爬虫实战

python自动化爬虫实战 偶然的一次机会再次用到爬虫&#xff0c;借此机会记录一下爬虫的学习经历&#xff0c;方便后续复用。 需求&#xff1a;爬取网站数据并存入的csv文件中&#xff0c;总体分为两步 爬取网站数据存到到csv文件中 1、配置爬虫环境 1.1、下载自动化测试驱动 …

【2023最新】Python + Pycharm + Anaconda安装配置一条龙

【2023最新】Python Pycharm Anaconda安装配置一条龙 文章目录 【2023最新】Python Pycharm Anaconda安装配置一条龙1. Python1.1 Python下载1.2 Python安装1.3 测试 2. Pycharm2.1 Pycharm下载2.2 Pycharm安装配置2.3 你好Pycharm 3. Anaconda3.1 Anaconda下载3.2 Anacond…

【网络】TCP通讯(三次握手、四次挥手;滑动窗口;TCP状态转换;端口复用;TCP心跳检测机制)

前言&#xff1a;建议看着图片&#xff0c;根据文字描述走一遍TCP通讯过程&#xff0c;加深理解。 目录 TCP通信时序&#xff1a; 1&#xff09;建立连接&#xff08;三次握手&#xff09;的过程&#xff1a; 2&#xff09;数据传输的过程&#xff1a; 3&#xff09;关闭连…

opencv4 傅里叶变换

傅里叶变换 ① 高频&#xff1a;变化剧烈的灰度分量&#xff0c;例如边界礁石。 ② 低频&#xff1a;变化缓慢的灰度分量&#xff0c;例如一片大海。 ③ 高通滤波器&#xff1a;只保留高频&#xff0c;会使得图像细节增强。高频边界锐化了&#xff0c;增强了&#xff0c;细节…

网瘾少年转行软件测试,月薪20k? 叛逆少年终归成长...

前言&#xff1a; 高中住校期间沉迷游戏&#xff08;DNF&#xff09;,尤其是高三那年,晚上翻墙出去通宵&#xff0c;白天上课睡觉&#xff0c;高考自然是考了个稀碎&#xff0c;高考结束那个暑假刚开始觉得整个人都自由了&#xff0c;爸妈看我没考上大学&#xff0c;知道我心情…

Sql Server 自动备份

Sql Server 自动备份 文章目录 Sql Server 自动备份1. 打开SQL Server&#xff0c;在管理下找到”维护计划”&#xff0c;右键点击”维护计划向导”&#xff0c;如图&#xff1b;2. 再次点击维护计划向导3. 在选择维护任务下勾选”备份数据库”、”清楚维护任务”4.选择需要备份…

北邮22信通:二叉树显示路径的两种方法 递归函数保存现场返回现场的实例

北邮22信通一枚~ 跟随课程进度每周更新数据结构与算法的代码和文章 持续关注作者 解锁更多邮苑信通专属代码~ 获取更多文章 请访问专栏~ 北邮22信通_青山如墨雨如画的博客-CSDN博客 一.讲解 要想实现二叉树的路径显示&#xff0c;我们要按照…

每日一题——三数之和(双指针)

每日一题 三数之和 题目链接 思路 解析函数原型 首先我们来看一下题目给的函数原型&#xff1a; int** threeSum(int* nums, int numsSize, int* returnSize, int**returnColumnSizes)题目要求我们返回一个二维数组&#xff0c;数组的行数代表着存在多少个满足条件的三元组&…

基于SVM的鸢尾花数据集回归分析

目录 1. 作者介绍2. SVM支持向量机算法2.1 鸢尾花数据集2.2 鸢尾花数据集可视化2.2.1 散点图2.2.2 箱型图2.2.3 三维散点图&#xff08;3D&#xff09; 3. SVM算法实现3.1 完整代码3.2 运行结果3.3 问题与分析 1. 作者介绍 张佳伦&#xff0c;男&#xff0c;西安工程大学电子信…

Cuda | Cudnn安装及其配置

文章目录 &#x1f449;引言&#x1f48e;一、Cuda安装1 选择Cuda版本2下载及运行安装程序3 测试 二、Cudnn安装1、进入官网下载对应cuda版本的cudnn2、下载好相应版本并进行解压安装3、解压完成后4、测试 &#x1f449;引言&#x1f48e; 学习的最大理由是想摆脱平庸&#xf…

stable diffusion图片资源分享和模型推荐,好用的模型有哪些呢?

前言 这篇文章主要是分享我的图片和推荐一些好用的模型&#xff0c;模型不在多在于精&#xff0c;基于几个好的大模型适当下载一下LORA模型&#xff0c;就能画出非常好的图片&#xff0c;多话不说 图片分享 简单展示 详情请看&#xff1a;https://space.bilibili.com/109890…

Linux基础篇 Ubuntu 22.04的环境安装-02

目录 一、资料的获取 二、安装虚拟机 三、安装Ubuntu过程 四、注意事项 一、资料的获取 1.通过官方网站下载 Ubuntu系统下载 | Ubuntuhttps://cn.ubuntu.com/download2.下载桌面板即可 3.选择下载的版本 二、安装虚拟机 1.创建新的虚拟机 2.选择自定义安装 3.硬件兼容性选…

Es elasticsearch 十九 kibana 可视化配置图表 及功能 集群部署

目录 Es kibana 可视化 下载zip 解压 bin/kibana.bat 启动 管理索引管理 吧logstash 存进来的数据 按照 xxx-* 方式 保存索引模式 通过 discove 配置可视化界面 图表数据实时刷新 时序图配置 饼图配置 表格数据配置 添加仪表盘 图表样例 使用后模拟绘制方法好看些 …

pandas数据预处理

pandas数据预处理 pandas及其数据结构pandas简介Series数据结构及其创建DataFrame数据结构及其创建 利用pandas导入导出数据导入外部数据导入数据文件 导出外部数据导出数据文件 数据概览及预处理数据概览分析利用DataFrame的常用属性利用DataFrame的常用方法 数据清洗缺失值处…

什么是Odoo ERP:部署方式、业务集成、成本投入、发展与未来

ERP部署的类型 如何部署ERP 系统&#xff1f;通过多年的发展&#xff0c;ERP系统的部署方式更加多样化&#xff0c;包括公有云或私有云部署、本地部署或整合不同环境的混合部署场景&#xff0c;企业可根据自身条件与应用场景加以选择。下面介绍了每种部署模式的主要优势&#…

动态规划-硬币排成线

动态规划-硬币排成线 1 描述2 样例2.1 样例 1:2.2 样例 2:2.3 样例 3: 3 算法解题思路及实现3.1 算法解题分析3.1.1 确定状态3.1.2 转移方程3.1.3 初始条件和边界情况3.1.4 计算顺序 3.2 算法实现3.2.1 动态规划常规实现3.2.2 动态规划滚动数组 该题是lintcode的第394题&#x…

在简历上写了“精通”后,我差点被面试官问到窒息....

前言 如果有真才实学&#xff0c;写个精通可以让面试官眼前一亮&#xff01; 如果是瞎写&#xff1f;基本就要被狠狠地虐一把里&#xff01; 最近在面试&#xff0c;我现在十分后悔在简历上写了“精通”二字… 先给大家看看我简历上的技能列表&#xff1a; 熟悉软件测试理…

基于相位共轭法的散射聚焦成像研究-Matlab代码

▒▒本文目录▒▒ 一、引言二、相位共轭法散射聚焦成像Matlab仿真三、参考文献四、Matlab程序开发与实验指导 一、引言 一直以来&#xff0c;研究人员致力于分析造成散射的原因、随机介质性质以及各种散射光的特征&#xff0c;并且研究透过散射介质成像。1990年&#xff0c;I.…