这篇文章主要介绍了SpringCloud Gateway 利用 Mysql 实现动态路由的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 需求描述
标准网关动态路由功能是重要的一环,将路由、断言以及过滤器信息,持久化到 Mysql 中,通过配置后台页面实现路由、断言、以及过滤器等配置的增删改查。
Spring Cloud Gateway 路由及黑白名单实现背景 Spring Cloud 路由API
Spring Cloud Gateway 通过定义 RouteDefinitionRepository 来实现动态路由.
//获取路由缓存
public interface RouteDefinitionLocator {
Flux<RouteDefinition> getRouteDefinitions();
}
Spring Cloud 配置文件路由加载方式
public class PropertiesRouteDefinitionLocator implements RouteDefinitionLocator {
private final GatewayProperties properties;
public PropertiesRouteDefinitionLocator(GatewayProperties properties) {
this.properties = properties;
}
@Override
public Flux<RouteDefinition> getRouteDefinitions() {
return Flux.fromIterable(this.properties.getRoutes());
}
}
Spring Cloud 黑白名 FilterFactory
利用 Spring Cloud Gateway 声明的一个工厂接口 GatewayFilterFactory, 定义 黑白名单过滤器
BlacklistGatewayFilterFactory 类图
WhitelistGatewayFilterFactory 类图
动态路由设计 Spring Cloud Gateway 路由实体类
Spring Cloud Gateway 通过定义 RouteDefinition 类装载路由信息。
package org.springframework.cloud.gateway.route;
public class RouteDefinition {
//路由 ID
@NotEmpty
private String id = UUID.randomUUID().toString();
//断言数组
@NotEmpty
@Valid
private List<PredicateDefinition> predicates = new ArrayList<>();
//过滤器数组
@Valid
private List<FilterDefinition> filters = new ArrayList<>();
// 路由地址
@NotNull
private URI uri;
// 路由顺序
private int order = 0;
}
数据库设计
路由表
drop table if exists gateway_route_t;
create table if not exists gateway_route_t
(
ID int auto_increment primary key,
ROUTE_ID varchar(255) not null comment "路由ID",
ROUTE_ORDER int default 0 null comment "路由顺序",
URI varchar(255) not null comment "路由路径",
VALID int default 1 not null comment "是否有效:0-无效,1-有效",
CREATE_USER varchar(200) null comment "创建人",
CREATE_TIME datetime null comment "创建时间",
UPDATE_USER varchar(200) null comment "修改人",
UPDATE_TIME datetime null comment "修改时间",
constraint idx_ROUTE_ID_index unique (ROUTE_ID)
) comment "网关路由信息表" charset = utf8;
路由参数表
drop table if exists gateway_route_param_t;
create table if not exists gateway_route_param_t
(
ID int auto_increment primary key,
ROUTE_ID varchar(255) not null comment "路由ID",
PARAM_NAME varchar(255) not null comment "参数name",
PARAM_KEY varchar(255) not null comment "参数 key",
PARAM_VALUE varchar(255) not null comment "参数 value",
TYPE int not null comment "参数类型,1为 predicate,2为过 filter",
VALID int default 1 not null comment "是否有效:0-无效,1-有效",
CREATE_USER varchar(200) null comment "创建人",
CREATE_TIME datetime null comment "创建时间",
UPDATE_USER varchar(200) null comment "修改人",
UPDATE_TIME datetime null comment "修改时间"
) comment "网关路由参数表" charset = utf8;
create index idx_route_id on gateway_route_param_t (ROUTE_ID);