spring cloud gateway Route配置

本文详细介绍了Spring Cloud Gateway的各种路由配置,包括AfterRoute、BeforeRoute、BetweenRoute等时间条件路由,CookieRoute、HeaderRoute、HostRoute等基于请求属性的路由,以及MethodRoute、PathRoute、QueryRoute等基于请求方式和路径的路由。同时,还讲解了RemoteAddrRoute、XForwardedRemoteAddrRoute等基于客户端IP的路由和WeightRoute的动态权重路由。最后,展示了如何自定义路由断言工厂,包括必备条件和应用逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

gateway routes规则

1、After Route

所有匹配的请求必须在这个时间点之后

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - After=2022-05-23T19:52:33.736+08:00[Asia/Shanghai] #时间格式为ZonedDateTime.now()

2、Before Route

所有匹配的请求必须在这个时间点之前

spring:
  cloud:
    gateway:
      routes:
      - id: before_route
        uri: https://example.org
        predicates:
        - Before=2021-05-23T19:52:33.736+08:00[Asia/Shanghai]

3、Between Route

所有匹配的请求必须在这两个时间点之内

spring:
  cloud:
    gateway:
      routes:
      - id: between_route
        uri: https://example.org
        predicates:
        - Between=2022-05-23T19:52:33.736+08:00[Asia/Shanghai], 2023-05-23T19:52:33.736+08:00[Asia/Shanghai] #两个时间点之间不能用空格隔开

4、Cookie Route

接收Cookie参数,且值需要与正则表达是匹配

spring:
  cloud:
    gateway:
      routes:
      - id: cookie_route
        uri: https://example.org
        predicates:
        - Cookie=chocolate, ch.p

5、Header Route

在请求Header中,需要带有X-Request-Id的参数,且值需要和正则表达式匹配

spring:
  cloud:
    gateway:
      routes:
      - id: header_route
        uri: https://example.org
        predicates:
        - Header=X-Request-Id, \d+

6、Host Route

接收一个参数,主机名模式,判断请求的host是否满足匹配规则

spring:
  cloud:
    gateway:
      routes:
      - id: host_route
        uri: https://example.org
        predicates:
        - Host=**.somehost.org,**.anotherhost.org

7、Method Route

接收一个参数Method,表示请求的方式匹配参数

spring:
  cloud:
    gateway:
      routes:
      - id: method_route
        uri: https://example.org
        predicates:
        - Method=GET,POST

8、Path Route

接收一个路径集合,表示请求的路径需要匹配Path中的路径

spring:
  cloud:
    gateway:
      routes:
      - id: path_route
        uri: https://example.org
        predicates:
        - Path=/red/{segment},/blue/{segment}

9、Query Route

接收两个参数,请求param和正则表达式,判断请求参数是否具有给定名称且值与正则表达式

spring:
  cloud:
    gateway:
      routes:
      - id: query_route
        uri: https://example.org
        predicates:
        - Query=green

10、RemoteAddr Route

路由谓词工厂采用的RemoteAddr列表(最小大小为 1)sources,它们是 CIDR 表示法(IPv4 或 IPv6)字符串,例如192.168.0.1/16(其中192.168.0.1是 IP 地址和16子网掩码)。以下示例配置 RemoteAddr 路由谓词:

spring:
  cloud:
    gateway:
      routes:
      - id: remoteaddr_route
        uri: https://example.org
        predicates:
        - RemoteAddr=192.168.1.1/24

11、 Weight Route

接收一组【组名,权重】,然后对于同一个组内的路由按照权重转发

spring:
  cloud:
    gateway:
      routes:
      - id: weight_high
        uri: https://weighthigh.org
        predicates:
        - Weight=group1, 8
      - id: weight_low
        uri: https://weightlow.org
        predicates:
        - Weight=group1, 2

12、 XForwardedRemoteAddr Route

路由谓词工厂采用的XForwarded Remote Addr列表(最小大小为 1)sources,它们是 CIDR 表示法(IPv4 或 IPv6)字符串,例如192.168.0.1/16(其中192.168.0.1是 IP 地址和16子网掩码)。

此路由谓词允许根据X-Forwarded-ForHTTP 标头过滤请求。

这可以与反向代理一起使用,例如负载平衡器或 Web 应用程序防火墙,其中仅当请求来自这些反向代理使用的受信任的 IP 地址列表时才允许请求。

spring:
  cloud:
    gateway:
      routes:
      - id: xforwarded_remoteaddr_route
        uri: https://example.org
        predicates:
        - XForwardedRemoteAddr=192.168.1.1/24

11、自定义路由断言工厂

1、必须是Spring的Bean

2、类必须以RoutePredicateFactory结尾(约定大于配置)

3、必须继承AbstractRoutePredicateFactory

4、必须声明静态内部类 声明属性来接收 配置文件中对应的断言的信息

5、需要结合shortcutFieldOrder进行绑定

6、通过apply进行逻辑判断 true就是匹配成功 false匹配失败

package com.wwh.blog.config;

import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.cloud.gateway.handler.predicate.GatewayPredicate;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.server.ServerWebExchange;

import javax.validation.constraints.NotEmpty;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.function.Predicate;

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

    public TokenRoutePredicateFactory() {
        super(Config.class);
    }

    @Override
    public Predicate<ServerWebExchange> apply(Config config) {
        return new GatewayPredicate() {
            @Override
            public boolean test(ServerWebExchange exchange) {
                String token = config.getToken();
                if (Objects.isNull(token) && !token.equals("auth")) {
                    return false;
                }
                // there is a value and since regexp is empty, we only check existence.
                return true;
            }

            @Override
            public Object getConfig() {
                return config;
            }

            @Override
            public String toString() {
                return String.format("Token: %s ", config.token);
            }

        };
    }

    @Override
    public List<String> shortcutFieldOrder() {
        return Collections.singletonList("token");
    }

    @Validated
    public static class Config {
        @NotEmpty
        private String token;

        public String getToken() {
            return token;
        }

        public void setToken(String token) {
            this.token = token;
        }

        public Config(String token) {
            this.token = token;
        }
    }

}

### Spring Cloud Gateway 配置 Nginx 的最佳实践 在构建微服务架构时,Spring Cloud Gateway 和 Nginx 是两种常用的工具。Spring Cloud Gateway 作为 API 网关,负责路由、过滤和安全控制;而 Nginx 则主要用作反向代理和负载均衡器。以下是配置 Nginx 和 Spring Cloud Gateway 的最佳实践。 #### 1. Nginx 作为反向代理的配置 Nginx 可以将外部请求转发到内部的 Spring Cloud Gateway 实例。以下是一个典型的 Nginx 配置示例: ```nginx server { listen 80; server_name your-domain.com; location / { proxy_pass http://localhost:8080; # Spring Cloud Gateway 的地址 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } # SSL 配置 listen 443 ssl; ssl_certificate /etc/nginx/ssl/your-domain.crt; ssl_certificate_key /etc/nginx/ssl/your-domain.key; } ``` 此配置中,Nginx 监听 80 和 443 端口,并将所有请求转发到本地运行的 Spring Cloud Gateway 实例[^2]。 #### 2. Spring Cloud Gateway 的基本配置 Spring Cloud Gateway配置通常通过 `application.yml` 文件完成。以下是一个简单的配置示例: ```yaml spring: cloud: gateway: routes: - id: service_a_route uri: http://service-a:8081 predicates: - Path=/service-a/** filters: - StripPrefix=1 - id: service_b_route uri: http://service-b:8082 predicates: - Path=/service-b/** filters: - StripPrefix=1 ``` 此配置定义了两个路由规则,分别将 `/service-a/**` 和 `/service-b/**` 的请求转发到对应的服务[^1]。 #### 3. 使用 Docker 部署 Spring Cloud Gateway 为了简化部署过程,可以使用 Docker 容器化 Spring Cloud Gateway。以下是一个 Docker 命令示例: ```bash docker run --name gateway \ --rm \ -p 8080:8080 \ -e "SPRING_PROFILES_ACTIVE=prod" \ springcloud/spring-cloud-gateway:latest ``` 此命令启动了一个 Spring Cloud Gateway 容器,并将其绑定到主机的 8080 端口[^3]。 #### 4. 配合 Nginx 和 Spring Cloud Gateway 的最佳实践 - **性能优化**:确保 Nginx 的 `worker_processes` 和 `worker_connections` 参数根据服务器硬件资源进行调整。 - **SSL/TLS 支持**:始终为外部流量启用 HTTPS,以保护用户数据的安全。 - **日志记录**:配置 Nginx 和 Spring Cloud Gateway 的日志记录功能,以便于问题排查。 - **健康检查**:通过 Nginx 或其他工具定期检查 Spring Cloud Gateway 的健康状态。 - **负载均衡**:如果多个 Spring Cloud Gateway 实例运行在同一环境中,可以使用 Nginx 的 `upstream` 模块实现负载均衡。 #### 5. 示例教程总结 通过上述配置,可以实现一个高效的微服务网关系统。Nginx 作为反向代理和负载均衡器,Spring Cloud Gateway 负责路由和过滤逻辑。两者结合可以显著提高系统的可扩展性和安全性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值