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

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

spring cloud gateway集成hystrix實戰篇

瀏覽:27日期: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久久,三上悠亚国产精品一区二区三区
国产美女久久| 91久久久精品国产| 中文字幕中文字幕精品| 99视频精品| 一本综合精品| 日韩精品一区二区三区中文| 日韩高清电影一区| 国产经典一区| 给我免费播放日韩视频| 伊人久久视频| 午夜精品免费| 日本欧洲一区二区| 日本成人中文字幕| 亚洲乱码视频| 欧美日韩精品一区二区三区视频| 69堂精品视频在线播放| 国产欧美日韩一区二区三区四区| 精品亚洲免a| 人人香蕉久久| 性色一区二区| 国产日韩免费| 日韩欧美精品综合| 精品久久久久中文字幕小说| 国产九一精品| 国产一区二区三区探花| 国产成人精品一区二区免费看京 | 中文字幕成在线观看| 国产一区二区精品福利地址| 亚洲不卡av不卡一区二区| 一级成人国产| 国产一区2区在线观看| 免费视频国产一区| 日本一区福利在线| 精品成av人一区二区三区| 久久在线视频免费观看| 亚洲三级网站| 国产传媒av在线| 蜜桃伊人久久| 久久精品毛片| 国产一级一区二区| 国产精品va| 在线看片不卡| 欧美日韩午夜电影网| yellow在线观看网址| 国产精品毛片一区二区三区| 久久精品999| 欧美+日本+国产+在线a∨观看| 日韩欧美中文字幕电影 | 欧美午夜不卡| 国产精品白浆| 欧美精品一二| 国产精品99久久免费| 久久高清免费| 国产探花一区在线观看| 日本欧美不卡| 久久国产麻豆精品| 999久久久国产精品| 欧美一区自拍| 国产精品99免费看| 国产精品嫩草影院在线看| 婷婷成人在线| 国产精品三p一区二区| 欧美成人高清| 美女在线视频一区| 丝袜美腿成人在线| 欧美好骚综合网| 日本三级亚洲精品| 欧美特黄一级| 亚洲免费福利| 日韩国产一二三区| 天堂网在线观看国产精品| 美女av一区| 日韩中出av| 精品中文字幕一区二区三区av| 国产精品久久久久久模特 | 视频一区在线视频| 国产videos久久| 日韩av一区二区在线影视| 天堂√中文最新版在线| 日韩黄色av| 日韩午夜一区| 日韩不卡视频在线观看| 国产亚洲欧美日韩精品一区二区三区| 久久精品电影| 美女视频黄久久| 亚洲精品九九| 激情综合自拍| av资源中文在线| 美腿丝袜在线亚洲一区| 日韩va亚洲va欧美va久久| 欧美特黄视频| 日本免费一区二区三区四区| 91福利精品在线观看| 久久av在线| 蜜桃tv一区二区三区| 日韩中文影院| 高清一区二区| 国产日产精品_国产精品毛片| 免费不卡中文字幕在线| 国内精品伊人| 久久国产生活片100| 日韩影院在线观看| 亚洲韩日在线| 高清久久一区| 国产精品久久久久9999高清| 在线精品观看| 国产亚洲毛片在线| 欧美va天堂在线| 成人精品天堂一区二区三区| 精品视频网站| 久久不见久久见中文字幕免费| 综合日韩在线| 亚洲激情中文在线| 日韩中文影院| 国产成人精品999在线观看| 国产精品一区二区av日韩在线 | 精品一区欧美| 日韩网站中文字幕| 另类专区亚洲| 九九久久国产| 国产一区二区三区国产精品| 蜜桃久久久久| 精品一区电影| 精品久久网站| 成人在线超碰| 激情不卡一区二区三区视频在线| 国产精品免费大片| 国产麻豆精品久久| 国产精品免费不| 麻豆免费精品视频| 久久精品国产网站| 国产精品久久久久蜜臀| 成人亚洲一区| 99久久婷婷| 黄色成人在线网址| 蜜臀av国产精品久久久久| 丝袜美腿一区二区三区| 亚洲精品伦理| 91国内精品| 国产精品一卡| 久久影院资源站| 激情久久中文字幕| 婷婷成人基地| 欧美日韩精品免费观看视频完整| 日韩视频一区| 亚洲尤物av| 国产欧美在线观看免费| 国产精品xxxav免费视频| 麻豆一区二区三区| 国产自产自拍视频在线观看| 日韩在线短视频| 免费久久精品| 欧美中文日韩| 日韩三级视频| 国产精品调教视频| 麻豆精品久久久| 色婷婷综合网| 欧美色图国产精品| 视频在线观看一区二区三区| 日韩精品一区二区三区中文在线 | 精品国产午夜| 日韩三区免费| 婷婷色综合网| 日本在线不卡视频| 精品一区二区三区免费看| 久久精品1区| 亚洲综合中文| 国产日产高清欧美一区二区三区| 久久精品五月| 日韩在线综合| 免费成人在线观看| 老司机精品视频在线播放| 久久久久久黄| 日韩一区精品| 都市激情国产精品| 国产亚洲精品久久久久婷婷瑜伽| 91麻豆精品| 国产videos久久| 久久不射中文字幕| 美女精品久久| 亚洲欧美激情诱惑| 美女性感视频久久| 日韩视频一区二区三区在线播放免费观看 | 天堂资源在线亚洲| 亚洲视频国产精品| 最新中文字幕在线播放| 波多野结衣一区| 日韩av一区二区在线影视| 视频福利一区| 日本电影久久久| 中文字幕人成乱码在线观看 | 精品一区二区三区亚洲| 国产综合色产| 91av一区| 亚洲午夜精品久久久久久app| 日韩国产在线观看一区| 欧美综合另类| 国产精品二区影院| 在线视频免费在线观看一区二区| 国产精品久久久久久av公交车 |