下面介绍1未讲完的网关功能

   1重试功能,配置如下

       

这里可以不写实现类,采用默认的方式配置,然后发送一个http的GET请求,试着断开服务端查看后台:

 证明配置正确,起作用了!

2Jwt拦截器过滤

直接配置在规则路由routes下面,然后写实现类

所写的实体类都是要集成AbstractGatewayFilterFactory网关拦截器工厂接口。因为都是在filters拦截器下的配置属性

这里为啥不做认证配置呢,因为我的项目目前基础信息的auth2的认证服务和资源服务都是放在了一个服务上,所以这里面只需要对请求头携带token判断,简化了网关所需要的信息,但也带出来一个问题,如何来让未携带token认证服务通过网关接口呢,目前的设计思路如下

1直接在启动类手写Bean类,可以绕过配置服务的规则路由,这样就可以拿到认证Token

2单独为login配置一套,参照认证服务简单的模板,2种方法效果一致

3限流

  

限流几种方式:接口限流,用户限流,IP限流

创建配置文件GatewayConfiguration如下

package com.wjx.gateway.Controller.common.config;

import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import reactor.core.publisher.Mono;

/**
 * 配置限流key
 */
@Configuration
public class GatewayConfiguration {
    /**
     * 接口限流操作
     * @return
     */
    @Bean(name="apiKeyResolver")
    public KeyResolver apiKeyResolver() {

        //根据api接口来限流
        return exchange ->
             Mono.just(exchange.getRequest().getPath().value());

    }

    /**
     * ip限流操作
     * @return
     */
    @Bean
    public KeyResolver ipKeyResolver() {
        return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getHostName());
    }

    /**
     * 用户限流
     * 使用这种方式限流,请求路径中必须携带userId参数。
     * @return
     */
//    @Bean
//    KeyResolver userKeyResolver() {
//        return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("userId"));
//    }
}

其实这样配置就应该可以实现限流的目的了(由于本人电脑没安装JMTER,性能有点差跑不动这几个项目了,没测试)

借鉴其他人写的方法,其实也可以对限流进行具体的,因为不能测试,所以没做深入研究,下面只提供方法

去掉默认的限流限定

继承AbstractGatewayFilterFactory工厂类,写一个拦截器类和一个限流类

这样可以比配置文件更加做到细致,如果有人做到了这一步,欢迎把测试结果告诉我,谢谢!!!

 
 
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐