1、概述
Spring Cloud Gateway 默认的RouteDefinitionWriter实现类是org.springframework.cloud.gateway.route.InMemoryRouteDefinitionRepository,Route信息保存在当前实例的内存中,这在集群环境中会存在同步问题。本文就基于MongoD自定义一个RouteDefinitionWriter。
基本要点:
1、路由规则存储在MongoDB中(也可以是别的存储介质)
2、网关启动读取已配置好的路由规则
3、首次读取从MongoDB中加载,同时存在缓存中,以后读取直接从缓存读取
4、通过api动态添加路由规则,同时添加到缓存和MongoDB中
2、MongoRouteDefinition
import lombok.Data;
import org.springframework.cloud.gateway.filter.FilterDefinition;
import org.springframework.cloud.gateway.handler.predicate.PredicateDefinition;
import org.springframework.data.mongodb.core.mapping.Field;
import java.util.ArrayList;
import java.util.List;
/**
* 存储在mongodb中的自定义路由信息
*
* @author lkf
* @date 2018-11-29 10-51
*/
@Data
public class MongoRouteDefinition {
/**
* 路由id
*/
@Field("route_id")
private String routeId;
/**
* 路由谓词
*/
private List<PredicateDefinition> predicates = new ArrayList<>();
/**
* 过滤器
*/
private List<FilterDefinition> filters = new ArrayList<>();
/**
* 跳转地址uri
*/
private String uri;
/**
* 路由顺序
*/
private int order;
}
3、自定义RouteDefinitionRepository
package com.lkf.gateway.repository;
import org.springframework.cloud.gateway.route.RouteDefinition;
import org.springframework.cloud.gateway.route.RouteDefinitionRepository;
import org.springframework.cloud.gateway.support.NotFoundException;
import org.springframework.data.mongodb.core.MongoTemplate;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.