亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

spring cloud gateway集成hystrix實(shí)戰(zhàn)篇

瀏覽:2日期: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依賴(lài),開(kāi)啟hystrix

配置實(shí)例

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 首先f(wàn)ilter里頭配置了name為Hystrix的filter,實(shí)際是對(duì)應(yīng)HystrixGatewayFilterFactory 然后指定了hystrix command的名稱(chēng),及fallbackUri,注意fallbackUri要以forward開(kāi)頭 最后通過(guò)hystrix.command.fallbackcmd.execution.isolation.thread.timeoutInMilliseconds指定該command的超時(shí)時(shí)間fallback實(shí)例

@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類(lèi)庫(kù),就有HystrixObservableCommand.class, RxReactiveStreams.class,便開(kāi)啟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();}; } //......}

這里創(chuàng)建了RouteHystrixCommand,將其轉(zhuǎn)換為Mono,然后在onErrorResume的時(shí)候判斷如果HystrixRuntimeException的failureType是FailureType.TIMEOUT類(lèi)型的話(huà),則返回GATEWAY_TIMEOUT(504, 'Gateway Timeout')狀態(tài)碼。

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));} } 這里重寫(xiě)了construct方法,RxReactiveStreams.toObservable(this.chain.filter(exchange)),將reactor的Mono轉(zhuǎn)換為rxjava的Observable 這里重寫(xiě)了resumeWithFallback方法,針對(duì)有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校驗(yàn)了fallbackUri,如果不為null,則必須以forward開(kāi)頭

小結(jié)

spring cloud gateway集成hystrix,分為如下幾步:

添加spring-cloud-starter-netflix-hystrix依賴(lài) 在對(duì)應(yīng)route的filter添加name為Hystrix的filter,同時(shí)指定hystrix command的名稱(chēng),及其fallbackUri(可選) 指定該hystrix command的超時(shí)時(shí)間等。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 国产精品高清在线观看 | 日韩高清网站 | 亚洲五月综合缴情婷婷 | 日本一级特黄毛片高清视频 | 99久久久久国产 | 日本一级毛片中文字幕 | 国产成人夜色91 | 欧洲免费无线码一二区 | 九九久久国产 | 成人区精品一区二区不卡亚洲 | 在线麻豆国产传媒60在线观看 | 91一区二区在线观看精品 | 国产成人综合亚洲欧美在线n | 99热成人精品国产免男男 | 亚色一区| 国产成人综合久久亚洲精品 | 在线观看国产精品入口 | 伊人影院在线观看 | 91福利视频免费 | 51国产视频| 亚洲精品中文字幕午夜 | 久久久国产这里有的是精品 | aaaaa级毛片免费视频 | 成人看片黄在线观看 | 久久综合九色综合97婷婷群聊 | 国产成人精品高清免费 | 国产精品日韩欧美久久综合 | 国产蜜臀 | 国产精品爱久久久久久久9999 | 久久99精品久久久久久青青91 | 国产精品人伦久久 | 国产chinese hdxxxx美女 | 日韩视频免费在线播放 | 22eee在线播放成人免费视频 | 国产亚洲精品一区999 | 国产91小视频 | 性感美女在线喷水 | 亚洲欧美综合乱码精品成人网 | 天天色一色 | 一级特黄aa大片一又好看 | 国产美女福利视频 |