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

这篇具有很好参考价值的文章主要介绍了Spring Cloud 容错机试 Hystrix 服务降级 RestTemplate:。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Ribon的服务降级操作

雪崩效应:

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

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

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

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

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

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

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

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

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

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

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

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

我们发现我们的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这个方法写一个服务降级的方法

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

具体的解决如下所示:

/**
 * 远程调用我们需要的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 "当前服系统正忙,请稍后再试。。。";
}

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

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

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

但是我们还是有个问题,就是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服务

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

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

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

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

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

具体操作如下所示:

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


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

最后在浏览器进行测试

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

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断路器:(必须和服务降级联合使用)

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

改造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%文章来源地址https://www.toymoban.com/news/detail-465382.html

到了这里,关于Spring Cloud 容错机试 Hystrix 服务降级 RestTemplate:的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微服务 – Spring Cloud – Hystrix

    hystrix是Netlifx开源的一款容错框架,防雪崩利器,具备服务降级,服务熔断,依赖隔离,监控(Hystrix Dashboard)等功能。 Hystrix is no longer in active development, and is currently in maintenance mode. Hystrix 已经停更 服务降级 服务熔断 服务限流 服务超时 服务宕机(服务崩掉、机房断电、服务故

    2024年02月11日
    浏览(44)
  • 【Spring Cloud】服务容错中间件Sentinel入门

    欢迎来到阿Q社区 https://bbs.csdn.net/topics/617897123 Sentinel(分布式系统的流量防卫兵)是阿里开源的一套用于 服务容错 的综合性解决方案。它以流量为切入点,从 流量控制、熔断降级、系统负载保护 等多个维度来保护服务的稳定性。 Sentinel 具有以下特征: 丰富的应用场景 :

    2024年04月15日
    浏览(39)
  • 【Spring Cloud】服务容错中间件Sentinel进阶——五大规则

    我们在上一篇文章中对 Sentinel 已经有了基本的了解,接下来,我们一起对它的进阶进行学习吧! 资源 所谓资源就是 Sentinel 要保护的东西,资源是 Sentinel 的关键概念。它可以是Java应用程序中的任何内容,可以是一个服务,也可以是一个方法,甚至可以是一段代码。 我们入门

    2024年04月26日
    浏览(37)
  • Spring Cloud OpenFeign:基于Ribbon和Hystrix的声明式服务调用

    💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! Spring Cloud OpenFeign是一个声明式的服务调用框架,基于Feign并整合了Ribbon和Hystrix;目标是简化分布式系统中编写服务间调用的代码,并提供一种更加优雅和便捷的方式来进行服务之间的通信 依赖导入 application.yml配置 启

    2024年02月05日
    浏览(50)
  • Hystrix入门使用 服务熔断 服务降级 服务雪崩

    hystrix停止更新,理念优秀。 分布式系统面临的问题: 对于复杂的分布式体系,有数十个依赖,依赖不可避免的错误。 服务会出现雪崩, 高可用受到破坏 。 Hystrix就是用于解决分布式系统延迟和容错的开源库。 保证在一个依赖出现问题,不会导致整体的服务失败,避免级联故

    2024年02月07日
    浏览(47)
  • 【spring Cloud】微服务通信的三种方式RestTemplate、Feign远程调用与Dubbo的使用

    目录 一、通过RestTemplate调用微服务 二、通过Feign远程调用 三、Dubbo  分布式中的远程调用大概分为两种 RESTful接口  REST,即Representational State Transfer的缩写,如果一个架构符合REST原则,就称它为RESTful架构。 每一个URI代表一种资源; 客户端和服务器之间,传递这种资源的某种

    2024年04月11日
    浏览(45)
  • SpringCloud(四)Hystrix服务降级、熔断、监控页面

    官方文档:https://cloud.spring.io/spring-cloud-static/spring-cloud-netflix/1.3.5.RELEASE/single/spring-cloud-netflix.html#_circuit_breaker_hystrix_clients 我们知道,微服务之间是可以进行相互调用的,那么如果出现了下面的情况会导致什么问题? 由于位于最底端的服务提供者E发生故障,那么此时会直接导

    2024年02月17日
    浏览(52)
  • Spring Cloud Alibaba【OpenFeign实现服务降级、Dubbo实现服务生产者、 Dubbo消费者调用接口 】(三)

    目录 服务调用_OpenFeign实现服务降级 服务调用_Dubbo实现服务生产者 

    2024年02月17日
    浏览(48)
  • 微服务:Springboot集成Hystrix实现熔断、降级、隔离

    在分布式微服务的项目中,常常会有多个服务复用,产生多个服务调用的情况。比如A服务调用B服务,B服务调用C服务。服务调用链路长了必然会增加服务超时的概率,服务的超时阻塞会一直占用线程资源,大量的阻塞会直接消耗完服务线程,严重情况下会导致服务直接宕机从

    2024年02月12日
    浏览(44)
  • 【微服务笔记10】微服务组件之Hystrix实现服务降级和服务熔断

    这篇文章,主要介绍微服务组件之Hystrix实现服务降级和服务熔断。 目录 一、服务降级 1.1、什么是服务降级 1.2、实现服务降级 (1)引入依赖 (2)编写Service层代码 (3)编写Controller层代码 (4)运行测试 (5)fallbackMethod属性 二、服务熔断 2.1、什么是服务熔断 2.2、实现服务

    2023年04月11日
    浏览(79)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包