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

news2024/11/30 2:47:27

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%

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java学习——ArrayList和泛型(学习记录)

学习资料来自菜鸟教程 ArrayList 类是一个可以动态修改的数组&#xff0c;与普通数组的区别就是它是没有固定大小的限制&#xff0c;我们可以添加或删除元素。 ArrayList 继承了 AbstractList &#xff0c;并实现了 List 接口。 ArrayList 类位于 java.util 包中&#xff0c;使…

事件驱动模型IO模型

什么是事件驱动模型&#xff1f; 事件驱动模型是一种计算机编程模型&#xff0c;它通过等待事件的触发&#xff0c;在事件被触发时执行对应的处理函数。这种模型下&#xff0c;程序不再按照严格的顺序执行命令&#xff0c;而是以事件为驱动进行执行。事件驱动模型更适合处理大…

[RSA议题分析] Finding Vulnerabilities through Static Analysis and Scripting

文章目录 简介议题分析发现漏洞 - 什么时候/为什么什么是漏洞挖掘漏洞价值 如何挖洞逆向工程环境从哪开始挑战 总结 简介 作者讲了挖漏洞的目标&#xff0c;和一些常用的挖漏洞的方法和如果你像现在开始挖掘二进制漏洞&#xff0c;那么你可以从memcpy开始。除此之外&#xff0…

【SpringBoot系列】Spring EL表达式的简介和快速入门

介绍 Sping EL&#xff08;Spring Expression Language 简称 SpEL&#xff09;是一种强大的表达式语言&#xff0c;支持在运行时查询和操作对象&#xff0c;它可以与 XML 或基于注解的 Spring 配置一起使用。语言语法类似于统一 EL&#xff0c;但提供了额外的功能,方法调用和字…

springboot+vue藏区特产销售平台(java项目源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的藏区特产销售平台。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风…

产品经理如何使用集简云实现工作流程自动化?

场景描述 作为一名产品经理&#xff0c;需要每天面对来自各个部门的需求&#xff0c;平时的工作内容更是复杂繁琐&#xff0c;画流程图、产品开发周期、产品描述、设计团队协作&#xff0c;新产品培训会、用户需求会&#xff0c;或跟进 bug 修复等等等等…… 对内不仅要参与业…

STM32与ESP32下载器设计

文章目录 背景STM32下载器使用现成的DAPlink选择自制DAPlink ESP32/ESP8266下载器连接接口STM32接口ESP32接口 背景 我们常用的单片机主要有STM32和ESP32&#xff0c;其中STM32下载要求SWD下载接口&#xff0c;ESP32下载要求串口&#xff0c;但需要控制ESP32 IO0和EN口高低电平…

前端人必须掌握的抓包技能(原理到实践)

目录 1. 前言 2. 抓包的原理 2.1 什么是抓包&#xff1f; 2.2 HTTP/HTTPS 抓包原理 2.2.1 HTTP 抓包原理 2.2.2 HTTPS 抓包原理 2.3 电脑如何抓手机的包 3. 抓包工具 whistle 3.1 whistle 是什么 如何快速使用 whistle 3.2 whistle 可以做的事情 4. whistle 实战案…

HP打印机网络连接扫描仪失败

财务反映,使用主机上的HP LaserJet Pro M329-HP Scan连接扫描仪提示失败。 测试果然失败,提示如下图: 点击修复后,提示 需要安装HP Print and Scan Doctor。 同意安装,并启动HP Print and Scan Doctor 点击开始,其开始搜索,过程有点慢。 第一次发现其连接错误,居然…

液晶显示常用概念

文章目录 数字液晶显示消隐区水平&#xff08;行&#xff09;消隐 HBlank垂直&#xff08;场&#xff09;消隐 VBlank RGB格式RGB555RGB565RGB888 VGA驱动原理时钟信号像素时钟同步信号DE信号&#xff08;有效数据选通信号&#xff09;DE信号与其他信号的关系 数字液晶显示消隐…

golang webhook源码和案例配合gitee实践

下载golang webhook源码和案例&#xff1a; https://download.csdn.net/download/qq_32421489/87824180 解压后go mod tidy下载依赖包 修改打包环境为Linux&#xff1a; go env -w GOOSlinux 打包命令&#xff1a;go build 打包后的可运行程序上传服务器后&#xff1a;参…

用本地连接集群进行压力测试,让你的测试更快更有效!

目录 引言 背景 详细步骤 1、首先打开终端 2、安装kubectl 3、配置kubeconfig 4.准备本地仓库文件 5.启动集群执行脚本 总结 引言 测试是软件开发中至关重要的一环&#xff0c;但长时间的等待和低效率的测试却常常让人感到烦躁。现在&#xff0c;我们推出了全新的解决…

真的裂开了呀,现在的00后,真是卷死了

谁说00后躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷。这不&#xff0c;上个月我们公司来了个00后&#xff0c;工作没两年&#xff0c;跳槽到我们公司起薪22K&#xff0c;都快接近我了。 后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。 …

7个简单步骤创建企业邮箱教程

创建企业邮箱电子邮件地址有几种不同的方法&#xff0c;可以使用电子邮件服务提供商&#xff0c;也可以使用电子邮件托管服务。由于Zoho Mail是世界上最受欢迎的电子邮件服务提供商之一&#xff0c;提供非常简单的帐户设置、大量功能和有竞争力的价格&#xff0c;我们将以它为例…

【敲敲云】免费的零代码产品 — 应用创建与设置

敲敲云可以创建不同的应用&#xff0c;每一个应用我们可以看做一个系统&#xff0c;例如销售系统、财务系统等等。下面我们来看看如何创建应用吧。 应用的基础操作&#xff1a; 应用的基础操作包含创建应用、修改应用、退出/删除应用、排序应用、维护应用、应用回收站 1、新建…

提前进入行业顶尖阵营:高性能计算实习的竞争优势

如今就业越来越内卷&#xff0c;尤其是计算机行业更是如此。加上GPT以及大模型的加持&#xff0c;各大企业纷纷降本增效&#xff0c;普通程序员逐渐失去竞争力。想要在竞争激烈的就业市场中脱颖而出&#xff0c;提前进入行业顶尖阵营是一个明智的选择。而高性能计算实习将为您提…

js中获取对象属性值(对象.属性和对象[属性]的区别)

一、在JavaScript中可以通过两种方式访问对象属性 (1)可以使用“ . ”来访问对象的属性。 (2)可以使用“ [ ] ”来访问对象的属性。 二、对象.属性和对象[属性]的区别&#xff1a; 1.相同点&#xff1a; &#xff08;1&#xff09;都可以获取对象的属性值&#xff1b; 2.不同…

C Primer Plus第七章编程练习答案

学完C语言之后&#xff0c;我就去阅读《C Primer Plus》这本经典的C语言书籍&#xff0c;对每一章的编程练习题都做了相关的解答&#xff0c;仅仅代表着我个人的解答思路&#xff0c;如有错误&#xff0c;请各位大佬帮忙点出&#xff01; 1.编写一个程序读取输入&#xff0c;读…

PID算法在流量控制中的应用

目录 增量式或位置式 目录 增量式或位置式 PID控制周期 T1 时间 T2 约4ms PID C代码 最近有小伙伴向我提问关于PID的问题&#xff1a;通过比例阀控制水流速度&#xff08;流量&#xff09;&#xff0c; 使用增量式还是位置式 PID&#xff1f;他的比例法驱动频率是500Hz…

Windows http https的搭建

目录 搭建http站点 ​编辑 报错 网站端口更改 可能存在的报错 绑定主机名 端口为80的情况下 绑定的端口不为80的情况下 https站点搭建 CA机构证书可以给其他服务器使用&#xff0c;不过要用导出导入的行书&#xff0c;不能直接使用cer文件 搭建http站点 ①勾选IIS ②一…