路由启动初始化、Redisson路由序列化问题处理

This commit is contained in:
Wenchao Gong 2021-09-29 21:23:09 +08:00
parent 176b0f4722
commit 55ccb406e7
4 changed files with 61 additions and 7 deletions

View File

@ -3,6 +3,8 @@ package com.ruoyi.gateway.config.provider;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RMap;
import org.redisson.api.RedissonClient;
import org.redisson.client.codec.Codec;
import org.redisson.codec.TypedJsonJacksonCodec;
import org.springframework.cloud.gateway.route.RouteDefinition;
import org.springframework.cloud.gateway.route.RouteDefinitionRepository;
import reactor.core.publisher.Flux;
@ -17,6 +19,7 @@ import reactor.core.publisher.Mono;
@Slf4j
public class RedisRouteDefinitionRepository implements RouteDefinitionRepository
{
public static final Codec ROUTE_CODES_INSTANCE = new TypedJsonJacksonCodec(String.class, RouteDefinition.class);
public static final String KEY_ROUTES = "ROUTES::";
private final RedissonClient redissonClient;
@ -28,7 +31,7 @@ public class RedisRouteDefinitionRepository implements RouteDefinitionRepository
@Override
public Flux<RouteDefinition> getRouteDefinitions()
{
RMap<String, RouteDefinition> map = redissonClient.getMap(KEY_ROUTES);
RMap<String, RouteDefinition> map = redissonClient.getMap(KEY_ROUTES, ROUTE_CODES_INSTANCE);
log.debug("Routes from redis size:[{}]!", map.size());
return Flux.fromIterable(map.values());
}
@ -37,7 +40,7 @@ public class RedisRouteDefinitionRepository implements RouteDefinitionRepository
public Mono<Void> save(Mono<RouteDefinition> route)
{
return route.flatMap(definition -> {
RMap<String, RouteDefinition> map = redissonClient.getMap(KEY_ROUTES);
RMap<String, RouteDefinition> map = redissonClient.getMap(KEY_ROUTES, ROUTE_CODES_INSTANCE);
map.put(definition.getId(), definition);
log.debug("Saving route to redis id:[{}]!", definition.getId());
return Mono.empty();
@ -48,7 +51,7 @@ public class RedisRouteDefinitionRepository implements RouteDefinitionRepository
public Mono<Void> delete(Mono<String> routeId)
{
return routeId.flatMap(id -> {
RMap<String, RouteDefinition> map = redissonClient.getMap(KEY_ROUTES);
RMap<String, RouteDefinition> map = redissonClient.getMap(KEY_ROUTES, ROUTE_CODES_INSTANCE);
map.remove(id);
log.debug("Remove route from redis id:[{}]!", id);
return Mono.empty();

View File

@ -68,4 +68,9 @@ public interface IIscAppServiceService extends IServicePlus<IscAppService, IscAp
* @return 应用服务列表
*/
List<IscAppService> getAppServiceListByIds(Collection<Long> ids);
/**
* 刷新路由信息
*/
void refreshRoutes();
}

View File

@ -8,15 +8,18 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import com.ruoyi.common.constant.IscConstants;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl;
import com.ruoyi.common.core.page.PagePlus;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.PageUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.isc.domain.IscAppService;
import com.ruoyi.isc.domain.IscAppServiceApply;
import com.ruoyi.isc.domain.IscService;
import com.ruoyi.isc.domain.bo.IscAppServiceApplyBo;
import com.ruoyi.isc.domain.bo.IscAppServiceBo;
import com.ruoyi.isc.domain.vo.IscAppServiceVo;
@ -24,10 +27,15 @@ import com.ruoyi.isc.mapper.IscAppServiceMapper;
import com.ruoyi.isc.service.IIscAppServiceApplyService;
import com.ruoyi.isc.service.IIscAppServiceService;
import com.ruoyi.isc.service.IIscServiceService;
import com.ruoyi.isc.utils.RouteUtils;
import com.ruoyi.isc.utils.beans.IscRouteDefinition;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
@ -36,6 +44,7 @@ import java.util.stream.Collectors;
* @author Wenchao Gong
* @date 2021-09-08
*/
@Slf4j
@Service
public class IscAppServiceServiceImpl extends ServicePlusImpl<IscAppServiceMapper, IscAppService, IscAppServiceVo> implements IIscAppServiceService
{
@ -45,6 +54,11 @@ public class IscAppServiceServiceImpl extends ServicePlusImpl<IscAppServiceMappe
@Resource
private IIscAppServiceApplyService applyService;
@PostConstruct
public void init() {
refreshRoutes();
}
@Override
public IscAppServiceVo queryById(Long appServiceId)
{
@ -182,6 +196,35 @@ public class IscAppServiceServiceImpl extends ServicePlusImpl<IscAppServiceMappe
.in(IscAppService::getAppServiceId, ids));
}
@Override
public void refreshRoutes()
{
List<IscAppService> list = list(Wrappers.<IscAppService>lambdaQuery()
.eq(IscAppService::getEnabled, UserConstants.NORMAL)
.eq(IscAppService::getStatus, IscConstants.AUDIT_PASS)
.gt(IscAppService::getEndTime, DateUtils.getNowDate()));
if(CollectionUtil.isEmpty(list)) {
return;
}
Set<Long> serviceIds = list.stream().map(IscAppService::getServiceId).collect(Collectors.toSet());
Map<Long, IscService> serviceMap = serviceService.list(Wrappers.<IscService>lambdaQuery()
.select(IscService::getServiceId, IscService::getServiceAddr)
.in(IscService::getServiceId, serviceIds)).stream()
.collect(Collectors.toMap(IscService::getServiceId, Function.identity()));
List<IscRouteDefinition> routes = new ArrayList<>();
for (IscAppService appService : list)
{
IscService service = serviceMap.get(appService.getServiceId());
if(Objects.isNull(service)) {
log.error("路由初始化失败: 服务[{}]信息不存在!", appService.getServiceId());
continue;
}
routes.add(RouteUtils.generateRoute(appService, service.getServiceAddr()));
}
RouteUtils.refreshRoute(routes);
}
/**
* 添加 服务申请记录
*

View File

@ -11,7 +11,8 @@ import com.ruoyi.isc.utils.beans.IscPredicateDefinition;
import com.ruoyi.isc.utils.beans.IscRouteDefinition;
import org.redisson.api.RMap;
import org.redisson.api.RedissonClient;
import org.redisson.codec.JsonJacksonCodec;
import org.redisson.client.codec.Codec;
import org.redisson.codec.TypedJsonJacksonCodec;
import java.net.URI;
import java.net.URISyntaxException;
@ -24,6 +25,8 @@ import java.util.stream.Collectors;
* @date 2021/9/10 14:46
*/
public class RouteUtils {
public static final Codec ROUTE_CODES_INSTANCE = new TypedJsonJacksonCodec(String.class, IscRouteDefinition.class);
/**
* Gateway 虚拟路径前缀
*/
@ -81,7 +84,7 @@ public class RouteUtils {
{
Map<String, IscRouteDefinition> routeMap = routes.stream().collect(Collectors.toMap(IscRouteDefinition::getId,
Function.identity(), (o1, o2) -> o2));
final RMap<String, IscRouteDefinition> map = client.getMap(IscConstants.KEY_ROUTES);
final RMap<String, IscRouteDefinition> map = client.getMap(IscConstants.KEY_ROUTES, ROUTE_CODES_INSTANCE);
map.clear();
map.putAll(routeMap);
return true;
@ -95,7 +98,7 @@ public class RouteUtils {
*/
public static boolean saveRoute(IscRouteDefinition route)
{
final RMap<String, IscRouteDefinition> map = client.getMap(IscConstants.KEY_ROUTES);
final RMap<String, IscRouteDefinition> map = client.getMap(IscConstants.KEY_ROUTES, ROUTE_CODES_INSTANCE);
map.put(route.getId(), route);
return true;
}
@ -108,7 +111,7 @@ public class RouteUtils {
*/
public static boolean deleteRoute(String routeId)
{
final RMap<String, IscRouteDefinition> map = client.getMap(IscConstants.KEY_ROUTES);
final RMap<String, IscRouteDefinition> map = client.getMap(IscConstants.KEY_ROUTES, ROUTE_CODES_INSTANCE);
map.remove(routeId);
return true;
}