feat:(REQ-2720) 增加同步菜单时发送菜单更新mq和角色权限mq,触发更新缓存

This commit is contained in:
lilong 2024-08-15 16:01:38 +08:00
parent a217422ab4
commit 61f755d3ee
9 changed files with 86 additions and 104 deletions

View File

@ -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";
}

View File

@ -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<SaasFeatureResourceService.SaasFeatureResourceCache> 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);
}

View File

@ -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<SaasFeatureResourceService.SaasFeatureResourceCache> 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);
}

View File

@ -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<SaasFeatureResourceService.SaasFeatureResourceCache> 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);

View File

@ -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<String> terminals;
}

View File

@ -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<String> 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<String> terminals) {
Map<String, List<SaasFeatureResourceService.SaasFeatureResourceCache>> 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<String> terminals) {
PageSaasFeatureResourceReq pageSaasFeatureResourceReq = PageSaasFeatureResourceReq.builder()
.terminal(terminal)
.terminals(terminals)
.build();
Map<String, List<SaasFeatureResourceService.SaasFeatureResourceCache>> 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<String> terminals;
}
}

View File

@ -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<FeatureResourceTreeNode> getSyncTreeById(Long id) {
List<Long> allFeatureResourceIds = Lists.newArrayList(id);
@ -123,12 +138,26 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic
//处理数据缓存避免同级节点上级重复处理 - 上级code查询
final Map<Long, String> codeCache = new ConcurrentHashMap<>();
Set<String> terminals = Sets.newHashSet();
for (Long id : req.getIds()) {
//获取基准环境配置数据:同步某个ID的数据 需要同步处理它所有上级及下级组件
List<FeatureResourceTreeNode> 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<Long, List<String>> getFeatureResourceRoleCodeMap(List<Long> allFeatureResourceIds) {

View File

@ -1377,7 +1377,7 @@ public class RoleServiceImpl extends ServiceImpl<SaasRoleMapper, SaasRole>
.targetType(TARGET_TYPE)
.eventCode(SAAS_FEATURE_RESOURCE_UPSERT.getEventCode())
.data(SaasFeatureResourceUpsertPayload.builder()
.terminal(terminal)
.terminals(Sets.newHashSet(terminal))
.build())
.build();
mqProducer.send(event);

View File

@ -292,7 +292,7 @@ public class SaasFeatureResourceServiceImpl extends ServiceImpl<SaasFeatureResou
.targetType(TARGET_TYPE)
.eventCode(SAAS_FEATURE_RESOURCE_UPSERT.getEventCode())
.data(SaasFeatureResourceUpsertPayload.builder()
.terminal(req.getTerminal())
.terminals(Sets.newHashSet(req.getTerminal()))
.build())
.build();
mqProducer.send(event);
@ -652,7 +652,7 @@ public class SaasFeatureResourceServiceImpl extends ServiceImpl<SaasFeatureResou
.targetType(TARGET_TYPE)
.eventCode(SAAS_FEATURE_RESOURCE_UPSERT.getEventCode())
.data(SaasFeatureResourceUpsertPayload.builder()
.terminal(featureResource.getTerminal())
.terminals(Sets.newHashSet(featureResource.getTerminal()))
.build())
.build();
mqProducer.send(event);