Spring GateWay自定义断言工厂

概要

我们在线上系统部署了,灰度环境和生产环境时,可以通过自定义断言工厂去将请求需要路由到灰度环境的用户调用灰度的的服务集群,将正常的用户调用正常集群。

这样,我们可以在上线了灰度的微服务集群时,只需要将数据库当中需要路由到灰度环境的用户的特殊状态位gray设置为true即可,这样我们就可以在网关层对不同的用户分发到不同的集群当中。

整体架构流程

  • 自定义一个断言工厂实现类, 注意:对于断言工厂的命名,spring有约定的一套配置规则,就是xxxRoutePredicateFactory ,我们需要遵循这个规范 ,现在我们命名一个EnvRoutePredicateFactory

/**
 * 是否是灰度用户的断言
 */
@Component
public class EnvRoutePredicateFactory extends AbstractRoutePredicateFactory<EnvRoutePredicateFactory.Config> {

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

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

    @Override
    public Predicate<ServerWebExchange> apply(Config config) {
        return new GatewayPredicate() {
            @Override
            public boolean test(ServerWebExchange serverWebExchange) {
                //断言用户的角色是什么环境
                //这个数据理论上是从db查出来的,我这边做演示直接通过接口
                //请求参数传递过来
                return config.getEnv().equals(serverWebExchange.getRequest().getQueryParams().get("env").get(0));
            }

        };
    }

    @Validated
    public static class Config {
        private String env = null;

        public Config() {
        }

        public String getEnv() {
            return env;
        }

        public void setEnv(String env) {
            this.env = env;
        }
    }
}

  • 配置自定义断言规则,下面我启动的两个服务orderService,grayOrderService可以处理的请求路径都是/order-service/**,但是区别是一个是访问deploy环境的服务,一个访问的是gray环境的服务。
spring:
  application:
    name: gateWay
  cloud:
    nacos:
      server-addr: 192.168.0.102:8848
    gateway:
      enabled: true
      routes:
        - id: order_route
          uri: lb://orderService
          predicates:
            - Env=deploy
            - Path=/order-service/**
          filters:
            - StripPrefix=1
        - id: gray_order_route
          uri: lb://grayOrderService
          predicates:
            - Env=gray
            - Path=/order-service/**
          filters:
            - StripPrefix=1

server:
  port: 8080

最终的处理效果

当我们的用户为生产的用户时
在这里插入图片描述
当我们用户为灰度的用户时
在这里插入图片描述

小结

NOTE:大家在使用时,因为我使用的loadblance进行路由转发的,所有需要将服务都注册到注册中心当中。
通过自定义断言工厂,我们可以进行不限于权限隔离,角色隔离等一系列定制的规则。在业务上的灵活性和扩展性得到了极大的提升

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值