mirror of
https://gitee.com/dromara/RuoYi-Vue-Plus.git
synced 2026-09-19 17:58:17 +08:00
路由启动初始化、Redisson路由序列化问题处理
This commit is contained in:
parent
176b0f4722
commit
55ccb406e7
@ -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();
|
||||
|
||||
@ -68,4 +68,9 @@ public interface IIscAppServiceService extends IServicePlus<IscAppService, IscAp
|
||||
* @return 应用服务列表
|
||||
*/
|
||||
List<IscAppService> getAppServiceListByIds(Collection<Long> ids);
|
||||
|
||||
/**
|
||||
* 刷新路由信息
|
||||
*/
|
||||
void refreshRoutes();
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加 服务申请记录
|
||||
*
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user