我的编程空间,编程开发者的网络收藏夹
学习永远不晚

spring cloud gateway集成hystrix的方法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

spring cloud gateway集成hystrix的方法

本篇内容介绍了“spring cloud gateway集成hystrix的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

spring cloud gateway集成hystrix

本文主要研究一下spring cloud gateway如何集成hystrix

maven

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

添加spring-cloud-starter-netflix-hystrix依赖,开启hystrix

配置实例

hystrix.command.fallbackcmd.execution.isolation.thread.timeoutInMilliseconds: 5000spring:  cloud:    gateway:      discovery:        locator:          enabled: true      routes:      - id: employee-service        uri: lb://employee-service        predicates:        - Path=/employeepublic class HystrixGatewayFilterFactory extends AbstractGatewayFilterFactory<HystrixGatewayFilterFactory.Config> {    public static final String FALLBACK_URI = "fallbackUri";    private final DispatcherHandler dispatcherHandler;    public HystrixGatewayFilterFactory(DispatcherHandler dispatcherHandler) {        super(Config.class);        this.dispatcherHandler = dispatcherHandler;    }    @Override    public List<String> shortcutFieldOrder() {        return Arrays.asList(NAME_KEY);    }    public GatewayFilter apply(String routeId, Consumer<Config> consumer) {        Config config = newConfig();        consumer.accept(config);        if (StringUtils.isEmpty(config.getName()) && !StringUtils.isEmpty(routeId)) {            config.setName(routeId);        }        return apply(config);    }    @Override    public GatewayFilter apply(Config config) {        //TODO: if no name is supplied, generate one from command id (useful for default filter)        if (config.setter == null) {            Assert.notNull(config.name, "A name must be supplied for the Hystrix Command Key");            HystrixCommandGroupKey groupKey = HystrixCommandGroupKey.Factory.asKey(getClass().getSimpleName());            HystrixCommandKey commandKey = HystrixCommandKey.Factory.asKey(config.name);            config.setter = Setter.withGroupKey(groupKey)                    .andCommandKey(commandKey);        }        return (exchange, chain) -> {            RouteHystrixCommand command = new RouteHystrixCommand(config.setter, config.fallbackUri, exchange, chain);            return Mono.create(s -> {                Subscription sub = command.toObservable().subscribe(s::success, s::error, s::success);                s.onCancel(sub::unsubscribe);            }).onErrorResume((Function<Throwable, Mono<Void>>) throwable -> {                if (throwable instanceof HystrixRuntimeException) {                    HystrixRuntimeException e = (HystrixRuntimeException) throwable;                    if (e.getFailureType() == TIMEOUT) { //TODO: optionally set status                        setResponseStatus(exchange, HttpStatus.GATEWAY_TIMEOUT);                        return exchange.getResponse().setComplete();                    }                }                return Mono.error(throwable);            }).then();        };    }    //......}

这里创建了RouteHystrixCommand,将其转换为Mono,然后在onErrorResume的时候判断如果HystrixRuntimeException的failureType是FailureType.TIMEOUT类型的话,则返回GATEWAY_TIMEOUT(504, "Gateway Timeout")状态码。

RouteHystrixCommand

//TODO: replace with HystrixMonoCommand that we write    private class RouteHystrixCommand extends HystrixObservableCommand<Void> {        private final URI fallbackUri;        private final ServerWebExchange exchange;        private final GatewayFilterChain chain;        RouteHystrixCommand(Setter setter, URI fallbackUri, ServerWebExchange exchange, GatewayFilterChain chain) {            super(setter);            this.fallbackUri = fallbackUri;            this.exchange = exchange;            this.chain = chain;        }        @Override        protected Observable<Void> construct() {            return RxReactiveStreams.toObservable(this.chain.filter(exchange));        }        @Override        protected Observable<Void> resumeWithFallback() {            if (this.fallbackUri == null) {                return super.resumeWithFallback();            }            //TODO: copied from RouteToRequestUrlFilter            URI uri = exchange.getRequest().getURI();            //TODO: assume always?            boolean encoded = containsEncodedParts(uri);            URI requestUrl = UriComponentsBuilder.fromUri(uri)                    .host(null)                    .port(null)                    .uri(this.fallbackUri)                    .build(encoded)                    .toUri();            exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, requestUrl);            ServerHttpRequest request = this.exchange.getRequest().mutate().uri(requestUrl).build();            ServerWebExchange mutated = exchange.mutate().request(request).build();            return RxReactiveStreams.toObservable(HystrixGatewayFilterFactory.this.dispatcherHandler.handle(mutated));        }    }
  • 这里重写了construct方法,RxReactiveStreams.toObservable(this.chain.filter(exchange)),将reactor的Mono转换为rxjava的Observable

  • 这里重写了resumeWithFallback方法,针对有fallbackUri的情况,重新路由到fallbackUri的地址

Config

public static class Config {        private String name;        private Setter setter;        private URI fallbackUri;        public String getName() {            return name;        }        public Config setName(String name) {            this.name = name;            return this;        }        public Config setFallbackUri(String fallbackUri) {            if (fallbackUri != null) {                setFallbackUri(URI.create(fallbackUri));            }            return this;        }        public URI getFallbackUri() {            return fallbackUri;        }        public void setFallbackUri(URI fallbackUri) {            if (fallbackUri != null && !"forward".equals(fallbackUri.getScheme())) {                throw new IllegalArgumentException("Hystrix Filter currently only supports 'forward' URIs, found " + fallbackUri);            }            this.fallbackUri = fallbackUri;        }        public Config setSetter(Setter setter) {            this.setter = setter;            return this;        }    }

可以看到Config校验了fallbackUri,如果不为null,则必须以forward开头

小结

spring cloud gateway集成hystrix,分为如下几步:

  • 添加spring-cloud-starter-netflix-hystrix依赖

  • 在对应route的filter添加name为Hystrix的filter,同时指定hystrix command的名称,及其fallbackUri(可选)

  • 指定该hystrix command的超时时间等。

“spring cloud gateway集成hystrix的方法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

spring cloud gateway集成hystrix的方法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

spring cloud gateway集成hystrix的方法

本篇内容介绍了“spring cloud gateway集成hystrix的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!spring
2023-06-20

spring cloud gateway集成hystrix全局断路器的操作

这篇文章主要讲解了“spring cloud gateway集成hystrix全局断路器的操作”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“spring cloud gateway集成hys
2023-06-20

Spring Cloud中Hystrix的请求合并方法

本篇内容介绍了“Spring Cloud中Hystrix的请求合并方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!服务提供者接口我需在在服
2023-06-19

springcloud gateway集成knife4j的方法是什么

这篇文章主要介绍“springcloud gateway集成knife4j的方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“springcloud gateway集成knife4j的方法是什
2023-07-05

Spring Cloud中Hystrix服务降级与异常处理的方法是什么

本篇内容主要讲解“Spring Cloud中Hystrix服务降级与异常处理的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring Cloud中Hystrix服务降级与异常处理的
2023-06-19

spring boot集成redisson的方法

本文小编为大家详细介绍“spring boot集成redisson的方法”,内容详细,步骤清晰,细节处理妥当,希望这篇“spring boot集成redisson的方法”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧
2023-06-29

Spring Cloud Gateway中的令牌桶限流算法实例分析

这篇“Spring Cloud Gateway中的令牌桶限流算法实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spr
2023-06-29

spring集成kafka的方法是什么

Spring集成Kafka的方法如下:引入依赖:在项目的pom.xml文件中添加spring-kafka依赖。org.springframework.kafka
2023-10-20

Spring Boot 集成 Kafkad的实现方法

本篇内容介绍了“Spring Boot 集成 Kafkad的实现方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Spring Boot 作
2023-06-14

springboot集成springCloud中gateway时启动报错的解决方法

本篇内容介绍了“springboot集成springCloud中gateway时启动报错的解决方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所
2023-06-20

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录