微服务_Hystrix

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

在每个服务中引用该组件,监控当前组件。可被GateWay、Fegin集成。

简介

作用:防止服务雪崩
Hystrix是一个由Netflix开源的容错框架,它主要用于分布式系统中的服务间通信。Hystrix通过在调用服务的过程中添加各种容错机制,来保护系统免受服务故障或网络中断的影响,从而提高了系统的可靠性和弹性。Hystrix提供了许多功能,例如超时控制、断路器、线程池隔离、请求缓存等等,它可以快速、可靠地为您的应用程序提供容错保护。

熔断器的原理很简单,如同电力过载保护器。它可以实现快速失败,如果它在一段时间内侦测到许多类似的错误,会强迫其以后的多个调用快速失败,不再访问远程服务器,从而防止应用程序不断地尝试执行可能会失败的操作,使得应用程序继续执行而不用等待修正错误,或者浪费 CPU时间。熔断器也可以使应用程序能够诊断错误是否已经修正,如果已经修正,应用程序会再次尝试调用操作。

Hystrix的主要功能包括:

  • 快速失败(Fail Fast):当一个依赖服务出现故障时,Hystrix能够快速地中断请求,避免等待超时而浪费系统资源。
  • 回退机制(Fallback):当一个依赖服务出现故障时,Hystrix能够提供回退逻辑,返回一个默认值或执行备选方案,从而保证系统的稳定性。
  • 熔断器(Circuit Breaker):Hystrix能够自动地监控依赖服务的状态,当故障率达到一定阈值时,自动打开熔断器,防止请求继续发往不可用的依赖服务。
  • 缓存(Cache):Hystrix能够提供缓存机制,避免对同一数据的重复请求,从而提高系统的性能。
  • 隔离(Isolation):Hystrix能够通过线程池隔离、信号量隔离等机制,避免依赖服务的故障对系统的其他部分造成影响。
  • 监控和度量(Monitoring and Metrics):Hystrix能够提供近乎实时的监控和度量,包括请求成功率、请求响应时间、熔断器状态等指标,从而帮助开发人员快速地定位和解决问题。

服务熔断

当满足一定的阈值的时候(默认10s内超过20个请求失败)

当失败率达到一定的时候(默认10s内50%的请求失败)

断路器将会开启

开启时,所有请求都不会进行转发

一段时间后(默认是5s),这个时候断路器是半开状态,会让其中一个请求进行转发,如果成功,断路器关闭,若失败,重复流程;

快速上手

引入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

在入口类添加注解

@EnableCircuitBreaker

服务端熔断

设置熔断后的快速反应(备用处理)

@GetMapping("demo")
@HystrixCommand(fallbackMethod = "demoFallback")	//指定快速处理方案的方法名
public String demo(String id){
    if(){
        throw new RuntimeException("出错!")}
}

public String demoFallback(String id){
    
}
  • 阿,,,光处理异常的话,这种形式和直接catch里处理有什么区别,,是顺便加上了断路器的功能吗?

处理方法-“替身文学”

为每个方法都自定义处理方式,代码工作有些繁重,可以指定一个通用的默认的处理方法

@HystrixCommand(defaultFallback = "默认的处理")

默认的处理方法返回值为String,没有形参,因为要可以为不同的方法提供处理

如果使用自定义的处理方法,则该方法形参和返回值要和对应的Controller方法对应

相当于该方法的“替身”,当该服务不可用时,使用fallback方法代餐 代为处理
注:用hystrix做服务端熔断,只有服务可用才能正常返回fallback处理,因为fallback处理也是该服务的一部分

消费端熔断

由Feign处理,假如整个服务断了,fallback都用不了,由Feign返回

熔断器触发机制

微服务_Hystrix

  • 怎么记录?失败的请求怎么办

OpenFeign整合

  • openfeign和gateway重复了吧,
  • 阿我明白了,,,openfegin是项目内部调用,这部分本来就不走网关,,而另外那些要访问网关的(?)他们需要在网关进行处理才行

openfeign底层默认集成hystrix

开启openFeign对hystrix支持

feign.hystrix.enabled=true

在feign的client接口上

@FeignClient(value = "服务id",fallback=实现类.class)

然后编写bean实现该client接口,重写对应方法,加上组件注解

用工厂模式

以若依项目为例

@FeignClient(value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteUserFallbackFactory.class)

编写工厂类,实现FallbackFactory<T>接口,重写create方法,返回一个内部类对象(毕竟工厂类要返回实体对象,但原client是个接口)

@Component
public class RemoteUserFallbackFactory implements FallbackFactory<RemoteUserService>
{
    private static final Logger log = LoggerFactory.getLogger(RemoteUserFallbackFactory.class);

    @Override
    public RemoteUserService create(Throwable throwable)
    {
        log.error("用户服务调用失败:{}", throwable.getMessage());
        return new RemoteUserService()
        {
            @Override
            public R<LoginUser> getUserInfo(String username, String source)
            {
                return R.fail("获取用户失败:" + throwable.getMessage());
            }

            @Override
            public R<Boolean> registerUserInfo(SysUser sysUser, String source)
            {
                return R.fail("注册用户失败:" + throwable.getMessage());
            }
        };
    }

整合GateWay过滤器

spring:
  cloud:
    gateway:
      routes:
        # 系统模块
        - id: ruoyi-system
          uri: lb://ruoyi-system
          predicates:
            - Path=/system/**
          filters:
            - StripPrefix=1
            # 降级配置
            - name: Hystrix
              args:
                name: default
                # 降级接口的地址
                fallbackUri: 'forward:/fallback'

然后自行实现fallback的controller

import org.gateway.response.Response;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class FallbackController {

    @GetMapping("/fallbackA")
    public Response fallbackA() {
        Response response = new Response();
        response.setCode("100");
        response.setMessage("服务暂时不可用");
        return response;
    }
}

上面配置包含了一个Hystrix过滤器,该过滤器会应用Hystrix熔断与降级,会将请求包装成名为fallback的路由指令RouteHystrixCommandRouteHystrixCommand继承于HystrixObservableCommand,其内包含了Hystrix的断路、资源隔离、降级等诸多断路器核心功能,当网关转发的请求出现问题时,网关能对其进行快速失败,执行特定的失败逻辑,保护网关安全。

配置中有一个可选参数fallbackUri,当前只支持forward模式的URI。如果服务被降级,请求会被转发到该URI对应的控制器。控制器可以是自定义的fallback接口;也可以使自定义的Handler,需要实现接口org.springframework.web.reactive.function.server.HandlerFunction<T extends ServerResponse>

3、实现添加熔断降级处理返回信息

package com.ruoyi.gateway.handler;

import com.alibaba.fastjson.JSON;
import com.ruoyi.common.core.domain.R;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.server.HandlerFunction;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Mono;
import java.util.Optional;
import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR;

/**

  • 熔断降级处理

  • @author ruoyi
    */
    @Component
    public class HystrixFallbackHandler implements HandlerFunction
    {
    private static final Logger log = LoggerFactory.getLogger(HystrixFallbackHandler.class);

    @Override
    public Mono handle(ServerRequest serverRequest)
    {
    Optional originalUris = serverRequest.attribute(GATEWAY_ORIGINAL_REQUEST_URL_ATTR);
    originalUris.ifPresent(originalUri -> log.error(“网关执行请求:{}失败,hystrix服务降级处理”, originalUri));
    return ServerResponse.status(HttpStatus.INTERNAL_SERVER_ERROR.value()).contentType(MediaType.APPLICATION_JSON)
    .body(BodyInserters.fromValue(JSON.toJSONString(R.fail(“服务已被降级熔断”))));
    }
    }
    4、路由配置信息加一个控制器方法用于处理重定向的/fallback请求

package com.ruoyi.gateway.config;


import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.server.RequestPredicates;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.RouterFunctions;
import com.ruoyi.gateway.handler.HystrixFallbackHandler;
import com.ruoyi.gateway.handler.ValidateCodeHandler;

/**
 * 路由配置信息
 */
@Configuration
public class RouterFunctionConfiguration
{
    @Autowired
    private HystrixFallbackHandler hystrixFallbackHandler;

    @Autowired
    private ValidateCodeHandler validateCodeHandler;

    @SuppressWarnings("rawtypes")
    @Bean
    public RouterFunction routerFunction()
    {
        return RouterFunctions
                .route(RequestPredicates.path("/fallback").and(RequestPredicates.accept(MediaType.TEXT_PLAIN)),
                        hystrixFallbackHandler)
                .andRoute(RequestPredicates.GET("/code").and(RequestPredicates.accept(MediaType.TEXT_PLAIN)),
                        validateCodeHandler);
    }
}

Hystrix Dashborad 图形化监控

显示状态信息。不是很重要,不推荐专门学习

是不是有统一的微服务监控能取代?

引入dashborad依赖, 默认@EnableDiscoveryClient开启
erver.HandlerFunction`。文章来源地址https://www.toymoban.com/news/detail-492697.html

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

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

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

相关文章

  • Hystrix: Dashboard流监控

    接上两张服务熔断       开始搭建Dashboard流监控 pom依赖 主启动类 启动  访问http://localhost:9001/hystrix  启动集群7001  在8001提供者里加个依赖 在熔断里用这个监控才有效 主启动类里加一个bean放入IOC容器里          服务熔断机制  

    2024年02月11日
    浏览(30)
  • uniapp 小程序 全局弹窗 每个需要使用的页面都不用再引用

    使用全局组件,先声明全局组件 与普通的组件声明不同之处在于 1:目录形式 2:声明引用方式 在components目录中创建组件目录/组件vue,如下 注意需要同名的目录 } show函数是组件的methods中的声明的函数 这种方式的可以在页面中直接调用组件的函数,不用再在页面中引用组件

    2024年02月03日
    浏览(47)
  • “电脑登录界面显示引用的账户当前已锁定”解决办法

    https://www.zhihu.com/question/400540089/answer/2159778869 1.开机进BIOS系统(不同机型方法不同,具体可百度) 2.进入BIOS系统时间设定,设置为一个未来的时间,比如:2028年12月12日 3.保存设定并退出BIOS,进入系统 4.输入正确的账户密码,登录 https://jingyan.baidu.com/article/29697b9107e351ea21de3c

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

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

    2024年02月07日
    浏览(49)
  • 微服务_Hystrix

    作用:防止服务雪崩 Hystrix是一个由Netflix开源的容错框架,它主要用于分布式系统中的服务间通信。Hystrix通过在调用服务的过程中添加各种容错机制,来保护系统免受服务故障或网络中断的影响,从而提高了系统的可靠性和弹性。Hystrix提供了许多功能,例如超时控制、断路

    2024年02月09日
    浏览(23)
  • 十一、Hystrix服务保护

    目录 服务雪崩相关概念简述 服务的雪崩效应 造成服务雪崩的原因 服务雪崩最终的结果 防止服务雪崩的方法 一、服务降级 1、引入Hystrix 服务保护依赖 2、基于注解@HystrixCommand使用Hystrix 2.1、在需要进行服务保护的方法上添加注解@HystrixCommand,并指定降级方法名称 2.2、编写降

    2024年02月05日
    浏览(24)
  • 服务熔断Hystrix入门

    在微服务架构中,一个请求需要调用多个服务是非常常见的。如客户端访问A服务,而A服务需要调用B服务,B服务需要调用C服务,由于网络原因或者自身的原因,如果B服务或者C服务不能及时响应,A服务将处于阻塞状态,直到B服务C服务响应。此时若有大量的请求涌入,容器的

    2024年02月03日
    浏览(42)
  • 微服务 – Spring Cloud – Hystrix

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

    2024年02月11日
    浏览(46)
  • Dubbo 模块探秘:深入了解每个组件的独特功能【二】

    欢迎来到我的博客,代码的世界里,每一行都是一个故事 在 Dubbo 的分布式舞台上,每个模块都是为了呈现最完美的表演。今天,我们将深入 Dubbo 的模块体系,解析每个组件的独特功能,为你揭开构建分布式服务的神秘面纱。让我们一同踏上这场 Dubbo 模块之旅,探寻分布式服

    2024年01月22日
    浏览(60)
  • 深入剖析Vue组件生命周期中的每个阶段

    Vue.js 是一款流行的 JavaScript 框架,用于构建用户界面。它采用了组件化的开发模式,组件是 Vue.js 的核心概念之一。Vue 组件的生命周期是指在组件被创建、渲染和销毁的过程中,Vue 实例会自动调用一系列的钩子函数。这些钩子函数可用于在组件的不同阶段执行特定的操作,

    2024年02月12日
    浏览(32)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包