核心概念
路由:网关中最基础的部分,路由信息包括一个id、一个目的URI、一组断言工厂、一组Filter组成。如果断言为真,则说明请求的URL和配置的路径匹配。
断言:Java8的断言函数,SpringCloud Gateway中的断言函数类型是Spring5.0框架中的ServerWebExchange。断言函数允许开发者定义匹配Http request中的任何信息,比如请求头和参数等。
过滤器:SpringCloud Gateway中filter分为Gateway Filter和Global Filter。Filter可以对请求和响应进行处理。
工作原理

服务搭建
引入依赖
    <dependencies>
        <!-- 注册中心,服务注册和发现 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- gateway -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
    </dependencies> 
配置gateway.discovery.locator.enable=true接口测试:

 
路由
配置gateway.discovery.locator.enable=false

 
自定义断言工厂MyCheckRoutePredicateFactor:
@Component
@Slf4j
public class MyCheckRoutePredicateFactory extends AbstractRoutePredicateFactory<MyCheckRoutePredicateFactory.Config> {
    public MyCheckRoutePredicateFactory(){
        super(Config.class);
    }
    @Override
    public Predicate<ServerWebExchange> apply(Config config) {
        log.info("=========MyCheckRoutePredicateFactory start==================");
        log.info("=============================================================name=================="+config.getName());
        return new GatewayPredicate() {
            @Override
            public boolean test(ServerWebExchange serverWebExchange) {
                if("drb".equals(config.getName())){
                    log.info("**********************************true:name=drb");
                    return true;
                }
                log.info("********************************false:name="+config.getName());
                return false;
            }
        };
    }
    /**快捷配置**/
    public List<String> shortcutFieldOrder() {
        return Collections.singletonList("name");
    }
    /**内部类,用于封装application.yml中的配置**/
    public static class Config {
        @NotNull
        private String name;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }
} 
 
过滤器
测试AddRequestHeader

@GetMapping("findOrder")
    public ComResultEntity findOrders(@RequestParam(value = "id") String id,@RequestHeader("X-Request-Name") String name){
        System.out.println("******************age="+age);
        System.out.println("==================name="+name);
        return orderFeignService.findOrders(id);
    } 
发起请求
 ![]()
![]()
自定义过滤器工厂,继承AbstractNameValueGatewayFilterFactory即可

自定义全局过滤器,实现GlobalFilter即可

整合sentinel限流

添加依赖:
        <!--sentinel-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <!--sentinel适配 gateway -->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-spring-cloud-gateway-adapter</artifactId>
        </dependency> 
待续。。。










