mirror of
https://gitee.com/dromara/RuoYi-Vue-Plus.git
synced 2026-09-20 02:08:15 +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 lombok.extern.slf4j.Slf4j;
|
||||||
import org.redisson.api.RMap;
|
import org.redisson.api.RMap;
|
||||||
import org.redisson.api.RedissonClient;
|
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.RouteDefinition;
|
||||||
import org.springframework.cloud.gateway.route.RouteDefinitionRepository;
|
import org.springframework.cloud.gateway.route.RouteDefinitionRepository;
|
||||||
import reactor.core.publisher.Flux;
|
import reactor.core.publisher.Flux;
|
||||||
@ -17,6 +19,7 @@ import reactor.core.publisher.Mono;
|
|||||||
@Slf4j
|
@Slf4j
|
||||||
public class RedisRouteDefinitionRepository implements RouteDefinitionRepository
|
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::";
|
public static final String KEY_ROUTES = "ROUTES::";
|
||||||
private final RedissonClient redissonClient;
|
private final RedissonClient redissonClient;
|
||||||
|
|
||||||
@ -28,7 +31,7 @@ public class RedisRouteDefinitionRepository implements RouteDefinitionRepository
|
|||||||
@Override
|
@Override
|
||||||
public Flux<RouteDefinition> getRouteDefinitions()
|
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());
|
log.debug("Routes from redis size:[{}]!", map.size());
|
||||||
return Flux.fromIterable(map.values());
|
return Flux.fromIterable(map.values());
|
||||||
}
|
}
|
||||||
@ -37,7 +40,7 @@ public class RedisRouteDefinitionRepository implements RouteDefinitionRepository
|
|||||||
public Mono<Void> save(Mono<RouteDefinition> route)
|
public Mono<Void> save(Mono<RouteDefinition> route)
|
||||||
{
|
{
|
||||||
return route.flatMap(definition -> {
|
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);
|
map.put(definition.getId(), definition);
|
||||||
log.debug("Saving route to redis id:[{}]!", definition.getId());
|
log.debug("Saving route to redis id:[{}]!", definition.getId());
|
||||||
return Mono.empty();
|
return Mono.empty();
|
||||||
@ -48,7 +51,7 @@ public class RedisRouteDefinitionRepository implements RouteDefinitionRepository
|
|||||||
public Mono<Void> delete(Mono<String> routeId)
|
public Mono<Void> delete(Mono<String> routeId)
|
||||||
{
|
{
|
||||||
return routeId.flatMap(id -> {
|
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);
|
map.remove(id);
|
||||||
log.debug("Remove route from redis id:[{}]!", id);
|
log.debug("Remove route from redis id:[{}]!", id);
|
||||||
return Mono.empty();
|
return Mono.empty();
|
||||||
|
|||||||
@ -68,4 +68,9 @@ public interface IIscAppServiceService extends IServicePlus<IscAppService, IscAp
|
|||||||
* @return 应用服务列表
|
* @return 应用服务列表
|
||||||
*/
|
*/
|
||||||
List<IscAppService> getAppServiceListByIds(Collection<Long> ids);
|
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.core.toolkit.Wrappers;
|
||||||
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
|
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
|
||||||
import com.ruoyi.common.constant.IscConstants;
|
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.mybatisplus.core.ServicePlusImpl;
|
||||||
import com.ruoyi.common.core.page.PagePlus;
|
import com.ruoyi.common.core.page.PagePlus;
|
||||||
import com.ruoyi.common.core.page.TableDataInfo;
|
import com.ruoyi.common.core.page.TableDataInfo;
|
||||||
import com.ruoyi.common.exception.ServiceException;
|
import com.ruoyi.common.exception.ServiceException;
|
||||||
|
import com.ruoyi.common.utils.DateUtils;
|
||||||
import com.ruoyi.common.utils.PageUtils;
|
import com.ruoyi.common.utils.PageUtils;
|
||||||
import com.ruoyi.common.utils.SecurityUtils;
|
import com.ruoyi.common.utils.SecurityUtils;
|
||||||
import com.ruoyi.common.utils.StringUtils;
|
import com.ruoyi.common.utils.StringUtils;
|
||||||
import com.ruoyi.isc.domain.IscAppService;
|
import com.ruoyi.isc.domain.IscAppService;
|
||||||
import com.ruoyi.isc.domain.IscAppServiceApply;
|
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.IscAppServiceApplyBo;
|
||||||
import com.ruoyi.isc.domain.bo.IscAppServiceBo;
|
import com.ruoyi.isc.domain.bo.IscAppServiceBo;
|
||||||
import com.ruoyi.isc.domain.vo.IscAppServiceVo;
|
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.IIscAppServiceApplyService;
|
||||||
import com.ruoyi.isc.service.IIscAppServiceService;
|
import com.ruoyi.isc.service.IIscAppServiceService;
|
||||||
import com.ruoyi.isc.service.IIscServiceService;
|
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 org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import javax.annotation.PostConstruct;
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.function.Function;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -36,6 +44,7 @@ import java.util.stream.Collectors;
|
|||||||
* @author Wenchao Gong
|
* @author Wenchao Gong
|
||||||
* @date 2021-09-08
|
* @date 2021-09-08
|
||||||
*/
|
*/
|
||||||
|
@Slf4j
|
||||||
@Service
|
@Service
|
||||||
public class IscAppServiceServiceImpl extends ServicePlusImpl<IscAppServiceMapper, IscAppService, IscAppServiceVo> implements IIscAppServiceService
|
public class IscAppServiceServiceImpl extends ServicePlusImpl<IscAppServiceMapper, IscAppService, IscAppServiceVo> implements IIscAppServiceService
|
||||||
{
|
{
|
||||||
@ -45,6 +54,11 @@ public class IscAppServiceServiceImpl extends ServicePlusImpl<IscAppServiceMappe
|
|||||||
@Resource
|
@Resource
|
||||||
private IIscAppServiceApplyService applyService;
|
private IIscAppServiceApplyService applyService;
|
||||||
|
|
||||||
|
@PostConstruct
|
||||||
|
public void init() {
|
||||||
|
refreshRoutes();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IscAppServiceVo queryById(Long appServiceId)
|
public IscAppServiceVo queryById(Long appServiceId)
|
||||||
{
|
{
|
||||||
@ -182,6 +196,35 @@ public class IscAppServiceServiceImpl extends ServicePlusImpl<IscAppServiceMappe
|
|||||||
.in(IscAppService::getAppServiceId, ids));
|
.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 com.ruoyi.isc.utils.beans.IscRouteDefinition;
|
||||||
import org.redisson.api.RMap;
|
import org.redisson.api.RMap;
|
||||||
import org.redisson.api.RedissonClient;
|
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.URI;
|
||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
@ -24,6 +25,8 @@ import java.util.stream.Collectors;
|
|||||||
* @date 2021/9/10 14:46
|
* @date 2021/9/10 14:46
|
||||||
*/
|
*/
|
||||||
public class RouteUtils {
|
public class RouteUtils {
|
||||||
|
|
||||||
|
public static final Codec ROUTE_CODES_INSTANCE = new TypedJsonJacksonCodec(String.class, IscRouteDefinition.class);
|
||||||
/**
|
/**
|
||||||
* Gateway 虚拟路径前缀
|
* Gateway 虚拟路径前缀
|
||||||
*/
|
*/
|
||||||
@ -81,7 +84,7 @@ public class RouteUtils {
|
|||||||
{
|
{
|
||||||
Map<String, IscRouteDefinition> routeMap = routes.stream().collect(Collectors.toMap(IscRouteDefinition::getId,
|
Map<String, IscRouteDefinition> routeMap = routes.stream().collect(Collectors.toMap(IscRouteDefinition::getId,
|
||||||
Function.identity(), (o1, o2) -> o2));
|
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.clear();
|
||||||
map.putAll(routeMap);
|
map.putAll(routeMap);
|
||||||
return true;
|
return true;
|
||||||
@ -95,7 +98,7 @@ public class RouteUtils {
|
|||||||
*/
|
*/
|
||||||
public static boolean saveRoute(IscRouteDefinition route)
|
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);
|
map.put(route.getId(), route);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -108,7 +111,7 @@ public class RouteUtils {
|
|||||||
*/
|
*/
|
||||||
public static boolean deleteRoute(String routeId)
|
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);
|
map.remove(routeId);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user