From 55ccb406e769dbedd3a4d035f145f560d10d1f1e Mon Sep 17 00:00:00 2001 From: Wenchao Gong Date: Wed, 29 Sep 2021 21:23:09 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B7=AF=E7=94=B1=E5=90=AF=E5=8A=A8=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96=E3=80=81Redisson=E8=B7=AF=E7=94=B1=E5=BA=8F?= =?UTF-8?q?=E5=88=97=E5=8C=96=E9=97=AE=E9=A2=98=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RedisRouteDefinitionRepository.java | 9 ++-- .../isc/service/IIscAppServiceService.java | 5 +++ .../impl/IscAppServiceServiceImpl.java | 43 +++++++++++++++++++ .../java/com/ruoyi/isc/utils/RouteUtils.java | 11 +++-- 4 files changed, 61 insertions(+), 7 deletions(-) diff --git a/ruoyi-extend/ruoyi-isc-gateway/src/main/java/com/ruoyi/gateway/config/provider/RedisRouteDefinitionRepository.java b/ruoyi-extend/ruoyi-isc-gateway/src/main/java/com/ruoyi/gateway/config/provider/RedisRouteDefinitionRepository.java index b7b713b8c..17d4c1dcc 100644 --- a/ruoyi-extend/ruoyi-isc-gateway/src/main/java/com/ruoyi/gateway/config/provider/RedisRouteDefinitionRepository.java +++ b/ruoyi-extend/ruoyi-isc-gateway/src/main/java/com/ruoyi/gateway/config/provider/RedisRouteDefinitionRepository.java @@ -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 getRouteDefinitions() { - RMap map = redissonClient.getMap(KEY_ROUTES); + RMap 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 save(Mono route) { return route.flatMap(definition -> { - RMap map = redissonClient.getMap(KEY_ROUTES); + RMap 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 delete(Mono routeId) { return routeId.flatMap(id -> { - RMap map = redissonClient.getMap(KEY_ROUTES); + RMap map = redissonClient.getMap(KEY_ROUTES, ROUTE_CODES_INSTANCE); map.remove(id); log.debug("Remove route from redis id:[{}]!", id); return Mono.empty(); diff --git a/ruoyi-isc/src/main/java/com/ruoyi/isc/service/IIscAppServiceService.java b/ruoyi-isc/src/main/java/com/ruoyi/isc/service/IIscAppServiceService.java index 9fce813a9..d19089f90 100644 --- a/ruoyi-isc/src/main/java/com/ruoyi/isc/service/IIscAppServiceService.java +++ b/ruoyi-isc/src/main/java/com/ruoyi/isc/service/IIscAppServiceService.java @@ -68,4 +68,9 @@ public interface IIscAppServiceService extends IServicePlus getAppServiceListByIds(Collection ids); + + /** + * 刷新路由信息 + */ + void refreshRoutes(); } diff --git a/ruoyi-isc/src/main/java/com/ruoyi/isc/service/impl/IscAppServiceServiceImpl.java b/ruoyi-isc/src/main/java/com/ruoyi/isc/service/impl/IscAppServiceServiceImpl.java index 747f99994..91e20e376 100644 --- a/ruoyi-isc/src/main/java/com/ruoyi/isc/service/impl/IscAppServiceServiceImpl.java +++ b/ruoyi-isc/src/main/java/com/ruoyi/isc/service/impl/IscAppServiceServiceImpl.java @@ -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 implements IIscAppServiceService { @@ -45,6 +54,11 @@ public class IscAppServiceServiceImpl extends ServicePlusImpl list = list(Wrappers.lambdaQuery() + .eq(IscAppService::getEnabled, UserConstants.NORMAL) + .eq(IscAppService::getStatus, IscConstants.AUDIT_PASS) + .gt(IscAppService::getEndTime, DateUtils.getNowDate())); + if(CollectionUtil.isEmpty(list)) { + return; + } + Set serviceIds = list.stream().map(IscAppService::getServiceId).collect(Collectors.toSet()); + Map serviceMap = serviceService.list(Wrappers.lambdaQuery() + .select(IscService::getServiceId, IscService::getServiceAddr) + .in(IscService::getServiceId, serviceIds)).stream() + .collect(Collectors.toMap(IscService::getServiceId, Function.identity())); + List 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); + } + /** * 添加 服务申请记录 * diff --git a/ruoyi-isc/src/main/java/com/ruoyi/isc/utils/RouteUtils.java b/ruoyi-isc/src/main/java/com/ruoyi/isc/utils/RouteUtils.java index 737256c90..69eb59eec 100644 --- a/ruoyi-isc/src/main/java/com/ruoyi/isc/utils/RouteUtils.java +++ b/ruoyi-isc/src/main/java/com/ruoyi/isc/utils/RouteUtils.java @@ -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 routeMap = routes.stream().collect(Collectors.toMap(IscRouteDefinition::getId, Function.identity(), (o1, o2) -> o2)); - final RMap map = client.getMap(IscConstants.KEY_ROUTES); + final RMap 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 map = client.getMap(IscConstants.KEY_ROUTES); + final RMap 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 map = client.getMap(IscConstants.KEY_ROUTES); + final RMap map = client.getMap(IscConstants.KEY_ROUTES, ROUTE_CODES_INSTANCE); map.remove(routeId); return true; }