From 61f755d3ee8b210c73553c36828df6080c91613e Mon Sep 17 00:00:00 2001 From: lilong Date: Thu, 15 Aug 2024 16:01:38 +0800 Subject: [PATCH] =?UTF-8?q?feat:(REQ-2720)=20=E5=A2=9E=E5=8A=A0=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E8=8F=9C=E5=8D=95=E6=97=B6=E5=8F=91=E9=80=81=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E6=9B=B4=E6=96=B0mq=E5=92=8C=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E6=9D=83=E9=99=90mq=EF=BC=8C=E8=A7=A6=E5=8F=91=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/controller/PrivateController.java | 2 +- .../event/inner/CacheSaasFeatureHandler.java | 28 ++----------- .../CacheSaasFeatureResourceHandler.java | 38 +++-------------- .../outer/CacheSaasFeatureOldHandler.java | 41 +++---------------- .../SaasFeatureResourceUpsertPayload.java | 3 +- .../tyr/server/job/CacheSaasFeatureJob.java | 32 +++++++++++---- .../impl/FeatureResourceSyncServiceImpl.java | 40 ++++++++++++++++++ .../server/service/impl/RoleServiceImpl.java | 2 +- .../impl/SaasFeatureResourceServiceImpl.java | 4 +- 9 files changed, 86 insertions(+), 104 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/PrivateController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/PrivateController.java index 0a89d1ca..82f6daef 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/PrivateController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/PrivateController.java @@ -681,7 +681,7 @@ public class PrivateController { @PostMapping("/api/private/saasFeature/store") public Object storeSaasFeature(@RequestBody StoreFeatureParam request) throws Exception { - cacheSaasFeatureJob.execute(request.getTerminal()); + cacheSaasFeatureJob.execute(JSON.toJSONString(request)); return "ok"; } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/event/inner/CacheSaasFeatureHandler.java b/tyr-server/src/main/java/cn/axzo/tyr/server/event/inner/CacheSaasFeatureHandler.java index 888b5893..953399ac 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/event/inner/CacheSaasFeatureHandler.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/event/inner/CacheSaasFeatureHandler.java @@ -5,10 +5,12 @@ import cn.axzo.framework.rocketmq.EventConsumer; import cn.axzo.framework.rocketmq.EventHandler; import cn.axzo.tyr.client.model.enums.DelegatedType; import cn.axzo.tyr.server.event.payload.SaasFeatureUpsertPayload; +import cn.axzo.tyr.server.job.CacheSaasFeatureJob; import cn.axzo.tyr.server.repository.dao.SaasFeatureDao; import cn.axzo.tyr.server.repository.entity.SaasFeature; import cn.axzo.tyr.server.service.SaasFeatureResourceService; import com.google.common.collect.Lists; +import com.google.common.collect.Sets; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.InitializingBean; @@ -28,9 +30,7 @@ public class CacheSaasFeatureHandler implements EventHandler, InitializingBean { @Autowired private EventConsumer eventConsumer; @Autowired - private SaasFeatureDao saasFeatureDao; - @Autowired - private SaasFeatureResourceService saasFeatureResourceService; + private CacheSaasFeatureJob cacheSaasFeatureJob; @Override public void onEvent(Event event, EventConsumer.Context context) { @@ -41,27 +41,7 @@ public class CacheSaasFeatureHandler implements EventHandler, InitializingBean { return; } - List saasFeatures = saasFeatureDao.lambdaQuery() - .eq(SaasFeature::getTerminal, payload.getTerminal()) - .list() - .stream() - .map(e -> SaasFeatureResourceService.SaasFeatureResourceCache.builder() - .featureId(e.getId()) - .notAuth(DelegatedType.notAuth(e.getDelegatedType())) - .parentIds(e.splitPath()) - .build()) - .collect(Collectors.toList()); - - SaasFeatureResourceService.SaasFeatureResourceDTO saasFeatureResourceDTO = SaasFeatureResourceService.SaasFeatureResourceDTO.builder() - .terminal(payload.getTerminal()) - .features(saasFeatures) - .build(); - SaasFeatureResourceService.StoreSaasFeatureResourceCache storeSaasFeatureResourceCache = SaasFeatureResourceService.StoreSaasFeatureResourceCache.builder() - .saasFeatureResources(Lists.newArrayList(saasFeatureResourceDTO)) - .build(); - saasFeatureResourceService.storeCache(storeSaasFeatureResourceCache); - - + cacheSaasFeatureJob.cacheSaasFeature(Sets.newHashSet(payload.getTerminal())); log.info("end cached saasFeature handler rocketmq event: {}", event); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/event/inner/CacheSaasFeatureResourceHandler.java b/tyr-server/src/main/java/cn/axzo/tyr/server/event/inner/CacheSaasFeatureResourceHandler.java index 69c213a2..9695a0e0 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/event/inner/CacheSaasFeatureResourceHandler.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/event/inner/CacheSaasFeatureResourceHandler.java @@ -3,20 +3,14 @@ package cn.axzo.tyr.server.event.inner; import cn.axzo.framework.rocketmq.Event; import cn.axzo.framework.rocketmq.EventConsumer; import cn.axzo.framework.rocketmq.EventHandler; -import cn.axzo.tyr.client.model.req.PageSaasFeatureResourceReq; import cn.axzo.tyr.server.event.payload.SaasFeatureResourceUpsertPayload; -import cn.axzo.tyr.server.repository.entity.SaasFeatureResource; -import cn.axzo.tyr.server.service.SaasFeatureResourceService; -import com.google.common.collect.Lists; +import cn.axzo.tyr.server.job.CacheSaasFeatureJob; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; +import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import java.util.List; -import java.util.stream.Collectors; - /** * 缓存全量权限点,因为鉴权等逻辑,需要查询免授权和权限点是否存在,数据量大,数据库压力大 */ @@ -27,40 +21,18 @@ public class CacheSaasFeatureResourceHandler implements EventHandler, Initializi @Autowired private EventConsumer eventConsumer; @Autowired - private SaasFeatureResourceService saasFeatureResourceService; + private CacheSaasFeatureJob cacheSaasFeatureJob; @Override public void onEvent(Event event, EventConsumer.Context context) { log.info("begin cached saasFeatureResource handler rocketmq event: {}", event); SaasFeatureResourceUpsertPayload payload = event.normalizedData(SaasFeatureResourceUpsertPayload.class); - if (StringUtils.isBlank(payload.getTerminal())) { + if (CollectionUtils.isEmpty(payload.getTerminals())) { return; } - // 直接查询缓存所有节点,因为修改的代码不好改 - - PageSaasFeatureResourceReq pageSaasFeatureResourceReq = PageSaasFeatureResourceReq.builder() - .terminal(payload.getTerminal()) - .build(); - - List saasFeatures = saasFeatureResourceService.list(pageSaasFeatureResourceReq).stream() - .map(e -> SaasFeatureResourceService.SaasFeatureResourceCache.builder() - .featureId(e.getId()) - .notAuth(SaasFeatureResource.AuthType.isAllRole(e.getAuthType())) - .parentIds(e.resolvePath()) - .build()) - .collect(Collectors.toList()); - - SaasFeatureResourceService.SaasFeatureResourceDTO saasFeatureResourceDTO = SaasFeatureResourceService.SaasFeatureResourceDTO.builder() - .terminal(payload.getTerminal()) - .features(saasFeatures) - .build(); - SaasFeatureResourceService.StoreSaasFeatureResourceCache storeSaasFeatureResourceCache = SaasFeatureResourceService.StoreSaasFeatureResourceCache.builder() - .saasFeatureResources(Lists.newArrayList(saasFeatureResourceDTO)) - .build(); - saasFeatureResourceService.storeCache(storeSaasFeatureResourceCache); - + cacheSaasFeatureJob.cacheSaasFeatureResource(payload.getTerminals()); log.info("end cached saasFeatureResource handler rocketmq event: {}", event); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/event/outer/CacheSaasFeatureOldHandler.java b/tyr-server/src/main/java/cn/axzo/tyr/server/event/outer/CacheSaasFeatureOldHandler.java index 5ed9a699..014675ec 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/event/outer/CacheSaasFeatureOldHandler.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/event/outer/CacheSaasFeatureOldHandler.java @@ -2,22 +2,16 @@ package cn.axzo.tyr.server.event.outer; import cn.axzo.framework.rocketmq.Event; import cn.axzo.framework.rocketmq.EventConsumer; -import cn.axzo.tyr.client.model.enums.DelegatedType; import cn.axzo.tyr.server.event.payload.SaasFeatureDeletedPayload; import cn.axzo.tyr.server.event.payload.SaasFeatureUpsertPayload; -import cn.axzo.tyr.server.repository.dao.SaasFeatureDao; -import cn.axzo.tyr.server.repository.entity.SaasFeature; -import cn.axzo.tyr.server.service.SaasFeatureResourceService; -import com.google.common.collect.Lists; +import cn.axzo.tyr.server.job.CacheSaasFeatureJob; +import com.google.common.collect.Sets; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import java.util.List; -import java.util.stream.Collectors; - /** * 缓存全量权限点,因为鉴权等逻辑,需要查询免授权和权限点是否存在,数据量大,数据库压力大 */ @@ -28,9 +22,7 @@ public class CacheSaasFeatureOldHandler implements InitializingBean { @Autowired private EventConsumer eventConsumer; @Autowired - private SaasFeatureDao saasFeatureDao; - @Autowired - private SaasFeatureResourceService saasFeatureResourceService; + private CacheSaasFeatureJob cacheSaasFeatureJob; public void onSaasFeatureUpserted(Event event, EventConsumer.Context context) { log.info("begin cached saasFeature handler rocketmq event: {}", event); @@ -39,7 +31,8 @@ public class CacheSaasFeatureOldHandler implements InitializingBean { if (StringUtils.isBlank(payload.getTerminal())) { return; } - cacheFeature(payload.getTerminal()); + + cacheSaasFeatureJob.cacheSaasFeature(Sets.newHashSet(payload.getTerminal())); log.info("end cached saasFeature handler rocketmq event: {}", event); } @@ -51,32 +44,10 @@ public class CacheSaasFeatureOldHandler implements InitializingBean { return; } - cacheFeature(payload.getTerminal()); - + cacheSaasFeatureJob.cacheSaasFeature(Sets.newHashSet(payload.getTerminal())); log.info("end cached saasFeature handler rocketmq event: {}", event); } - private void cacheFeature(String terminal) { - List saasFeatures = saasFeatureDao.lambdaQuery() - .eq(SaasFeature::getTerminal, terminal) - .list() - .stream() - .map(e -> SaasFeatureResourceService.SaasFeatureResourceCache.builder() - .featureId(e.getId()) - .notAuth(DelegatedType.notAuth(e.getDelegatedType())) - .build()) - .collect(Collectors.toList()); - - SaasFeatureResourceService.SaasFeatureResourceDTO saasFeatureResourceDTO = SaasFeatureResourceService.SaasFeatureResourceDTO.builder() - .terminal(terminal) - .features(saasFeatures) - .build(); - SaasFeatureResourceService.StoreSaasFeatureResourceCache storeSaasFeatureResourceCache = SaasFeatureResourceService.StoreSaasFeatureResourceCache.builder() - .saasFeatureResources(Lists.newArrayList(saasFeatureResourceDTO)) - .build(); - saasFeatureResourceService.storeCache(storeSaasFeatureResourceCache); - } - @Override public void afterPropertiesSet() throws Exception { eventConsumer.registerHandler(EventTypeEnum.SAAS_FEATURE_UPSERT.getEventCode(), this::onSaasFeatureUpserted); diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/event/payload/SaasFeatureResourceUpsertPayload.java b/tyr-server/src/main/java/cn/axzo/tyr/server/event/payload/SaasFeatureResourceUpsertPayload.java index 648fb7d9..1cdcbafb 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/event/payload/SaasFeatureResourceUpsertPayload.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/event/payload/SaasFeatureResourceUpsertPayload.java @@ -6,6 +6,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import java.io.Serializable; +import java.util.Set; @Data @Builder @@ -13,5 +14,5 @@ import java.io.Serializable; @AllArgsConstructor public class SaasFeatureResourceUpsertPayload implements Serializable { - private String terminal; + private Set terminals; } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/job/CacheSaasFeatureJob.java b/tyr-server/src/main/java/cn/axzo/tyr/server/job/CacheSaasFeatureJob.java index 0d299ed9..b6b5d127 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/job/CacheSaasFeatureJob.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/job/CacheSaasFeatureJob.java @@ -7,16 +7,24 @@ import cn.axzo.tyr.server.repository.dao.SaasFeatureDao; import cn.axzo.tyr.server.repository.entity.SaasFeature; import cn.axzo.tyr.server.repository.entity.SaasFeatureResource; import cn.axzo.tyr.server.service.SaasFeatureResourceService; +import com.alibaba.fastjson.JSONObject; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.handler.IJobHandler; import com.xxl.job.core.handler.annotation.XxlJob; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; +import java.util.Optional; +import java.util.Set; import java.util.stream.Collectors; @Slf4j @@ -33,16 +41,18 @@ public class CacheSaasFeatureJob extends IJobHandler { public ReturnT execute(String s) throws Exception { log.info("start CacheSaasFeatureJob, s:{}", s); + StoreSaasFeatureParam req = Optional.ofNullable(s) + .map(e -> JSONObject.parseObject(e, StoreSaasFeatureParam.class)) + .orElseGet(() -> StoreSaasFeatureParam.builder().build()); + cacheSaasFeature(req.getTerminals()); - cacheSaasFeature(s); - - cacheSaasFeatureResource(s); + cacheSaasFeatureResource(req.getTerminals()); return ReturnT.SUCCESS; } - private void cacheSaasFeature(String terminal) { + public void cacheSaasFeature(Set terminals) { Map> saasFeatures = saasFeatureDao.lambdaQuery() - .eq(StringUtils.isNotBlank(terminal), SaasFeature::getTerminal, terminal) + .in(CollectionUtils.isNotEmpty(terminals), SaasFeature::getTerminal, terminals) .list() .stream() .collect(Collectors.groupingBy(SaasFeature::getTerminal, @@ -66,9 +76,9 @@ public class CacheSaasFeatureJob extends IJobHandler { saasFeatureResourceService.storeCache(storeSaasFeatureResourceCache); } - private void cacheSaasFeatureResource(String terminal) { + public void cacheSaasFeatureResource(Set terminals) { PageSaasFeatureResourceReq pageSaasFeatureResourceReq = PageSaasFeatureResourceReq.builder() - .terminal(terminal) + .terminals(terminals) .build(); Map> saasFeatureResources = saasFeatureResourceService.list(pageSaasFeatureResourceReq) @@ -93,4 +103,12 @@ public class CacheSaasFeatureJob extends IJobHandler { .build(); saasFeatureResourceService.storeCache(storeSaasFeatureResourceCache); } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class StoreSaasFeatureParam { + private Set terminals; + } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/FeatureResourceSyncServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/FeatureResourceSyncServiceImpl.java index 9ebdc0a8..542bea78 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/FeatureResourceSyncServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/FeatureResourceSyncServiceImpl.java @@ -3,11 +3,15 @@ package cn.axzo.tyr.server.service.impl; import cn.axzo.basics.common.BeanMapper; import cn.axzo.basics.common.constant.enums.DeleteEnum; import cn.axzo.basics.common.util.TreeUtil; +import cn.axzo.framework.rocketmq.Event; import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; import cn.axzo.tyr.client.common.enums.FeatureResourceType; import cn.axzo.tyr.client.model.req.GetFeatureResourceTreeReq; import cn.axzo.tyr.client.model.req.ResourceSyncReq; import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode; +import cn.axzo.tyr.server.config.MqProducer; +import cn.axzo.tyr.server.event.payload.RolePermissionCreatedPayload; +import cn.axzo.tyr.server.event.payload.SaasFeatureResourceUpsertPayload; import cn.axzo.tyr.server.inner.feign.BaseFeatureResourceApi; import cn.axzo.tyr.server.repository.dao.SaasFeatureResourceDao; import cn.axzo.tyr.server.repository.dao.SaasPageElementFeatureResourceRelationDao; @@ -23,6 +27,7 @@ import cn.axzo.tyr.server.service.FeatureResourceSyncService; import cn.axzo.tyr.server.util.RpcInternalUtil; import com.google.common.collect.Lists; import com.google.common.collect.Maps; +import com.google.common.collect.Sets; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; @@ -36,12 +41,15 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutorService; import java.util.function.Function; import java.util.stream.Collectors; +import static cn.axzo.tyr.server.event.inner.EventTypeEnum.ROLE_PERMISSION_CREATED; +import static cn.axzo.tyr.server.event.inner.EventTypeEnum.SAAS_FEATURE_RESOURCE_UPSERT; import static cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation.NEW_FEATURE; /** @@ -74,6 +82,13 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic @Autowired private ExecutorService asyncExecutor; + @Autowired + private final MqProducer mqProducer; + + private static final String ROLE_PERMISSION_TARGET_TYPE = "saasFeatureResourceId"; + + private static final String SAAS_FEATURE_RESOURCE_TARGET_TYPE = "saasFeatureResourceId"; + @Override public List getSyncTreeById(Long id) { List allFeatureResourceIds = Lists.newArrayList(id); @@ -123,12 +138,26 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic //处理数据缓存:避免同级节点上级重复处理 - 上级code查询 final Map codeCache = new ConcurrentHashMap<>(); + Set terminals = Sets.newHashSet(); for (Long id : req.getIds()) { //获取基准环境配置数据:同步某个ID的数据 需要同步处理它所有上级及下级组件 List syncList = RpcInternalUtil.rpcProcessor(() -> baseFeatureResourceApi.getSyncTreeById(id), "get base sync tree by id", id).getData(); syncResourceProcess(syncList, codeCache, req.getOperatorId()); + + terminals.addAll(syncList.stream() + .map(FeatureResourceTreeNode::getTerminal) + .collect(Collectors.toSet())); } + + Event event = Event.builder() + .targetType(SAAS_FEATURE_RESOURCE_TARGET_TYPE) + .eventCode(SAAS_FEATURE_RESOURCE_UPSERT.getEventCode()) + .data(SaasFeatureResourceUpsertPayload.builder() + .terminals(terminals) + .build()) + .build(); + mqProducer.send(event); } @Override @@ -283,6 +312,17 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic .collect(Collectors.toList()); saasPgroupPermissionRelationDao.saveBatch(insertRelation); } + + Event event = Event.builder() + .targetType(ROLE_PERMISSION_TARGET_TYPE) + .eventCode(ROLE_PERMISSION_CREATED.getEventCode()) + .data(RolePermissionCreatedPayload.builder() + .roleIds(saasRoles.stream() + .map(SaasRole::getId) + .collect(Collectors.toSet())) + .build()) + .build(); + mqProducer.send(event); } private Map> getFeatureResourceRoleCodeMap(List allFeatureResourceIds) { diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java index 4384446d..c1c4dfb4 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -1377,7 +1377,7 @@ public class RoleServiceImpl extends ServiceImpl .targetType(TARGET_TYPE) .eventCode(SAAS_FEATURE_RESOURCE_UPSERT.getEventCode()) .data(SaasFeatureResourceUpsertPayload.builder() - .terminal(terminal) + .terminals(Sets.newHashSet(terminal)) .build()) .build(); mqProducer.send(event); diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index 7c114ed7..a8d7bbbb 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -292,7 +292,7 @@ public class SaasFeatureResourceServiceImpl extends ServiceImpl