文章目录
- 概要
- 整体架构流程
- 最终的处理效果
- 小结
概要
我们在线上系统部署了,灰度环境和生产环境时,可以通过自定义断言工厂去将请求需要路由到灰度环境的用户调用灰度的的服务集群,将正常的用户调用正常集群。
这样,我们可以在上线了灰度的微服务集群时,只需要将数据库当中需要路由到灰度环境的用户的特殊状态位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进行路由转发的,所有需要将服务都注册到注册中心当中。
通过自定义断言工厂,我们可以进行不限于权限隔离,角色隔离等一系列定制的规则。在业务上的灵活性和扩展性得到了极大的提升