动态路由背景
无论你在使用Zuul还是Spring Cloud Gateway 的时候,官方文档提供的方案总是基于配置文件配置的方式
例如:
# zuul 的配置形式
routes:
pig-auth:
path: /auth
@Slf4j
@AllArgsConstructor
@Service("sysRouteConfService")
public class SysRouteConfServiceImpl extends ServiceImpl implements SysRouteConfService {
private final RedisTemplate redisTemplate;
private final ApplicationEventPublisher applicationEventPublisher;
@Override
public List routes() {
SysRouteConf condition = new SysRouteConf();
condition.setDelFlag(CommonConstant.STATUS_NORMAL);
return baseMapper.selectList(new EntityWrapper<>(condition));
}
@Override
public Mono editRoutes(JSonArray routes) {
// 清空Redis 缓存
Boolean result = redisTemplate.delete(CommonConstant.ROUTE_KEY);
log.info("清空网关路由 {} ", result);
// 遍历修改的routes,保存到Redis
List routeDefinitionVoList = new ArrayList<>();
routes.forEach(value -> {
log.info("更新路由 ->{}", value);
RouteDefinitionVo vo = new RouteDefinitionVo();
Map map = (Map) value;
Object id = map.get("routeId");
if (id != null) {
vo.setId(String.valueOf(id));
}
Object predicates = map.get("predicates");
if (predicates != null) {
JSonArray predicatesArray = (JSONArray) predicates;
List predicateDefinitionList =
predicatesArray.toList(PredicateDefinition.class);
vo.setPredicates(predicateDefinitionList);
}
Object filters = map.get("filters");
if (filters != null) {
JSonArray filtersArray = (JSONArray) filters;
List filterDefinitionList
= filtersArray.toList(FilterDefinition.class);
vo.setFilters(filterDefinitionList);
}
Object uri = map.get("uri");
if (uri != null) {
vo.setUri(URI.create(String.valueOf(uri)));
}
Object order = map.get("order");
if (order != null) {
vo.setOrder(Integer.parseInt(String.valueOf(order)));
}
redisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer<>(RouteDefinitionVo.class));
redisTemplate.opsForHash().put(CommonConstant.ROUTE_KEY, vo.getId(), vo);
routeDefinitionVoList.add(vo);
});
// 逻辑删除全部
SysRouteConf condition = new SysRouteConf();
condition.setDelFlag(CommonConstant.STATUS_NORMAL);
this.delete(new EntityWrapper<>(condition));
//插入生效路由
List routeConfList = routeDefinitionVoList.stream().map(vo -> {
SysRouteConf routeConf = new SysRouteConf();
routeConf.setRouteId(vo.getId());
routeConf.setFilters(JSONUtil.toJsonStr(vo.getFilters()));
routeConf.setPredicates(JSONUtil.toJsonStr(vo.getPredicates()));
routeConf.setOrder(vo.getOrder());
routeConf.setUri(vo.getUri().toString());
return routeConf;
}).collect(Collectors.toList());
this.insertBatch(routeConfList);
log.debug("更新网关路由结束 ");
this.applicationEventPublisher.publishEvent(new RefreshRoutesEvent(this));
return Mono.empty();
}
}
网关自定义RedisRouteDefinitionRepository
@Slf4j
@Component
@AllArgsConstructor
public class RedisRouteDefinitionWriter implements RouteDefinitionRepository {
private final RedisTemplate redisTemplate;
@Override
public Mono save(Mono route) {
return route.flatMap(r -> {
RouteDefinitionVo vo = new RouteDefinitionVo();
BeanUtils.copyProperties(r, vo);
log.info("保存路由信息{}", vo);
redisTemplate.opsForHash().put(CommonConstant.ROUTE_KEY, r.getId(), vo);
return Mono.empty();
});
}
@Override
public Mono delete(Mono routeId) {
routeId.subscribe(id -> {
log.info("删除路由信息{}", id);
redisTemplate.opsForHash().delete(CommonConstant.ROUTE_KEY, id);
});
return Mono.empty();
}
@Override
public Flux getRouteDefinitions() {
redisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer<>(RouteDefinitionVo.class));
List values = redisTemplate.opsForHash().values(CommonConstant.ROUTE_KEY);
List definitionList = new ArrayList<>();
values.forEach(vo -> {
RouteDefinition routeDefinition = new RouteDefinition();
BeanUtils.copyProperties(vo, routeDefinition);
definitionList.add(vo);
});
log.debug("redis 中路由定义条数: {}, {}", definitionList.size(), definitionList);
return Flux.fromIterable(definitionList);
}
}
3.库表定义
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。



