GVKun编程网logo

gateway笔记本电脑产品报价(gateway笔记本电脑价格)

8

如果您对gateway笔记本电脑产品报价感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于gateway笔记本电脑产品报价的详细内容,我们还将为您解答gateway笔记本电脑价

如果您对gateway笔记本电脑产品报价感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于gateway笔记本电脑产品报价的详细内容,我们还将为您解答gateway笔记本电脑价格的相关问题,并且为您提供关于009-spring cloud gateway-过滤器GatewayFilter、GlobalFilter、GatewayFilterChain、作用、生命周期、GatewayFilterFa...、Gateway API 实践之(一)FSM Gateway 中的故障注入策略、Gateway API 实践之(七)FSM Gateway 的负载均衡算法、Gateway API 实践之(三)FSM Gateway 的限速的有价值信息。

本文目录一览:

gateway笔记本电脑产品报价(gateway笔记本电脑价格)

gateway笔记本电脑产品报价(gateway笔记本电脑价格)

gateway 笔记本电脑 产品报价信息,可以说是业内当中比较关注的,gateway品牌的笔记本电脑在国内当中的销量还算不错,并且和众多渠道建立了合作,gateway笔记本电脑产品已经在美国、加拿大、日本以及墨西哥等地区畅销,获得了众多消费者群体、商家用户的一致好评。下面小编就为大家推荐几款口碑不错的gateway笔记本电脑产品以及相关报价

推荐产品一:

产品品牌:Gateway

产品型号:NV49C23c

市场参考价格:1200-1500元

外观上,Gateway NV49C23c承袭了上一代的外观,水纹的顶盖纹理和白色的背景相结合,使整个笔记本看起来很有动感。闪亮的logo镶嵌在顶盖右侧也显得非常别致。屏幕方面该机采用了一款14英寸LED背光显示屏,标准分辨率为1366 x 768。

配置上,Gateway NV49C23c采用了最新的英特尔酷睿双核心四线程的i3-350M处理器,主频为2.26GHz,三级缓存达到了3MB,搭载Intel HM55的芯片主板。标配2GB内存,最高支持8GB,320GB SATA接口的硬盘,内置托盘式 DVD 刻录机,支持DVD SuperMulti双层刻录。显卡方面采用NVIDIA GeForce GT 330M的独立显卡(128位显存位宽,1GB的显存),预装Windows 7操作系统。

推荐产品二:

产品品牌:Gateway

产品型号:T6827C

市场参考价格:800-1100元

客观地说,这款gateway笔记本电脑产品还是给我们带来了一些新鲜的感觉,无论从外观设计、到模具做工,都有着自己的特色,多少让人感受到这个曾经的“美国第三大PC厂商”决不是浪得虚名。这款产品的整体表现比较均衡,键盘上方的多媒体娱乐键顺应了当前的流行趋势,触摸式音量调节键也显得颇为时尚;内置摄像头让网络沟通变得轻而易举,附带的几个应用软件也比较实用。除了游戏性能偏弱,Gateway T-6818c的硬件配置几乎无可挑剔。

推荐产品三:

产品品牌:Gateway

产品型号:P-7808u

市场参考价格:1000-1230元

P-7808u笔记本采用了17英寸显示屏,搭配了Core 2 Quad Q9000处理器,主频为2.0GHz,搭配了NVIDIA GeForce 9800M GTS显卡,具备1GB显存,配置了4GB内存和8倍速DVD刻录光驱,采用了500GB SATA接口硬盘。图片来自ENGADGET网。具备5合1读卡器接口。搭配了9芯锂离子电池,具备千兆以太网卡、无线网卡和蓝牙,带有USB、FireWire、eSATA、RJ11、RJ45、HDMI、 VGA等接口,搭载Vista Home Premium 64位操作系统,配置130万像素摄像头。

以上三款gateway笔记本电脑产品可以说是现在市面上以及网络平台当中最为热销的产品,不仅整体性价比相当出色,更加在性能以及品质方面满足了不同消费群体的需求。不管你是喜欢打游戏,还是看电影,这样的几款电脑都可以带给大家很好的体验,操作起来也相当便利。希望通过上面的简单介绍,能够让大家对gateway笔记本电脑产品的相关信息以及报价有着深入认识。

009-spring cloud gateway-过滤器GatewayFilter、GlobalFilter、GatewayFilterChain、作用、生命周期、GatewayFilterFa...

009-spring cloud gateway-过滤器GatewayFilter、GlobalFilter、GatewayFilterChain、作用、生命周期、GatewayFilterFa...

一、概述

  在Spring-Cloud-Gateway之请求处理流程中最终网关是将请求交给过滤器链表进行处理。

  核心接口:GatewayFilter,GlobalFilter,GatewayFilterChain。

查看整体类图

  

二、网关过滤器作用

  

  当使用微服务构建整个 API 服务时,一般有许多不同的应用在运行,如上图所示的mst-user-servicemst-good-servicemst-order-service,这些服务都需要对客户端的请求的进行 Authentication。最简单粗暴的方法就是像上图一样,为每个微服务应用都实现一套用于校验的过滤器或拦截器。

  通过前置的网关服务来完成这些非业务性质的校验。

  

三、Filter 的生命周期

  Spring Cloud Gateway 的 Filter 的生命周期有两个:“pre” 和 “post”。

  

  “pre”和 “post” 分别会在请求被执行前调用和被执行后调用,和 Zuul Filter 或 Spring Interceptor 中相关生命周期类似,但在形式上有些不一样。

  Zuul 的 Filter 是通过filterType()方法来指定,一个 Filter 只能对应一种类型,要么是 “pre” 要么是“post”。Spring Interceptor 是通过重写HandlerInterceptor中的三个方法来实现的。而 Spring Cloud Gateway 基于 Project Reactor 和 WebFlux,采用响应式编程风格,打开它的 Filter 的接口GatewayFilter你会发现它只有一个方法filter

四、核心接口解读

4.1、GatewayFilterChain--网关过滤链表

/**
 * 网关过滤链表接口
 * 用于过滤器的链式调用
 */
public interface GatewayFilterChain {

    /**
     *  链表启动调用入口方法*/
    Mono<Void> filter(ServerWebExchange exchange);

}

默认实现

  /**
     * 网关过滤的链表,用于过滤器的链式调用
     * 过滤器链表接口的默认实现,
     * 包含2个构建函数:
     *  1.集合参数构建用于初始化吧构建链表
     *  2. index,parent参数用于构建当前执行过滤对应的下次执行的链表 
     */
    private static class DefaultGatewayFilterChain implements GatewayFilterChain {

        /**
         * 当前过滤执行过滤器在集合中索引
         */
        private final int index;
        /**
         * 过滤器集合
         */
        private final List<GatewayFilter> filters;

        public DefaultGatewayFilterChain(List<GatewayFilter> filters) {
            this.filters = filters;
            this.index = 0;
        }

        /**
         * 构建
         * @param parent 上一个执行过滤器对应的FilterChain
         * @param index  当前要执行过滤器的索引
         */
        private DefaultGatewayFilterChain(DefaultGatewayFilterChain parent, int index) {
            this.filters = parent.getFilters();
            this.index = index;
        }

        public List<GatewayFilter> getFilters() {
            return filters;
        }

        /**
         * @param exchange the current server exchange
         * @return
         */
        @Override
        public Mono<Void> filter(ServerWebExchange exchange) {
            return Mono.defer(() -> {
                if (this.index < filters.size()) {
                    //获取当前索引的过滤器
                    GatewayFilter filter = filters.get(this.index);
                    //构建当前索引的下一个过滤器的FilterChain
                    DefaultGatewayFilterChain chain = new DefaultGatewayFilterChain(this, this.index + 1);
                    //调用过滤器的filter方法执行过滤器
                    return filter.filter(exchange, chain);
                } else {
                    //当前索引大于等于过滤集合大小,标识所有链表都已执行完毕,返回空
                    return Mono.empty(); // complete
                }
            });
        }
    }

过滤器的GatewayFilterChain 执行顺序

  1. 通过GatewayFilter集合构建顶层的GatewayFilterChain
  2. 调用顶层GatewayFilterChain,获取第一个Filter,并创建下一个Filter索引对应的GatewayFilterChain
  3. 调用filter的filter方法执行当前filter,并将下次要执行的filter对应GatewayFilterChain传入。

4.2、GatewayFilter--网关路由过滤器

/**
 * 网关路由过滤器,
 * Contract for interception-style, chained processing of Web requests that may
 * be used to implement cross-cutting, application-agnostic requirements such
 * as security, timeouts, and others. Specific to a Gateway
 *
 */
public interface GatewayFilter extends ShortcutConfigurable {

    String NAME_KEY = "name";
    String VALUE_KEY = "value";

    /**
     *  过滤器执行方法
     * Process the Web request and (optionally) delegate to the next
     * {@code WebFilter} through the given {@link GatewayFilterChain}.
     * @param exchange the current server exchange
     * @param chain provides a way to delegate to the next filter
     * @return {@code Mono<Void>} to indicate when request processing is complete
     */
    Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain);

}

网关过滤器接口,有且只有一个方法filter,执行当前过滤器,并在此方法中决定过滤器链表是否继续往下执行。

1️⃣、OrderedGatewayFilter--排序

/**
 * 排序的网关路由过滤器,用于包装真实的网关过滤器,已达到过滤器可排序
 */
public class OrderedGatewayFilter implements GatewayFilter, Ordered {

    //目标过滤器
    private final GatewayFilter delegate;
    //排序字段
    private final int order;

    public OrderedGatewayFilter(GatewayFilter delegate, int order) {
        this.delegate = delegate;
        this.order = order;
    }

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        return this.delegate.filter(exchange, chain);
    }
}

OrderedGatewayFilter实现类主要目的是为了将目标过滤器包装成可排序的对象类型。是目标过滤器的包装类

2️⃣、GatewayFilterAdapter

  /**
     * 全局过滤器的包装类,将全局路由包装成统一的网关过滤器
     */
    private static class GatewayFilterAdapter implements GatewayFilter {

        /**
         * 全局过滤器
         */
        private final GlobalFilter delegate;

        public GatewayFilterAdapter(GlobalFilter delegate) {
            this.delegate = delegate;
        }

        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
            return this.delegate.filter(exchange, chain);
        }
    }

GatewayFilterAdapter实现类主要目的是为了将GlobalFilter过滤器包装成GatewayFilter类型的对应。是GlobalFilter过滤器的包装类

4.3、GlobalFilter

  

  GlobalFilter 为请求业务以及路由的URI转换为真实业务服务的请求地址的核心过滤器,不需要配置,模式系统初始化时加载,并作用在每个路由上

1️⃣、初始化加载,通过GatewayAutoConfiguration自动创建

//GatewayAutoConfiguration 类
        /**
         * 全局过滤器,用户通过HttpClient转发请求
         */
        @Bean
        public NettyRoutingFilter routingFilter(HttpClient httpClient,
                                                ObjectProvider<List<HttpHeadersFilter>> headersFilters) {
            return new NettyRoutingFilter(httpClient, headersFilters);
        }

        /**
         * 全局的过滤器,用户将HttpClient客户端转发请求的响应写入到原始的请求响应中
         */
        @Bean
        public NettyWriteResponseFilter nettyWriteResponseFilter(GatewayProperties properties) {
            return new NettyWriteResponseFilter(properties.getStreamingMediaTypes());
        }
        
//GatewayLoadBalancerClientAutoConfiguration 类
    /**
     * 全局过滤器,用于在通过负载均衡客户端选择服务实例信息
     */
    @Bean
    @ConditionalOnBean(LoadBalancerClient.class)
    public LoadBalancerClientFilter loadBalancerClientFilter(LoadBalancerClient client) {
        return new LoadBalancerClientFilter(client);
    }

2️⃣、GlobalFilter转换成GatewayFilter,并作用于每个路由上,在FilteringWebHandler实现

//FilteringWebHandler类
    /**
     * 包装加载全局的过滤器,将全局过滤器包装成GatewayFilter
     */
    private static List<GatewayFilter> loadFilters(List<GlobalFilter> filters) {
        return filters.stream()
                .map(filter -> {
                    //将所有的全局过滤器包装成网关过滤器
                    GatewayFilterAdapter gatewayFilter = new GatewayFilterAdapter(filter);
                    //判断全局过滤器是否实现了可排序接口
                    if (filter instanceof Ordered) {
                        int order = ((Ordered) filter).getOrder();
                        //包装成可排序的网关过滤器
                        return new OrderedGatewayFilter(gatewayFilter, order);
                    }
                    return gatewayFilter;
                }).collect(Collectors.toList());
    }
    @Override
    public Mono<Void> handle(ServerWebExchange exchange) {
        //获取请求上下文设置的路由实例
        Route route = exchange.getRequiredAttribute(GATEWAY_ROUTE_ATTR);
        //获取路由定义下的网关过滤器集合
        List<GatewayFilter> gatewayFilters = route.getFilters();

        //组合全局的过滤器与路由配置的过滤器
        List<GatewayFilter> combined = new ArrayList<>(this.globalFilters);
        //添加路由配置过滤器到集合尾部
        combined.addAll(gatewayFilters);
        //对过滤器进行排序
        //TODO: needed or cached?
        AnnotationAwareOrderComparator.sort(combined);

        logger.debug("Sorted gatewayFilterFactories: "+ combined);
        //创建过滤器链表对其进行链式调用
        return new DefaultGatewayFilterChain(combined).filter(exchange);
    }
  • loadFilters方法是将全局路由使用GatewayFilterAdapter包装成GatewayFilter
  • handle方法
    • 获取当前请求使用的路由Route
    • 获取路由配置的过滤器集合route.getFilters()
    • 合并全过滤器与路由配置过滤器combined
    • 对过滤器排序AnnotationAwareOrderComparator.sort
    • 通过过滤器集合构建顶级链表DefaultGatewayFilterChain,并对其当前请求调用链表的filter方法。
小结

Spring-Cloud-Gateway的过滤器接口分为两种:

  1. GlobalFilter : 全局过滤器,不需要在配置文件中配置,作用在所有的路由上,最终通过GatewayFilterAdapter包装成GatewayFilterChain可识别的过滤器
  2. GatewayFilter : 需要通过spring.cloud.routes.filters 配置在具体路由下,只作用在当前路由上或通过spring.cloud.default-filters配置在全局,作用在所有路由上

五、GatewayFilterFactory 配置路由过滤器

  路由过滤器允许以某种方式修改传入的HTTP请求或传出的HTTP响应。路径过滤器的范围限定为特定路径。 

1️⃣、加载GatewayFilter

  在路由定位器中以及看到了通过路由定义转换路由方法,其中包含了通过过滤器定义(FilterDefinition)转换过滤器(GatewayFilter)的部分,在RouteDefinitionRouteLocator类中源码如下:

/**
     * 加载过滤器,根据过滤器的定义加载
     */
    @SuppressWarnings("unchecked")
    private List<GatewayFilter> loadGatewayFilters(String id, List<FilterDefinition> filterDefinitions) {
        //遍历过滤器定义,将过滤器定义转换成对应的过滤器
        List<GatewayFilter> filters = filterDefinitions.stream()
                .map(definition -> {
                    //通过过滤器定义名称获取过滤器创建工厂
                    GatewayFilterFactory factory = this.gatewayFilterFactories.get(definition.getName());
                    if (factory == null) {
                        throw new IllegalArgumentException("Unable to find GatewayFilterFactory with name " + definition.getName());
                    }
                    //获取参数
                    Map<String, String> args = definition.getArgs();
                    if (logger.isDebugEnabled()) {
                        logger.debug("RouteDefinition " + id + " applying filter " + args + " to " + definition.getName());
                    }

                    //根据args组装配置信息
                    Map<String, Object> properties = factory.shortcutType().normalize(args, factory, this.parser, this.beanFactory);
                    //构建过滤器创建配置信息
                    Object configuration = factory.newConfig();
                    ConfigurationUtils.bind(configuration, properties,
                            factory.shortcutFieldPrefix(), definition.getName(), validator);

                    //通过过滤器工厂创建GatewayFilter
                    GatewayFilter gatewayFilter = factory.apply(configuration);
                    if (this.publisher != null) {
                        //发布事件
                        this.publisher.publishEvent(new FilterArgsEvent(this, id, properties));
                    }
                    return gatewayFilter;
                })
                .collect(Collectors.toList());

        ArrayList<GatewayFilter> ordered = new ArrayList<>(filters.size());
        //包装过滤器使其所有过滤器继承Ordered属性,可进行排序
        for (int i = 0; i < filters.size(); i++) {
            GatewayFilter gatewayFilter = filters.get(i);
            if (gatewayFilter instanceof Ordered) {
                ordered.add(gatewayFilter);
            }
            else {
                ordered.add(new OrderedGatewayFilter(gatewayFilter, i + 1));
            }
        }

        return ordered;
    }

    /**
     * 获取RouteDefinition中的过滤器集合
     */
    private List<GatewayFilter> getFilters(RouteDefinition routeDefinition) {
        List<GatewayFilter> filters = new ArrayList<>();

        //校验gatewayProperties是否含义默认的过滤器集合
        //TODO: support option to apply defaults after route specific filters?
        if (!this.gatewayProperties.getDefaultFilters().isEmpty()) {
            //加载全局配置的默认过滤器集合
            filters.addAll(loadGatewayFilters("defaultFilters",
                    this.gatewayProperties.getDefaultFilters()));
        }

        if (!routeDefinition.getFilters().isEmpty()) {
            //加载路由定义中的过滤器集合
            filters.addAll(loadGatewayFilters(routeDefinition.getId(), routeDefinition.getFilters()));
        }

        //排序
        AnnotationAwareOrderComparator.sort(filters);
        return filters;
    }
  • getFilters方法 合并配置中的全局过滤器与路由自身配置的过滤器,并对其排序(全局配置过滤器信息通过gatewayProperties.getDefaultFilters()获取)
  • loadGatewayFilters 依次遍历路由定义下的FilterDefinition并将其通过对应的GatewayFilterFactory转换为GatewayFilter对象。
2️⃣、GatewayFilterFactory配置过滤器创建工厂创建GatewayFilter对象
  默认内置很多GatewayFilterFactory实现类,用于创建作用不同的网关过滤器。
类图
  

子类及其划分

3️⃣、AddResponseHeaderGatewayFilterFactory 创建解析

/**
 *
 * 响应header添加数据过滤器
 * 用户在response header中添加配置数据
 */
public class AddResponseHeaderGatewayFilterFactory extends AbstractNameValueGatewayFilterFactory {

    @Override
    public GatewayFilter apply(NameValueConfig config) {
        return (exchange, chain) -> {
            //获取Response并将配置的数据添加到header中
            exchange.getResponse().getHeaders().add(config.getName(), config.getValue());

            return chain.filter(exchange);
        };
    }
}。

配置示例:

spring:
  cloud:
    gateway:
      default-filters:
      - AddResponseHeader=X-Response-Default-Foo, Default-Bar
  • AddResponseHeader=X-Response-Default-Foo, Default-Bar 会被解析成FilterDefinition对象 (name =AddResponseHeader ,args= [X-Response-Default-Foo,Default-Bar])
  • 通FilterDefinition的Name找到AddResponseHeaderGatewayFilterFactory工厂
  • 通过FilterDefinition 的args 创建Config对象(name=X-Response-Default-Foo,value=Default-Bar)
  • 通过 AddResponseHeaderGatewayFilterFactory工厂的apply方法传入config创建GatewayFilter对象。

4️⃣、全部配置

5.1、请求头

spring:
  cloud:
    gateway:
      routes:
      - id: add_request_header_route
        uri: http://example.org
        filters:
        - AddRequestHeader=X-Request-Foo, Bar

名称和值,这将为所有匹配请求的下游请求标头添加X-Request-Foo:Bar标头。

移除请求头

        filters:
        - RemoveRequestHeader=X-Request-Foo

5.2、请求参数

        filters:
        - AddRequestParameter=foo, bar

这会将foo = bar添加到下游请求的所有匹配请求的查询字符串中。

5.3、添加响应头

        filters:
        - AddResponseHeader=X-Response-Foo, Bar

这会将X-Response-Foo:Bar标头添加到所有匹配请求的下游响应标头中。

移除响应头

        filters:
        - RemoveResponseHeader=X-Response-Foo

设置响应头

        filters:
        - SetResponseHeader=X-Response-Foo, Bar

此GatewayFilter将替换具有给定名称的所有标头,而不是添加。

5.4、路径前缀

        filters:
        - PrefixPath=/mypath

这将使/ mypath前缀为所有匹配请求的路径。所以对/ hello的请求会被发送到/ mypath / hello。

5.5、原始主机头

没有参数,此过滤器设置路由过滤器将检查的请求属性,以确定是否应发送原始主机头,而不是http客户端确定的主机头。

        filters:
        - PreserveHostHeader

5.6、重定向

        filters:
        - RedirectTo=302, http://acme.org

这将发送带有Location:http://acme.org标头的状态302以执行重定向。

5.7、重写路径

        predicates:
        - Path=/foo/**
        filters:
        - RewritePath=/foo/(?<segment>.*), /$\{segment}

对于/ foo / bar的请求路径,这将在发出下游请求之前将路径设置为/ bar。注意由于YAML规范,$ \替换为$。

5.8、保存Session

        predicates:
        - Path=/foo/**
        filters:
        - SaveSession

5.9、路径模板

SetPath GatewayFilter Factory采用路径模板参数。它提供了一种通过允许模板化路径段来操作请求路径的简单方法。

        predicates:
        - Path=/foo/{segment}
        filters:
        - SetPath=/{segment}

对于/ foo / bar的请求路径,这将在发出下游请求之前将路径设置为/ bar。

5.10、设置响应状态

spring:
  cloud:
    gateway:
      routes:
      - id: setstatusstring_route
        uri: http://example.org
        filters:
        - SetStatus=BAD_REQUEST
      - id: setstatusint_route uri: http://example.org  filters: - SetStatus=401

5.11、请求参数剥离

parts参数指示在将请求发送到下游之前从请求中剥离的路径中的部分数。

        predicates:
        - Path=/name/**
        filters:
        - StripPrefix=2

当通过网关向/ name / bar / foo发出请求时,对nameservice的请求将类似于http:// nameservice / foo。

5.12、重试

retries:重试:应该尝试的重试次数

statuses:状态:应该重试的HTTP状态代码,使用org.springframework.http.HttpStatus表示

methods:方法:应该重试的HTTP方法,使用org.springframework.http.HttpMethod表示

series:系列:要重试的状态代码系列,使用org.springframework.http.HttpStatus.Series表示

      routes:
      - id: retry_test
        uri: http://localhost:8080/flakey
        predicates:
        - Host=*.retry.com
        filters:
        - name: Retry args: retries: 3 statuses: BAD_GATEWAY

5.13、Hystrix GatewayFilter Factory

https://cloud.spring.io/spring-cloud-static/Finchley.SR1/single/spring-cloud.html#_hystrix_gatewayfilter_factory

5.14、请求限速 

  RequestRateLimiter GatewayFilter Factory

5.15、安全头

  SecureHeaders GatewayFilter Factory

  

Gateway API 实践之(一)FSM Gateway 中的故障注入策略

Gateway API 实践之(一)FSM Gateway 中的故障注入策略

在 之前的文章 中,我们快速体验了 FSM Gateway - 一个开源的 K8s Gateway API 的实现。在即将发布的 FSM 1.2 中,FSM Gateway 将会带来更多的功能:

  • 故障注入策略
  • 限流策略
  • 会话保持策略
  • 负载均衡算法
  • 熔断策略
  • 访问控制策略
  • 健康检查策略
  • TLS 上游策略
  • ...

后面我们会推出系列的文章来介绍这些功能,这篇文章是文章的第一篇,在 FSM 1.2 即将发布之际,为大家带来 FSM Gateway 故障注入功能的前瞻。

背景

什么是故障注入

故障注入功能是一种强大的测试机制,用于增强微服务架构的健壯性和可靠性。这项功能通过模拟网络层面的故障(如延迟和错误响应)来测试系统的容错能力和恢复机制。故障注入主要包括两种类型:延迟注入和错误注入。

延迟注入是通过在网关处理请求的过程中人为地引入延迟,模拟网络延迟或服务处理缓慢的情况。这有助于测试下游服务的超时处理和重试策略是否有效,确保在实际延迟发生时,整个系统能够保持稳定运行。

错误注入则是通过让网关返回错误响应(如 HTTP 5xx 错误)来模拟后端服务故障。这种方法可以验证服务消费者对于失败的处理,比如是否正确地执行了错误处理逻辑和容错机制,例如断路器模式。

FSM Gateway 支持这两种故障注入,同时提供了两种粒度的故障注入:域名和路由。接下来通过演示带领各位展示 FSM Gateway 的故障注入。

FSM Gateway 使用了 FGW 作为内核,因此拥有 与 FGW 同样的故障注入功能。

演示

前置条件

  • Kubernetes 集群
  • kubectl 工具

环境准备

安装 FSM Gateway

FSM Gateway 的安装,可以参考 安装文档。这里选择 CLI 的方式安装。

下载 FSM CLI,当前为 v1.2.0-alpha.12 版本。

system=$(uname -s | tr ''[:upper:]'' ''[:lower:]'')
arch=$(uname -m | sed -E ''s/x86_/amd/'' | sed -E ''s/aarch/arm/'')
release=v1.2.0-alpha.12
curl -L https://github.com/flomesh-io/fsm/releases/download/$release/fsm-$release-$system-$arch.tar.gz | tar -vxzf -
./$system-$arch/fsm version
sudo cp ./$system-$arch/fsm /usr/local/bin/fsm

在安装 FSM 时启用 FSM Gateway,默认情况是不启用的。

fsm install \
    --set=fsm.fsmGateway.enabled=true

确认已经安装 GatewayClass 控制器:flomesh.io/gateway-controller

kubectl get gatewayclass 
NAME              CONTROLLER                      ACCEPTED   AGE
fsm-gateway-cls   flomesh.io/gateway-controller   True       12h

部署示例应用

接下来部署示例应用,使用常用的 httpbin 服务,并创建 网关(Gateway) 和 HTTP 路由(HttpRoute)。

kubectl create namespace httpbin
kubectl apply -n httpbin -f https://raw.githubusercontent.com/flomesh-io/fsm-docs/main/manifests/gateway/http-routing.yaml

检查网关和 HTTP 路由,可以看到创建了两个不同域名的路由。

kubectl get gateway,httproute -n httpbin
NAME                                                   CLASS             ADDRESS   PROGRAMMED   AGE
gateway.gateway.networking.k8s.io/simple-fsm-gateway   fsm-gateway-cls             Unknown      3s

NAME                                                 HOSTNAMES             AGE
httproute.gateway.networking.k8s.io/http-route-foo   ["foo.example.com"]   2s
httproute.gateway.networking.k8s.io/http-route-bar   ["bar.example.com"]   2s

访问应用验证 HTTP 路由是否生效。

export GATEWAY_IP=$(kubectl get svc -n httpbin -l app=fsm-gateway -o jsonpath=''{.items[0].status.loadBalancer.ingress[0].ip}'')

curl http://$GATEWAY_IP:8000/headers -H ''host:foo.example.com''
{
  "headers": {
    "Accept": "*/*",
    "Connection": "keep-alive",
    "Host": "10.42.0.15:80",
    "User-Agent": "curl/7.81.0"
  }
}

故障注入测试

路由粒度的故障注入

在 HTTP 路由 foo.example.com 下我们添加一条路径前缀为 /headers 的路由,方便为其设置故障注入。

kubectl apply -n httpbin -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
  name: http-route-foo
spec:
  parentRefs:
  - name: simple-fsm-gateway
    port: 8000
  hostnames:
  - foo.example.com
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /headers
    backendRefs:
    - name: httpbin
      port: 8080  
  - matches:
    - path:
        type: PathPrefix
        value: /
    backendRefs:
    - name: httpbin
      port: 8080
EOF

当我们请求路径 /headers/get 时都可以获得正确的响应。

接下来,我们在 /headers 路由上注入 404 故障,概率为 100%

kubectl apply -n httpbin -f - <<EOF
apiVersion: gateway.flomesh.io/v1alpha1
kind: FaultInjectionPolicy
metadata:
  name: fault-injection
spec:
  targetRef:
    group: gateway.networking.k8s.io
    kind: HTTPRoute
    name: http-route-foo
    namespace: httpbin
  http:
  - match:
      path:
        type: PathPrefix
        value: /headers
    config: 
      abort:
        percent: 100
        statusCode: 404
EOF

此时请求 /headers 收到了 404 响应。

curl -I http://$GATEWAY_IP:8000/headers -H ''host:foo.example.com''
HTTP/1.1 404 Not Found
content-length: 0
connection: keep-alive

如果请求 /get,则不会受到影响。

curl -I http://$GATEWAY_IP:8000/get -H ''host:foo.example.com''
HTTP/1.1 200 OK
server: gunicorn/19.9.0
date: Thu, 14 Dec 2023 14:11:36 GMT
content-type: application/json
content-length: 220
access-control-allow-origin: *
access-control-allow-credentials: true
connection: keep-alive

域名粒度的故障注入

kubectl apply -n httpbin -f - <<EOF
apiVersion: gateway.flomesh.io/v1alpha1
kind: FaultInjectionPolicy
metadata:
  name: fault-injection
spec:
  targetRef:
    group: gateway.networking.k8s.io
    kind: HTTPRoute
    name: http-route-foo
    namespace: httpbin
  hostnames:
    - hostname: foo.example.com
      config: 
        abort:
          percent: 100
          statusCode: 404
EOF

请求 foo.example.com,返回 404 响应。

curl -I http://$GATEWAY_IP:8000/headers -H ''host:foo.example.com''
HTTP/1.1 404 Not Found
content-length: 0
connection: keep-alive

但此时请求 bar.example.com,由于域名并不在故障注入的命名列表下,因此响应正常,

curl -I http://$GATEWAY_IP:8000/headers -H ''host:bar.example.com''
HTTP/1.1 200 OK
server: gunicorn/19.9.0
date: Thu, 14 Dec 2023 13:55:07 GMT
content-type: application/json
content-length: 140
access-control-allow-origin: *
access-control-allow-credentials: true
connection: keep-alive

修改故障注入策略,将错误故障,改为延迟故障:随机加入 500 到 1000 ms 的延迟。

kubectl apply -n httpbin -f - <<EOF
apiVersion: gateway.flomesh.io/v1alpha1
kind: FaultInjectionPolicy
metadata:
  name: fault-injection
spec:
  targetRef:
    group: gateway.networking.k8s.io
    kind: HTTPRoute
    name: http-route-foo
    namespace: httpbin
  hostnames:
    - hostname: foo.example.com
      config: 
        delay:
          percent: 100
          range: 
            min: 500
            max: 1000
          unit: ms
EOF

请求时检查响应的耗时,可以看到引入了随机的延迟。

time curl -s http://$GATEWAY_IP:8000/headers -H ''host:foo.example.com'' > /dev/null

real    0m0.904s
user    0m0.000s
sys    0m0.010s

time curl -s http://$GATEWAY_IP:8000/headers -H ''host:foo.example.com'' > /dev/null

real    0m0.572s
user    0m0.005s
sys    0m0.005s

Gateway API 实践之(七)FSM Gateway 的负载均衡算法

Gateway API 实践之(七)FSM Gateway 的负载均衡算法

FSM Gateway 流量管理策略系列:

  • 故障注入
  • 黑白名单访问控制
  • 限速
  • 重试
  • 会话保持
  • 健康检查
  • 负载均衡算法
  • TLS 上游
  • 双向 TLS

在微服务和 API 网关架构中,负载均衡是至关重要的,它确保每个服务实例都能平均地处理请求,同时也为高可用性和故障恢复提供了机制。FSM Gateway 提供了多种负载均衡算法,让可以根据业务需求和流量模式选择最适合的方法。

支持多种负载均衡算法,方便高效地分配流量,最大化资源利用率,提高服务的响应时间:

  • RoundRobinLoadBalancer:这是最常见的负载均衡算法,请求将按顺序分配给每个服务实例。如果不特别指定,FSM Gateway 默认使用此算法。
  • HashingLoadBalancer:根据请求的某些属性(如来源 IP 或请求头)计算哈希值,然后根据该哈希值将请求路由到特定的服务实例。这确保了相同的请求者或相同类型的请求总是被路由到同一服务实例。
  • LeastConnectionLoadBalancer:这种算法会考虑每个服务实例的当前工作负载(连接数),并将新的请求分配给当前负载最小的实例,从而确保更均匀的资源利用。

前置条件

  • Kubernetes 集群
  • kubectl 工具

环境准备

安装 FSM Gateway

FSM Gateway 的安装,可以参考 安装文档。这里选择 CLI 的方式安装。

下载 FSM CLI。

system=$(uname -s | tr ''[:upper:]'' ''[:lower:]'')
arch=$(uname -m | sed -E ''s/x86_/amd/'' | sed -E ''s/aarch/arm/'')
release=v1.2.0
curl -L https://github.com/flomesh-io/fsm/releases/download/$release/fsm-$release-$system-$arch.tar.gz | tar -vxzf -
./$system-$arch/fsm version
sudo cp ./$system-$arch/fsm /usr/local/bin/fsm

在安装 FSM 时启用 FSM Gateway,默认情况是不启用的。

fsm install \
    --set=fsm.fsmGateway.enabled=true

部署示例应用

为了验证负载均衡功能,需要两个响应不同状态码(200、201)和内容的端点。因此我们创建了 Service pipy,并为其创建了两个返回不同响应的端点。这两个端点使用可编程代理 Pipy 来模拟的。

kubectl create namespace server
kubectl apply -n server -f - <<EOF
apiVersion: v1
kind: Service
metadata:
  name: pipy
spec:
  selector:
    app: pipy
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080

---
apiVersion: v1
kind: Pod
metadata:
  name: pipy-1
  labels:
    app: pipy
spec:
  containers:
  - name: pipy
    image: flomesh/pipy:0.99.0-2
    command: ["pipy", "-e", "pipy().listen(8080).serveHTTP(new Message({status: 200},''Hello, world''))"]

---
apiVersion: v1
kind: Pod
metadata:
  name: pipy-2
  labels:
    app: pipy
spec:
  containers:
  - name: pipy
    image: flomesh/pipy:0.99.0-2
    command: ["pipy", "-e", "pipy().listen(8080).serveHTTP(new Message({status: 201},''Hi, world''))"]
EOF

创建网关和路由

接下来创建网关并为 Service pipy 创建路由。

kubectl apply -n server -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:
  name: simple-fsm-gateway
spec:
  gatewayClassName: fsm-gateway-cls
  listeners:
  - protocol: HTTP
    port: 8000
    name: http
    allowedRoutes:
      namespaces:
        from: Same
---
apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
  name: fortio-route
spec:
  parentRefs:
  - name: simple-fsm-gateway
    port: 8000
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /
    backendRefs:
    - name: pipy
      port: 8080
EOF

检查应用是否可以正常访问。通过结果可以看到,网关将请求负载均衡到了两个端点上,默认使用的是轮询负载均衡算法。

export GATEWAY_IP=$(kubectl get svc -n server -l app=fsm-gateway -o jsonpath=''{.items[0].status.loadBalancer.ingress[0].ip}'')

curl http://$GATEWAY_IP:8000/
Hi, world

curl http://$GATEWAY_IP:8000/
Hello, world

curl http://$GATEWAY_IP:8000/
Hi, world

负载均衡策略验证

负载均衡策略的配置可以参考文档 LoadBalancerPolicy。

轮询负载均衡算法

使用 fortio load 生成负载进行测试:使用 50 个并发发送 200 个请求。可以看到响应状态码 200 和 201 各占一半,这是因为默认情况下使用的是轮询算法,请求被负载均衡到两个端点。

fortio load -quiet -c 50 -n 200 http://$GATEWAY_IP:8000/

Code 200 : 100 (50.0 %)
Code 201 : 100 (50.0 %)

哈希一致性负载均衡算法

让我们设置负载均衡策略,将算法这是为 HashingLoadBalancer

kubectl apply -n server -f - <<EOF
apiVersion: gateway.flomesh.io/v1alpha1
kind: LoadBalancerPolicy
metadata:
  name: lb-policy-sample
spec:
  targetRef:
    group: ""
    kind: Service
    name: pipy
    namespace: server
  ports:
    - port: 8080
      type: HashingLoadBalancer
EOF

同样还是发送同样的负载,可以看到 200 个请求都被代理到同一个端点。对于同一个客户端发送的请求,FSM Gateway 通过哈希一致性算法,都会选择同一个端点来处理请求。

fortio load -quiet -c 50 -n 200 http://$GATEWAY_IP:8000/

Code 201 : 200 (50.0 %)

最小连接数均衡算法

在 Kubernetes 中,同一个 Service 的多个端点的规格应该是相同的,使用最小连接数均衡算法,最终的效果实际跟轮询的算法一致。

kubectl apply -n server -f - <<EOF
apiVersion: gateway.flomesh.io/v1alpha1
kind: LoadBalancerPolicy
metadata:
  name: lb-policy-sample
spec:
  targetRef:
    group: ""
    kind: Service
    name: pipy
    namespace: server
  ports:
    - port: 8080
      type: LeastConnectionLoadBalancer
EOF

发送同样的负载,与我们预想的一样,负载被均匀的代理到两个端点。

fortio load -quiet -c 50 -n 200 http://$GATEWAY_IP:8000/

Code 200 : 100 (50.0 %)
Code 201 : 100 (50.0 %)

关于 Flomesh

Flomesh(易衡科技)成立于 2018 年,自主研发并开源了高性能可编程代理 Pipy(https://github.com/flomesh-io/pipy)。以 Pipy 为基础,Flomesh 研发了软件负载均衡、服务网格两款软件产品。为工信部认证的可信云产品、可信开源项目。

Flomesh 核心竞争力来自完全自研的核心组件 Pipy,该组件高性能、高可靠、低延迟、可编程、可扩展、低依赖,采用 C++ 开发,内置自研的 JS 引擎,支持适用 JS 脚本做扩展开发。支持包括 x86、arm、龙芯、海光等硬件 CPU 架构;支持 Linux、FreeBSD、OpenWrt 等多种核心的操作系统。

Flomesh 成立以来,以技术为根基、以客户为导向,产品被应用在头部股份制商业银行总行、大型保险公司、运营商总部以及研究院等众多客户和多个场景。

Gateway API 实践之(三)FSM Gateway 的限速

Gateway API 实践之(三)FSM Gateway 的限速

【直播预告】程序员逆袭 CEO 分几步?

这是开源的 K8s Gateway API 实现 FSM Gateway 实践系列的第三篇:

  • 故障注入
  • 访问控制
  • 限速

网关的限速功能是一种关键的网络流量管理策略,用于控制通过网关的数据传输速率,对于确保网络的稳定性和效率至关重要。。

FSM Gateway 的限速功能可以基于多种标准实施,包括端口、域名和路由。

  • 基于端口的限速:控制端口数据传输的速率,确保流量不超过设定的阈值。这通常用于防止网络拥堵和服务器过载。
  • 基于域名的限速:针对特定域名设置请求速率限制。这种策略通常用于控制对特定服务或应用的访问频率,以防止过载和保证服务质量。
  • 基于路由的限速:针对特定路由或 URL 路径设置请求速率限制。这种方式更加细致,允许对单个应用内的不同部分进行差异化流量控制。

限速配置

  • targetRef 是对应用策略的目标资源的引用,这里设置的是端口粒度的限速,因此引用的是 Gateway 资源 simple-fsm-gateway
  • bps:端口的默认限速,每秒通过的字节数
  • config:L7 的限速配置
  • ports
    • port 指定端口
    • bps 设置每秒的字节数
  • hostnames
    • hostname:域名
    • config:L7 的限速配置
  • http
    • match
      • headers:HTTP 请求匹配
      • method:HTTP method 匹配
    • config:L7 的限速配置

L7 的限速配置:

  • backlog 积压值是指在达到限速阈值时,系统允许排队的请求数量。这是一个重要的字段,尤其是在系统突然遭受大量请求时,这些请求可能会超过设置的限速阈值。积压值为系统提供了一定的缓冲,可以处理超出限速阈值的请求,但在积压值上限内。一旦达到积压上限,任何新的请求都会立即被拒绝,无需等待。可选字段,默认是 10
  • requests 请求值是指在限速时间窗口内允许的访问次数。这是限速策略的核心参数,它确定了在特定的时间窗口内可以接受多少请求。设置此值的目的是为了确保在给定的时间窗口内,后端系统不会受到超过它能处理的请求。必须字段,最小值是 1
  • statTimeWindow 限速时间窗口(单位:秒)定义了统计请求数量的时间段。限速策略通常基于滑动窗口或固定窗口来实现。StatTimeWindow 定义了这个窗口的大小。比如,如果 statTimeWindow 设置为 60 秒,并且 requests 为 100,则意味着每 60 秒内最多只能有 100 个请求。必须字段
  • burst: 爆发值表示在短时间内允许的最大请求次数。这是一个可选字段,它主要用于处理短时间的请求高峰。爆发值通常大于请求值,允许在短时间内接受的请求数量超过平均速率。可选字段。
  • responseStatusCode: 发生限速时,返回给客户端的 HTTP 状态码。这个状态码告诉客户端请求被拒绝的原因是因为达到了限速阈值。常见的状态码是 429(Too Many Requests),但可以根据需要自定义。必须字段。
  • responseHeadersToAdd: 发生限速时,要添加到响应中的 HTTP 头部信息。这可以用来通知客户端有关限速策略的更多信息。例如,可以添加一个 RateLimit-Limit 头来告诉客户端限速的配置。还可以提供关于当前限速策略或如何联系系统管理员的其他有用信息。可选字段。

前置条件

  • Kubernetes 集群
  • kubectl 工具

环境准备

安装 FSM Gateway

FSM Gateway 的安装,可以参考 安装文档。这里选择 CLI 的方式安装。

下载 FSM CLI。

system=$(uname -s | tr ''[:upper:]'' ''[:lower:]'')
arch=$(uname -m | sed -E ''s/x86_/amd/'' | sed -E ''s/aarch/arm/'')
release=v1.2.0
curl -L https://github.com/flomesh-io/fsm/releases/download/$release/fsm-$release-$system-$arch.tar.gz | tar -vxzf -
./$system-$arch/fsm version
sudo cp ./$system-$arch/fsm /usr/local/bin/fsm

在安装 FSM 时启用 FSM Gateway,默认情况是不启用的。

fsm install \
    --set=fsm.fsmGateway.enabled=true

部署示例应用

接下来部署示例应用,使用常用的 httpbin 服务,并创建 网关(Gateway) 和 HTTP 路由(HttpRoute)。

kubectl create namespace httpbin
kubectl apply -n httpbin -f https://raw.githubusercontent.com/flomesh-io/fsm-docs/main/manifests/gateway/http-routing.yaml

检查网关和 HTTP 路由,可以看到创建了两个不同域名的路由。

kubectl get gateway,httproute -n httpbin
NAME                                                   CLASS             ADDRESS   PROGRAMMED   AGE
gateway.gateway.networking.k8s.io/simple-fsm-gateway   fsm-gateway-cls             Unknown      3s

NAME                                                 HOSTNAMES             AGE
httproute.gateway.networking.k8s.io/http-route-foo   ["foo.example.com"]   2s
httproute.gateway.networking.k8s.io/http-route-bar   ["bar.example.com"]   2s

访问应用验证 HTTP 路由是否生效。

export GATEWAY_IP=$(kubectl get svc -n httpbin -l app=fsm-gateway -o jsonpath=''{.items[0].status.loadBalancer.ingress[0].ip}'')

curl http://$GATEWAY_IP:8000/headers -H ''host:foo.example.com''
{
  "headers": {
    "Accept": "*/*",
    "Connection": "keep-alive",
    "Host": "10.42.0.15:80",
    "User-Agent": "curl/7.81.0"
  }
}

限速测试

基于端口的限速

创建一个 8k 大小的文件。

dd if=/dev/zero of=payload bs=1K count=8

测试发送文件到服务的耗时仅需 1s。

time curl -s -X POST -T payload http://$GATEWAY_IP:8000/status/200 -H ''host:foo.example.com''

real	0m1.018s
user	0m0.001s
sys	0m0.014s

接下来设置限速策略:

  • targetRef 是对应用策略的目标资源的引用,这里设置的是端口粒度的限速,因此引用的是 Gateway 资源 simple-fsm-gateway
  • ports
    • port 指定端口 8000
    • bps 设置每秒的字节数为 2k
kubectl apply -n httpbin -f - <<EOF
apiVersion: gateway.flomesh.io/v1alpha1
kind: RateLimitPolicy
metadata:
  name: ratelimit-sample
spec:
  targetRef:
    group: gateway.networking.k8s.io
    kind: Gateway
    name: simple-fsm-gateway
    namespace: httpbin
  ports:
    - port: 8000
      bps: 2048
EOF

待上面的策略生效后,还是发送 8k 的文件,现在限速的策略起了作用,耗时 4 秒。

time curl -s -X POST -T payload http://$GATEWAY_IP:8000/status/200 -H ''host:foo.example.com''

real	0m4.016s
user	0m0.007s
sys	0m0.005s

基于域名的限速

在测试基于域名的限速之前,删除上面创建的策略。

kubectl delete ratelimitpolicies -n httpbin ratelimit-sample

然后使用 forito 来生成负载:1 个并发以 200 qps 发送 1000 个请求。

fortio load -quiet -c 1 -n 1000 -qps 200 -H ''host:foo.example.com'' http://$GATEWAY_IP:8000/status/200

Code 200 : 1000 (100.0 %)

接下来设置限速策略:

  • 限速的域名为 foo.example.com
  • backlog 积压的请求设为 1
  • 窗口期 60s 内的最大请求数未 200
  • 限速后的请求返回 429 并添加响应头 RateLimit-Limit: 200
kubectl apply -n httpbin -f - <<EOF
apiVersion: gateway.flomesh.io/v1alpha1
kind: RateLimitPolicy
metadata:
  name: ratelimit-sample
spec:
  targetRef:
    group: gateway.networking.k8s.io
    kind: HTTPRoute
    name: http-route-foo
    namespace: httpbin
  hostnames:
    - hostname: foo.example.com
      config: 
        backlog: 1
        requests: 100
        statTimeWindow: 60
        responseStatusCode: 429
        responseHeadersToAdd:
          - name: RateLimit-Limit
            value: "100"
EOF

策略生效后,还是生成相同的负载来测试。可以看到成功的响应有 200,被限速的响应有 798。

-1 是 fortio 在 read timeout 时设定的错误码。这是因为 fortio 默认的 timeout 为 3s,限速策略设置积压的请求是 1。FSM Gateway 默认为 2 个线程,因此超时的请求有 2 个。

fortio load -quiet -c 1 -n 1000 -qps 200 -H ''host:foo.example.com'' http://$GATEWAY_IP:8000/status/200

Code  -1 : 2 (0.2 %)
Code 200 : 200 (19.9 %)
Code 429 : 798 (79.9 %)

但是访问 bar.example.com 则不会被限速。

fortio load -quiet -c 1 -n 1000 -qps 200 -H ''host:bar.example.com'' http://$GATEWAY_IP:8000/status/200

Code 200 : 1000 (100.0 %)

基于路由的限速

同样地,在开始下面的测试之前删除上面创建的策略。

kubectl delete ratelimitpolicies -n httpbin ratelimit-sample

在配置访问策略之前,在 HTTP 路由 foo.example.com 下我们添加一条路径前缀为 /headers 的路由,方便为其设置访问控制策略。

kubectl apply -n httpbin -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
  name: http-route-foo
spec:
  parentRefs:
  - name: simple-fsm-gateway
    port: 8000
  hostnames:
  - foo.example.com
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /status/200
    backendRefs:
    - name: httpbin
      port: 8080  
  - matches:
    - path:
        type: PathPrefix
        value: /
    backendRefs:
    - name: httpbin
      port: 8080
EOF

更新限速策略,添加路由匹配规则:前缀为 /status/200,其他的配置保持不限。

kubectl apply -n httpbin -f - <<EOF
apiVersion: gateway.flomesh.io/v1alpha1
kind: RateLimitPolicy
metadata:
  name: ratelimit-sample
spec:
  targetRef:
    group: gateway.networking.k8s.io
    kind: HTTPRoute
    name: http-route-foo
    namespace: httpbin
  http:
    - match:
        path:
          type: PathPrefix
          value: /status/200        
      config: 
        backlog: 1
        requests: 100
        statTimeWindow: 60
        responseStatusCode: 429
        responseHeadersToAdd:
          - name: RateLimit-Limit
            value: "100"
EOF

应用策略后,发送同样的负载。从结果可以看到只有 200 个请求成功。

fortio load -quiet -c 1 -n 1000 -qps 200 -H ''host:foo.example.com'' http://$GATEWAY_IP:8000/status/200

Code  -1 : 2 (0.2 %)
Code 200 : 200 (20.0 %)
Code 429 : 798 (79.8 %)

当路径 /status/204 则不会受限速的限制。

fortio load -quiet -c 1 -n 1000 -qps 200 -H ''host:foo.example.com'' http://$GATEWAY_IP:8000/status/204

Code 204 : 1000 (100.0 %)

今天关于gateway笔记本电脑产品报价gateway笔记本电脑价格的分享就到这里,希望大家有所收获,若想了解更多关于009-spring cloud gateway-过滤器GatewayFilter、GlobalFilter、GatewayFilterChain、作用、生命周期、GatewayFilterFa...、Gateway API 实践之(一)FSM Gateway 中的故障注入策略、Gateway API 实践之(七)FSM Gateway 的负载均衡算法、Gateway API 实践之(三)FSM Gateway 的限速等相关知识,可以在本站进行查询。

本文标签: