菜单
本页目录

路由是什么

即,告诉gateway,什么路径的请求,要转发给哪个微服务

路由规则配置

新建路由配置文件

spring:
  cloud:
    gateway:
      routes:
        - id: order-route
          uri: lb://service-order
          predicates:
            - Path=/api/order/**
        - id: product-route
          uri: lb://service-product
          predicates:
            - Path=/api/product/**

解释 id:路由id uri:转发微服务 predicatee:指定要转发的路径 /api/order/** 即会转发到service-order下的 /api/order/** http://localhost/api/order/readDb会转发到service-order下的/api/order/readDb

路由工作原理

路由生效优先级从上到下,也就是说,先配置的路由会覆盖后面的路由,可以通过order属性指定优先级,order越小,优先级越高

spring:
  cloud:
    gateway:
      routes:
        - id: order-route
          uri: lb://service-order
          predicates:
            - Path=/api/order/**
          order: 0
        - id: product-route
          uri: lb://service-product
          predicates:
            - Path=/api/product/**
          order: 1

断言

即判断请求是否符合规则,符合规则才会转发

断言长短写法

断言的短写法 Path即是一种断言机制 断言名=value

predicates:
 - Path=/api/order/**

断言的长写法 断言长写法有两个参数,name即断言名,args即断言参数

          predicates:
            - name: Path
              args:
                patterns: /api/order/**

所有的断言机制都由RoutePredicateFactory接口提供,其不同的实现即不同断言机制 RoutePredicateFactory之前的即断言机制 而arg参数则取决于断言实现中的config 查看官网查阅参数作用 示例

spring:
  cloud:
    gateway:
      routes:
        - id: order-route
          uri: lb://service-order
          predicates:
            - name: Path
              args:
                patterns: /api/order/**
          order: 1
        - id: product-route
          uri: lb://service-product
          predicates:
            - Path=/api/product/**
          order: 2
        - id: bing-route
          uri: https://www.bing.com/
          predicates:
            - name: Path
              args:
                patterns: /search
            - name: Query
              args:
                param: q
                regexp: haha
          order: 0

当一个断言指定了多个断言机制,需要同时满足才可路由’

自定义断言工厂

package com.atguigu.gateway.predicate;

import jakarta.validation.constraints.NotEmpty;
import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.cloud.gateway.handler.predicate.GatewayPredicate;
import org.springframework.cloud.gateway.handler.predicate.QueryRoutePredicateFactory;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.server.ServerWebExchange;

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;


@Component
public class VipRoutePredicateFactory extends AbstractRoutePredicateFactory<VipRoutePredicateFactory.Config> {


    public VipRoutePredicateFactory() {
        super(Config.class);
    }
// 断言方法
    @Override
    public Predicate<ServerWebExchange> apply(Config config) {
        return new GatewayPredicate() {
            @Override
            public boolean test(ServerWebExchange serverWebExchange) {
                // localhost/search?q=haha&user=leifengyang
                ServerHttpRequest request = serverWebExchange.getRequest();

                String first = request.getQueryParams().getFirst(config.param);

                return StringUtils.hasText(first) && first.equals(config.value);
            }
        };
    }
//短写法的参数顺序
    @Override
    public List<String> shortcutFieldOrder() {
        return Arrays.asList("param", "value");
    }

    /**
     * 可以配置的参数
     */
    @Validated
    public static class Config {

        @NotEmpty
        private String param;


        @NotEmpty
        private String value;

        public @NotEmpty String getParam() {
            return param;
        }

        public void setParam(@NotEmpty String param) {
            this.param = param;
        }

        public @NotEmpty String getValue() {
            return value;
        }

        public void setValue(@NotEmpty String value) {
            this.value = value;
        }
    }
}

spring:
  cloud:
    gateway:
      routes:
        - id: order-route
          uri: lb://service-order
          predicates:
            - name: Path
              args:
                patterns: /api/order/**
          order: 1
        - id: product-route
          uri: lb://service-product
          predicates:
            - Path=/api/product/**
          order: 2
        - id: bing-route
          uri: https://www.bing.com/
          predicates:
            - name: Path
              args:
                patterns: /search
            - name: Query
              args:
                param: q
                regexp: haha
            - name: Vip
              args:
                param: user
                value: chenxin
#           - Vip=user,chenxin
          order: 0