日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

spring cloud gateway集成hystrix實戰篇

瀏覽:29日期: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
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日本国产一区| 蜜桃视频在线网站| 久久免费大视频| 亚洲精品福利| 亚洲精品免费观看| 婷婷综合成人| 日日夜夜免费精品| 欧美精品国产| 久久精品资源| 久久狠狠婷婷| 日本欧美一区| 国产欧美一区二区精品久久久 | 日韩精品亚洲专区| 国产成人精品免费视| 日韩视频在线一区二区三区 | 久久亚洲国产| 色综合视频一区二区三区日韩 | 成人三级高清视频在线看| 黑丝一区二区| 国产精品免费不| 欧美日韩国产欧| 欧美精品不卡| 久久大逼视频| 麻豆视频一区| 中文字幕日韩亚洲| 欧美亚洲日本精品| 日韩av中文字幕一区二区三区| 日本美女一区| 欧美日韩a区| 欧美~级网站不卡| 国产精品magnet| 国产精品毛片在线看| 精品国产乱码久久久久久樱花| 亚洲欧美不卡| 97人人精品| 欧美亚洲一级| 婷婷综合五月| 国产福利91精品一区二区| 欧美专区在线| 国产精品亚洲一区二区三区在线观看| 日本一区二区三区中文字幕| 999久久久91| 欧美极品中文字幕| 亚洲一二av| 欧美粗暴jizz性欧美20| 免费视频一区二区三区在线观看| 在线看片不卡| 久久精品亚洲一区二区| 日韩精品一二三四| 激情久久久久久| 久久一区精品| 18国产精品| 先锋影音国产一区| 岛国av免费在线观看| 欧美亚洲一区二区三区| 午夜精品亚洲| av资源亚洲| 国产精品久久乐| 亚洲人成高清| 九九久久电影| 丁香六月综合| 美女免费视频一区| 国产三级一区| 亚洲精品动态| 亚洲主播在线| 香蕉国产精品| 久久久夜精品| 日本精品影院| 国产一区二区三区四区大秀| 国产精品一区高清| 日韩精品国产精品| 中文在线一区| japanese国产精品| 亚洲v在线看| 欧美13videosex性极品| 精品国产乱码久久久久久1区2匹| 国产日产高清欧美一区二区三区| 一二三区精品| 午夜亚洲福利| 亚洲精品乱码日韩| 中文字幕日韩高清在线| 亚洲一区二区免费在线观看| 久久国产99| 尤物在线精品| 午夜欧美理论片| 夜夜嗨av一区二区三区网站四季av| 91精品精品| 亚洲二区在线| 不卡中文字幕| 99视频在线精品国自产拍免费观看| 久久一区二区中文字幕| 亚洲精品一区三区三区在线观看| 蜜臀国产一区| 久久久久中文| 国产一区亚洲| 在线精品视频在线观看高清| 日韩亚洲在线| 亚洲一区二区三区在线免费| 亚洲一区二区动漫| 蜜桃视频一区二区三区| 一二三区精品| 国产欧美日韩精品高清二区综合区| 国产亚洲一区二区三区啪| 欧美日韩夜夜| 国产精品久久久久久久久妇女| 日韩三区免费| 在线看片不卡| 日本中文字幕不卡| 国产亚洲人成a在线v网站| 国产精品久久| 精品中文字幕一区二区三区四区| www.九色在线| 在线国产一区二区| 久久亚洲欧洲| 7777精品| 荡女精品导航| 99久久99视频只有精品| 亚洲深夜福利| 91成人在线| 国产一区二区三区视频在线| 久久天堂精品| 蜜臀av在线播放一区二区三区| 日本a级不卡| 国产精品成人一区二区不卡| 极品日韩av| 男女男精品视频网| 国产精品久久久久毛片大屁完整版| 成人欧美一区二区三区的电影| 欧美日韩精品免费观看视完整| 欧美日韩国产免费观看视频| 亚洲影视一区二区三区| 久久不卡日韩美女| 亚洲精品一区三区三区在线观看| 亚洲免费网址| 麻豆精品久久久| 午夜精品一区二区三区国产| 日韩国产在线观看一区| 精品视频在线观看网站| 精品一区欧美| 国产欧美一区二区色老头| 久久蜜桃资源一区二区老牛| 日韩精品免费一区二区夜夜嗨| 精品国产乱码久久久久久樱花| 久久精品中文| 偷拍亚洲精品| 日韩久久一区二区三区| 老鸭窝毛片一区二区三区| 国产精品hd| 午夜日韩在线| 久久99影视| 在线午夜精品| 精品中文在线| 亚洲最新av| 极品av在线| 亚洲精品进入| 99久久精品网| 国产精品玖玖玖在线资源| 婷婷亚洲五月| 你懂的亚洲视频| 亚洲在线网站| 国产精品麻豆久久| 亚洲人成网站在线在线观看| 国语精品一区| 日韩亚洲精品在线观看| 亚洲一级少妇| 国产精品久一| 日韩在线一二三区| 日韩毛片视频| 欧美综合精品| 亚洲激情偷拍| 国产一区2区在线观看| 亚洲3区在线| 91精品二区| 国产66精品| 亚洲1区在线| 欧美va天堂在线| 精品精品99| 欧美日韩精品一区二区三区视频 | 国产精品视频首页| 国产亚洲激情| 水蜜桃久久夜色精品一区| 日本亚洲不卡| 中文亚洲免费| www.com.cn成人| 久久不卡日韩美女| 日韩有吗在线观看| 国产精品毛片| 久久国产亚洲| 久久精品国产免费| 日韩不卡在线观看日韩不卡视频 | 欧美日韩免费观看一区=区三区| 国产一区二区精品久| 91成人在线精品视频| 美女国产精品| 丝袜诱惑一区二区| 国产不卡精品| 欧美激情 亚洲a∨综合| 日韩精品中文字幕一区二区| 亚洲在线国产日韩欧美| 久久国产电影|