欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2021年07月17日 09:53:36   作者:go4it  
這篇文章主要介紹了spring cloud gateway集成hystrix實戰(zhàn),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

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: 5000
spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
      routes:
      - id: employee-service
        uri: lb://employee-service
        predicates:
        - 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 {
        @Bean
        public 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 status
                        setResponseStatus(exchange, HttpStatus.GATEWAY_TIMEOUT);
                        return exchange.getResponse().setComplete();
                    }
                }
                return Mono.error(throwable);
            }).then();
        };
    }
    //......
}

這里創(chuàng)建了RouteHystrixCommand,將其轉換為Mono,然后在onErrorResume的時候判斷如果HystrixRuntimeException的failureType是FailureType.TIMEOUT類型的話,則返回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;
        }
        @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的超時時間等。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • 基于java開發(fā)之系統(tǒng)托盤的應用

    基于java開發(fā)之系統(tǒng)托盤的應用

    本篇文章介紹了,基于java開發(fā)之系統(tǒng)托盤的應用。需要的朋友參考下
    2013-05-05
  • Spring Mvc中傳遞參數(shù)方法之url/requestMapping詳解

    Spring Mvc中傳遞參數(shù)方法之url/requestMapping詳解

    在開發(fā)中,參數(shù)傳遞是必不可少的一個功能,下面這篇文章主要給大家介紹了關于Spring Mvc中傳遞參數(shù)方法之url/requestMapping的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-07-07
  • Java中String和StringBuffer及StringBuilder?有什么區(qū)別

    Java中String和StringBuffer及StringBuilder?有什么區(qū)別

    這篇文章主要介紹了Java中String和StringBuffer及StringBuilder?有什么區(qū)別,String?是?Java?語言非?;A和重要的類,更多相關內容需要的小伙伴可以參考下面文章內容
    2022-06-06
  • Java動態(tài)代理Proxy應用和底層源碼詳細分析

    Java動態(tài)代理Proxy應用和底層源碼詳細分析

    Java動態(tài)代理是一種在運行時生成代理類的機制,用于代替手動編寫代理類的過程,這篇文章主要給大家介紹了關于Java動態(tài)代理Proxy應用和底層源碼詳細分析的相關資料,需要的朋友可以參考下
    2024-03-03
  • java版微信公眾平臺消息接口應用示例

    java版微信公眾平臺消息接口應用示例

    這篇文章主要介紹了java版微信公眾平臺消息接口應用,結合實例形式對比分析了PHP與java應用微信公眾平臺接口的相關調用與操作技巧,需要的朋友可以參考下
    2017-07-07
  • java使用Graphics2D繪圖/畫圖方式

    java使用Graphics2D繪圖/畫圖方式

    這篇文章主要介紹了java使用Graphics2D繪圖/畫圖方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Spring注解方式防止重復提交原理詳解

    Spring注解方式防止重復提交原理詳解

    這篇文章主要為大家詳細介紹了Spring注解方式防止重復提交原理,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • 基于Spring AOP的Log收集匯總

    基于Spring AOP的Log收集匯總

    張三針對公司現(xiàn)有日志處理系統(tǒng)的不足,采用了SpringAOP技術和Redis存儲,設計并實現(xiàn)了一個性能更高效的日志處理系統(tǒng),該系統(tǒng)通過SpringAOP的切面攔截功能,捕獲方法調用信息作為日志內容,并將其統(tǒng)一格式化后存儲到Redis中
    2024-10-10
  • SpringBoot+MySQL+Jpa實現(xiàn)對數(shù)據(jù)庫的增刪改查和分頁詳解

    SpringBoot+MySQL+Jpa實現(xiàn)對數(shù)據(jù)庫的增刪改查和分頁詳解

    這篇文章主要介紹了SpringBoot+MySQL+Jpa實現(xiàn)對數(shù)據(jù)庫的增刪改查和分頁詳解,需要的朋友可以參考下
    2020-02-02
  • Java實例講解反射機制是怎么一回事

    Java實例講解反射機制是怎么一回事

    Java的反射(reflection)機制是指在程序的運行狀態(tài)中,可以構造任意一個類的對象,可以了解任意一個對象所屬的類,可以了解任意一個類的成員變量和方法,可以調用任意一個對象的屬性和方法
    2022-03-03

最新評論