电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

spring cloud gateway集成hystrix實戰篇

瀏覽:3日期:2023-07-01 11:53:11
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-serviceuri: lb://employee-servicepredicates:- Path=/employee/**filters:- RewritePath=/employee/(?<path>.*), /${path}- name: Hystrix args: name: fallbackcmd fallbackUri: forward:/fallback 首先filter里頭配置了name為Hystrix的filter,實際是對應HystrixGatewayFilterFactory 然后指定了hystrix command的名稱,及fallbackUri,注意fallbackUri要以forward開頭 最后通過hystrix.command.fallbackcmd.execution.isolation.thread.timeoutInMilliseconds指定該command的超時時間fallback實例

@RestController@RequestMapping('/fallback')public class FallbackController { @RequestMapping('') public String fallback(){return 'error'; }}源碼解析

GatewayAutoConfiguration

spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gateway/config/GatewayAutoConfiguration.java

@Configuration@ConditionalOnProperty(name = 'spring.cloud.gateway.enabled', matchIfMissing = true)@EnableConfigurationProperties@AutoConfigureBefore(HttpHandlerAutoConfiguration.class)@AutoConfigureAfter({GatewayLoadBalancerClientAutoConfiguration.class, GatewayClassPathWarningAutoConfiguration.class})@ConditionalOnClass(DispatcherHandler.class)public class GatewayAutoConfiguration { //...... @Configuration @ConditionalOnClass({HystrixObservableCommand.class, RxReactiveStreams.class}) protected static class HystrixConfiguration {@Beanpublic HystrixGatewayFilterFactory hystrixGatewayFilterFactory(DispatcherHandler dispatcherHandler) { return new HystrixGatewayFilterFactory(dispatcherHandler);} } //......}

引入spring-cloud-starter-netflix-hystrix類庫,就有HystrixObservableCommand.class, RxReactiveStreams.class,便開啟HystrixConfiguration

HystrixGatewayFilterFactory

spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gateway/filter/factory/HystrixGatewayFilterFactory.java

/** * Depends on `spring-cloud-starter-netflix-hystrix`, {@see http://cloud.spring.io/spring-cloud-netflix/} * @author Spencer Gibb */public 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 statussetResponseStatus(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;}@Overrideprotected Observable<Void> construct() { return RxReactiveStreams.toObservable(this.chain.filter(exchange));}@Overrideprotected 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
相關文章:
主站蜘蛛池模板: TPE_TPE热塑性弹性体_TPE原料价格_TPE材料厂家-惠州市中塑王塑胶制品公司- 中塑王塑胶制品有限公司 | 西门子伺服控制器维修-伺服驱动放大器-828D数控机床维修-上海涌迪 | 学校用栓剂模,玻璃瓶轧盖钳,小型安瓿熔封机,实验室安瓿熔封机-长沙中亚制药设备有限公司 | 焊锡丝|焊锡条|无铅锡条|无铅锡丝|无铅焊锡线|低温锡膏-深圳市川崎锡业科技有限公司 | 北京康百特科技有限公司-分子蒸馏-短程分子蒸馏设备-实验室分子蒸馏设备 | 不锈钢水箱厂家,不锈钢保温水箱-山东桑特供水设备 | 购买舔盐、舔砖、矿物质盐压块机,鱼饵、鱼饲料压块机--请到杜甫机械 | 高精度电阻回路测试仪-回路直流电阻测试仪-武汉特高压电力科技有限公司 | 【MBA备考网】-2024年工商管理硕士MBA院校/报考条件/培训/考试科目/提前面试/考试/学费-MBA备考网 | 低温柔性试验仪-土工布淤堵-沥青车辙试验仪-莱博特(天津)试验机有限公司 | 绿萝净除甲醛|深圳除甲醛公司|测甲醛怎么收费|培训机构|电影院|办公室|车内|室内除甲醛案例|原理|方法|价格立马咨询 | 快速门厂家-快速卷帘门-工业快速门-硬质快速门-西朗门业 | 华东师范大学在职研究生招生网_在职研究生招生联展网 | 定做大型恒温循环水浴槽-工业用不锈钢恒温水箱-大容量低温恒温水槽-常州精达仪器 | 一体化污水处理设备_生活污水处理设备_全自动加药装置厂家-明基环保 | 蜘蛛车-登高车-高空作业平台-高空作业车-曲臂剪叉式升降机租赁-重庆海克斯公司 | 脱硫搅拌器厂家-淄博友胜不锈钢搅拌器厂家 | 武汉刮刮奖_刮刮卡印刷厂_为企业提供门票印刷_武汉合格证印刷_现金劵代金券印刷制作 - 武汉泽雅印刷有限公司 | 数显水浴恒温振荡器-分液漏斗萃取振荡器-常州市凯航仪器有限公司 | 安徽成考网-安徽成人高考网| 上海洗地机-洗地机厂家-全自动洗地机-手推式洗地机-上海滢皓洗地机 | 点焊机-缝焊机-闪光对焊机-电阻焊设备生产厂家-上海骏腾发智能设备有限公司 | 大通天成企业资质代办_承装修试电力设施许可证_增值电信业务经营许可证_无人机运营合格证_广播电视节目制作许可证 | 标准光源箱|对色灯箱|色差仪|光泽度仪|涂层测厚仪_HRC大品牌生产厂家 | 航空障碍灯_高中低光强航空障碍灯_民航许可认证航空警示灯厂家-东莞市天翔航天科技有限公司 | 网优资讯-为循环资源、大宗商品、工业服务提供资讯与行情分析的数据服务平台 | 烽火安全网_加密软件、神盾软件官网 | 网站建设,北京网站建设,北京网站建设公司,网站系统开发,北京网站制作公司,响应式网站,做网站公司,海淀做网站,朝阳做网站,昌平做网站,建站公司 | 医养体检包_公卫随访箱_慢病随访包_家签随访包_随访一体机-济南易享医疗科技有限公司 | T恤衫定做,企业文化衫制作订做,广告T恤POLO衫定制厂家[源头工厂]-【汉诚T恤定制网】 | 搜活动房网—活动房_集装箱活动房_集成房屋_活动房屋 | 电脑知识|软件|系统|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网 | 根系分析仪,大米外观品质检测仪,考种仪,藻类鉴定计数仪,叶面积仪,菌落计数仪,抑菌圈测量仪,抗生素效价测定仪,植物表型仪,冠层分析仪-杭州万深检测仪器网 | 直线模组_滚珠丝杆滑台_模组滑台厂家_万里疆科技 | 上海皓越真空设备有限公司官网-真空炉-真空热压烧结炉-sps放电等离子烧结炉 | 西门子伺服电机维修,西门子电源模块维修,西门子驱动模块维修-上海渠利 | 螺钉式热电偶_便携式温度传感器_压簧式热电偶|无锡联泰仪表有限公司|首页 | 数显水浴恒温振荡器-分液漏斗萃取振荡器-常州市凯航仪器有限公司 | pH污水传感器电极,溶解氧电极传感器-上海科蓝仪表科技有限公司 | 物流公司电话|附近物流公司电话上门取货 | 保镖公司-私人保镖-深圳保镖公司【环宇兄弟保镖】 |