diff --git a/.drone.yml b/.drone.yml index f1d8d41..3dec36a 100644 --- a/.drone.yml +++ b/.drone.yml @@ -74,7 +74,7 @@ volumes: path: /home/build/fateverse - name: skywalking host: - path: /home/skywalking-agent + path: /home/build/skywalking-agent - name: config # k8s对接的配置文件 host: path: /home/kubect diff --git a/Dockerfile b/Dockerfile index d28e349..172bad7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,17 +2,15 @@ FROM azul/zulu-openjdk:11.0.22-jdk VOLUME /tmp RUN useradd -b /home -m -s /bin/bash clay RUN chmod a+xr -R /home/clay && chown clay:clay -R /home/clay -#COPY skywalking /home/clay/skywalking-agent -#RUN chmod a+xr -R /home/clay/skywalking-agent && chown clay:clay -R /home/clay/skywalking-agent +COPY skywalking /home/clay/skywalking-agent +RUN chmod a+xr -R /home/clay/skywalking-agent && chown clay:clay -R /home/clay/skywalking-agent USER clay ARG NAME=$DRONE_COMMIT_BRANCH COPY ./$NAME.jar /home/clay/$NAME.jar COPY start.sh /home/clay/start.sh WORKDIR /home/clay RUN mkdir -p /home/clay/logs && touch /home/clay/logs/spring.log -#RUN mkdir -p /home/clay/code -#RUN chmod 777 /home/clay/code -#RUN mkdir -p /home/clay/skywalking-agent/logs && touch /home/clay/skywalking-agent/logs/skywalking-api.log +RUN mkdir -p /home/clay/skywalking-agent/logs && touch /home/clay/skywalking-agent/logs/skywalking-api.log ENV REF_NAME dev EXPOSE 8080 CMD bash /home/clay/start.sh $REF_NAME && echo "start logging..." && : > /home/clay/logs/spring.log && tail -F -n 500 /home/clay/logs/spring.log \ No newline at end of file diff --git a/README.md b/README.md index 7572941..a0024d1 100644 --- a/README.md +++ b/README.md @@ -22,8 +22,8 @@ | 依赖 | 版本 | |----------------------|------------| | Spring Boot | 2.7.3 | -| Spring Cloud | 2021.0.5 | -| Spring Cloud Alibaba | 2021.0.4.0 | +| Spring Cloud | 2021.0.3 | +| Spring Cloud Alibaba | 2021.0.1.0 | | Mybatis | 3.5.2 | | Vue | 3.1.3 | | React | 18.2.0 | diff --git a/common/common-code/src/main/java/cn/fateverse/common/code/engine/JavaScriptEngine.java b/common/common-code/src/main/java/cn/fateverse/common/code/engine/JavaScriptEngine.java index 50ff47d..dd0542b 100644 --- a/common/common-code/src/main/java/cn/fateverse/common/code/engine/JavaScriptEngine.java +++ b/common/common-code/src/main/java/cn/fateverse/common/code/engine/JavaScriptEngine.java @@ -96,7 +96,7 @@ public class JavaScriptEngine { } - private static void remove(String functionName) { + public static void remove(String functionName) { SegmentLock.lock(functionName, () -> { functionMap.remove(functionName); return null; diff --git a/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/controller/PortalController.java b/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/controller/PortalController.java index f254e0e..7b34fde 100644 --- a/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/controller/PortalController.java +++ b/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/controller/PortalController.java @@ -8,6 +8,7 @@ import cn.fateverse.common.decrypt.annotation.EncryptField; import cn.fateverse.query.entity.dto.DataAdapterCodeDto; import cn.fateverse.query.entity.dto.MockParam; import cn.fateverse.query.entity.dto.PortalDto; +import cn.fateverse.query.entity.dto.PortalPublish; import cn.fateverse.query.entity.query.PortalQuery; import cn.fateverse.query.entity.vo.PortalIdWrapper; import cn.fateverse.query.entity.vo.PortalVo; @@ -116,6 +117,25 @@ public class PortalController { return Result.ok(); } + @ApiOperation("列表接口发布") + @PostMapping("/list/publish") + @Encrypt(Encrypt.Position.IN) + @PreAuthorize("@ss.hasPermission('query:portal:edit')") + public Result listPublish(@RequestBody @Validated PortalPublish portalPublish) { + portalService.publish(portalPublish, Boolean.TRUE); + return Result.ok(); + } + @ApiOperation("设计器接口发布") + @PostMapping("/publish") + @PreAuthorize("@ss.hasPermission('query:portal:edit')") + public Result publish(@RequestBody @Validated PortalPublish portalPublish) { + if (ObjectUtils.isEmpty(portalPublish.getCode())){ + return Result.error("代码不能为空!"); + } + portalService.publish(portalPublish, Boolean.FALSE); + return Result.ok(); + } + @ApiOperation("撤销发布") @Encrypt diff --git a/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/dubbo/DubboDispatchServletPublishImpl.java b/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/dubbo/DubboDispatchServletPublishImpl.java index 3eeb9d2..c6bb27d 100644 --- a/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/dubbo/DubboDispatchServletPublishImpl.java +++ b/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/dubbo/DubboDispatchServletPublishImpl.java @@ -1,7 +1,11 @@ package cn.fateverse.query.dubbo; import cn.fateverse.query.constant.QueryConstant; +import cn.fateverse.query.entity.Portal; +import cn.fateverse.query.entity.PortalMapping; import cn.fateverse.query.entity.bo.PortalBo; +import cn.fateverse.query.mapper.PortalMapper; +import cn.fateverse.query.mapper.PortalMappingMapper; import cn.fateverse.query.portal.service.HandlerMethodService; import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.config.annotation.DubboService; @@ -9,6 +13,7 @@ import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.bind.annotation.RequestMethod; import javax.annotation.Resource; +import java.util.List; /** * @author Clay @@ -18,10 +23,14 @@ import javax.annotation.Resource; @DubboService(scope = "remote") public class DubboDispatchServletPublishImpl implements DubboDispatchServletPublish { - @Resource private HandlerMethodService methodService; + @Resource + private PortalMapper portalMapper; + + @Resource + private PortalMappingMapper portalMappingMapper; @Resource private RedisTemplate redisTemplate; @@ -30,7 +39,13 @@ public class DubboDispatchServletPublishImpl implements DubboDispatchServletPubl public Boolean publish(String path, String requestMethod) { PortalBo portalBo = redisTemplate.opsForValue().get(QueryConstant.PORTAL_KEY + path + ":" + requestMethod); if (portalBo == null) { - return Boolean.FALSE; + Portal portal = portalMapper.selectByPath(path, requestMethod); + if (portal == null) { + return Boolean.FALSE; + } + List portalMappings = portalMappingMapper.selectByPortalId(portal.getPortalId()); + portalBo = PortalBo.toPortalBo(portal, portalMappings); + redisTemplate.opsForValue().set(QueryConstant.PORTAL_KEY + portalBo.getPath() + ":" + portalBo.getRequestMethod(), portalBo); } try { log.info("registerMapping, path:{}, requestMethod:{}", path, requestMethod); diff --git a/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/entity/dto/PortalPublish.java b/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/entity/dto/PortalPublish.java new file mode 100644 index 0000000..6703399 --- /dev/null +++ b/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/entity/dto/PortalPublish.java @@ -0,0 +1,26 @@ +package cn.fateverse.query.entity.dto; + +import cn.fateverse.common.decrypt.annotation.EncryptField; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @author Clay + * @date 2024/4/30 16:58 + */ +@Data +public class PortalPublish { + + @EncryptField + @NotBlank(message = "接口id不能为空") + private String portalId; + + private String code; + + + public Long getLongPortalId() { + return Long.valueOf(portalId); + } + +} diff --git a/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/handler/engine/impl/JavaScriptEngineExecuteHandler.java b/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/handler/engine/impl/JavaScriptEngineExecuteHandler.java index 9a512f0..52113d6 100644 --- a/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/handler/engine/impl/JavaScriptEngineExecuteHandler.java +++ b/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/handler/engine/impl/JavaScriptEngineExecuteHandler.java @@ -61,6 +61,11 @@ public class JavaScriptEngineExecuteHandler implements EngineExecuteHandler { @Override public Boolean remove(DataAdapter dataAdapter) { - return Boolean.FALSE; + if (!DataAdapterType.JAVA_SCRIPT.equals(dataAdapter.getType())) { + return Boolean.FALSE; + } + JavaScriptEngine.remove("execute" + dataAdapter.getAdapterId()); + return Boolean.TRUE; } + } diff --git a/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/portal/PortalDispatchServlet.java b/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/portal/PortalDispatchServlet.java index 281755e..b0f87d6 100644 --- a/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/portal/PortalDispatchServlet.java +++ b/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/portal/PortalDispatchServlet.java @@ -7,7 +7,6 @@ import cn.fateverse.query.entity.Portal; import cn.fateverse.query.entity.PortalMapping; import cn.fateverse.query.entity.bo.PortalBo; import cn.fateverse.query.handler.reader.DataAdapterHandlerReader; -import cn.fateverse.query.mapper.DataAdapterMapper; import cn.fateverse.query.mapper.PortalMapper; import cn.fateverse.query.mapper.PortalMappingMapper; import org.springframework.data.redis.core.RedisTemplate; @@ -31,19 +30,14 @@ public class PortalDispatchServlet { private final PortalMapper portalMapper; - private final DataAdapterMapper dataAdapterMapper; - private final PortalMappingMapper portalMappingMapper; private final DataAdapterHandlerReader dataAdapterHandler; - public PortalDispatchServlet(PortalMapper portalMapper, - DataAdapterMapper dataAdapterMapper, PortalMappingMapper portalMappingMapper, DataAdapterHandlerReader dataAdapterHandler) { this.portalMapper = portalMapper; - this.dataAdapterMapper = dataAdapterMapper; this.portalMappingMapper = portalMappingMapper; this.dataAdapterHandler = dataAdapterHandler; } @@ -67,12 +61,7 @@ public class PortalDispatchServlet { redisTemplate.opsForValue().set(QueryConstant.PORTAL_KEY + portalBo.getPath() + ":" + portalBo.getRequestMethod(), portalBo); } //进行数据适配器的执行逻辑 - Object result = null; -// if (portalBo.getState() == 1 || portalBo.getState() == 2) { - result = dataAdapterHandler.execute(portalBo, request); -// } else { -// result = dataAdapterHandler.mockExecute(portalBo, request); -// } + Object result = dataAdapterHandler.execute(portalBo, request); //将返回结果放入response ResponseRender.renderString(response, Result.ok(result)); } diff --git a/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/portal/service/HandlerMethodService.java b/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/portal/service/HandlerMethodService.java index 0ad8866..15a8857 100644 --- a/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/portal/service/HandlerMethodService.java +++ b/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/portal/service/HandlerMethodService.java @@ -2,28 +2,12 @@ package cn.fateverse.query.portal.service; import cn.fateverse.common.core.exception.CustomException; import cn.fateverse.common.core.utils.SpringContextHolder; -import cn.fateverse.query.dubbo.DubboDispatchServletPublish; import cn.fateverse.query.portal.PortalDispatchServlet; -import cn.fateverse.query.portal.config.DubboServiceBean; import cn.fateverse.query.portal.event.DispatchSyncEvent; -import com.alibaba.cloud.nacos.NacosDiscoveryProperties; -import com.alibaba.cloud.nacos.NacosServiceManager; -import com.alibaba.cloud.nacos.registry.NacosRegistration; -import com.alibaba.nacos.api.PropertyKeyConst; -import com.alibaba.nacos.api.exception.NacosException; -import com.alibaba.nacos.api.naming.NamingService; -import com.alibaba.nacos.api.naming.pojo.Instance; import lombok.extern.slf4j.Slf4j; -import org.apache.dubbo.config.annotation.DubboReference; -import org.apache.dubbo.rpc.RpcContext; -import org.apache.dubbo.rpc.RpcContextAttachment; -import org.apache.dubbo.rpc.cluster.specifyaddress.Address; -import org.apache.dubbo.rpc.cluster.specifyaddress.UserSpecifiedAddressUtil; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; -import org.springframework.core.env.Environment; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Component; import org.springframework.util.ObjectUtils; import org.springframework.web.bind.annotation.RequestMethod; @@ -32,12 +16,7 @@ import org.springframework.web.servlet.mvc.method.RequestMappingInfo; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; import java.lang.reflect.Method; -import java.util.List; import java.util.Map; -import java.util.Optional; -import java.util.Properties; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.BlockingQueue; /** * @author Clay @@ -49,7 +28,7 @@ public class HandlerMethodService implements ApplicationContextAware { public static final String CUSTOM_INTERFACE = "customInterface:"; - private RequestMappingHandlerMapping mapping; + private RequestMappingHandlerMapping handlerMapping; private Method mappingMethod; @@ -73,7 +52,7 @@ public class HandlerMethodService implements ApplicationContextAware { @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { //获取到web mvc的接口存储mapping - mapping = (RequestMappingHandlerMapping) applicationContext.getBean("requestMappingHandlerMapping"); + handlerMapping = (RequestMappingHandlerMapping) applicationContext.getBean("requestMappingHandlerMapping"); } /** @@ -92,12 +71,12 @@ public class HandlerMethodService implements ApplicationContextAware { .consumes(empty) .produces(empty) .mappingName(CUSTOM_INTERFACE + path); - RequestMappingInfo requestMappingInfo = builder.options(mapping.getBuilderConfiguration()).build(); - Map handlerMethods = mapping.getHandlerMethods(); + RequestMappingInfo requestMappingInfo = builder.options(handlerMapping.getBuilderConfiguration()).build(); + Map handlerMethods = handlerMapping.getHandlerMethods(); if (handlerMethods.containsKey(requestMappingInfo)) { throw new CustomException("path is exist"); } - mapping.registerMapping(requestMappingInfo, "portalDispatchServlet", mappingMethod); + handlerMapping.registerMapping(requestMappingInfo, "portalDispatchServlet", mappingMethod); // 判断是否需要发起同步 if (sync) { //使用事件监听机制,避免循环注入 @@ -112,12 +91,12 @@ public class HandlerMethodService implements ApplicationContextAware { * @param requestMethod 请求类型 */ public void unregisterMapping(String path, RequestMethod requestMethod, Boolean sync) { - Map handlerMethods = mapping.getHandlerMethods(); + Map handlerMethods = handlerMapping.getHandlerMethods(); for (RequestMappingInfo mappingInfo : handlerMethods.keySet()) { if (!ObjectUtils.isEmpty(mappingInfo.getName()) && (CUSTOM_INTERFACE + path).equals(mappingInfo.getName()) && mappingInfo.getMethodsCondition().getMethods().contains(requestMethod)) { - mapping.unregisterMapping(mappingInfo); + handlerMapping.unregisterMapping(mappingInfo); if (sync) { SpringContextHolder.publishEvent(new DispatchSyncEvent(path, requestMethod.name(), Boolean.FALSE)); } diff --git a/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/service/PortalService.java b/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/service/PortalService.java index 91d5bf0..7661e93 100644 --- a/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/service/PortalService.java +++ b/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/service/PortalService.java @@ -4,6 +4,7 @@ import cn.fateverse.common.core.result.page.TableDataInfo; import cn.fateverse.query.entity.dto.DataAdapterCodeDto; import cn.fateverse.query.entity.dto.MockParam; import cn.fateverse.query.entity.dto.PortalDto; +import cn.fateverse.query.entity.dto.PortalPublish; import cn.fateverse.query.entity.query.PortalQuery; import cn.fateverse.query.entity.vo.PortalIdWrapper; import cn.fateverse.query.entity.vo.PortalVo; @@ -79,6 +80,14 @@ public interface PortalService { */ PortalIdWrapper edit(PortalDto portalDto); + /** + * 发布接口 + * + * @param portalPublish 发布接口对象 + * @param isList 是否为list发布 + */ + void publish(PortalPublish portalPublish, Boolean isList); + /** * 取消发布 * diff --git a/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/service/impl/PortalServiceImpl.java b/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/service/impl/PortalServiceImpl.java index 3335652..e65d457 100644 --- a/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/service/impl/PortalServiceImpl.java +++ b/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/service/impl/PortalServiceImpl.java @@ -7,11 +7,13 @@ import cn.fateverse.query.entity.*; import cn.fateverse.query.entity.bo.PortalBo; import cn.fateverse.query.entity.dto.DataAdapterCodeDto; import cn.fateverse.query.entity.dto.MockParam; +import cn.fateverse.query.entity.dto.PortalPublish; import cn.fateverse.query.entity.vo.DataAdapterVo; import cn.fateverse.query.entity.vo.PortalIdWrapper; import cn.fateverse.query.enums.DataAdapterType; import cn.fateverse.query.enums.PortalPremEnum; import cn.fateverse.query.handler.reader.DataAdapterHandlerReader; +import cn.fateverse.query.handler.reader.EngineExecuteHandlerReader; import cn.fateverse.query.mapper.*; import cn.fateverse.query.portal.service.HandlerMethodService; import cn.fateverse.query.constant.QueryConstant; @@ -60,6 +62,8 @@ public class PortalServiceImpl implements PortalService { private final DataAdapterHandlerReader handlerReader; + private final EngineExecuteHandlerReader executeHandlerReader; + public PortalServiceImpl(PortalMapper portalMapper, UniQueryMapper queryMapper, DataAdapterMapper adapterMapper, @@ -67,7 +71,8 @@ public class PortalServiceImpl implements PortalService { ThreadPoolTaskExecutor taskExecuteExecutor, HandlerMethodService methodService, PortalInterfaceMapper portalInterfaceMapper, - DataAdapterHandlerReader handlerReader) { + DataAdapterHandlerReader handlerReader, + EngineExecuteHandlerReader executeHandlerReader) { this.portalMapper = portalMapper; this.queryMapper = queryMapper; this.adapterMapper = adapterMapper; @@ -75,6 +80,7 @@ public class PortalServiceImpl implements PortalService { this.methodService = methodService; this.portalInterfaceMapper = portalInterfaceMapper; this.handlerReader = handlerReader; + this.executeHandlerReader = executeHandlerReader; taskExecuteExecutor.execute(() -> { PortalQuery query = new PortalQuery(); // query.setState(QueryConstant.PORTAL_PUBLISH); @@ -354,6 +360,24 @@ public class PortalServiceImpl implements PortalService { } } + + @Override + public void publish(PortalPublish portalPublish, Boolean isList) { + Long portalId = portalPublish.getLongPortalId(); + Portal portal = portalMapper.selectById(portalId); + List mappings = portalMappingMapper.selectByPortalId(portalId); + if (!isList && portal.getCreateDataAdapter() && !ObjectUtils.isEmpty(portal.getAdapterId())) { + DataAdapter dataAdapter = adapterMapper.selectById(portal.getAdapterId()); + dataAdapter.setCode(portalPublish.getCode()); + adapterMapper.updateCode(dataAdapter); + } + portalMapper.updateState(portalId, QueryConstant.PORTAL_PUBLISH); + if (PortalPremEnum.EXTERNAL.equals(portal.getPermissionType()) || PortalPremEnum.ANONYMITY.equals(portal.getPermissionType())) { + publishPortal(portal, mappings, Boolean.TRUE); + } + } + + @Override @Transactional(rollbackFor = Exception.class) public void delete(Long portalId) { diff --git a/start.sh b/start.sh index 40e1080..3fffc9c 100644 --- a/start.sh +++ b/start.sh @@ -31,13 +31,13 @@ batch=${DRONE_COMMIT_BRANCH} ignoreArr=("monitor","sentinel-dashboard-pro","sentinel-dashboard") -#if [[ "${ignoreArr[*]}" =~ "${batch}" ]]; then -# JAVA_AGENT="-javaagent:/home/clay/skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=$DRONE_COMMIT_BRANCH -Dskywalking.trace.ignore_path=/actuator/** -Dskywalking.collector.backend_service=10.7.89.101:11800 --add-opens java.base/jdk.internal.misc=ALL-UNNAMED -Dio.netty.tryReflectionSetAccessible=true" -# nohup java -jar $JAVA_AGENT $JAVA_OPTS $JAVA_MEM_OPTS $DRONE_COMMIT_BRANCH.jar --spring.profiles.active=pro --server.port=8080 >./logs/spring.log 2>&1 & -#else -# echo "exist"; -# nohup java -jar $JAVA_OPTS $JAVA_MEM_OPTS $DRONE_COMMIT_BRANCH.jar --spring.profiles.active=pro --server.port=8080 >./logs/spring.log 2>&1 & -#fi +if [[ "${ignoreArr[*]}" =~ "${batch}" ]]; then + JAVA_AGENT="-javaagent:/home/clay/skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=$DRONE_COMMIT_BRANCH -Dskywalking.trace.ignore_path=/actuator/** -Dskywalking.collector.backend_service=10.7.125.151:11800 --add-opens java.base/jdk.internal.misc=ALL-UNNAMED -Dio.netty.tryReflectionSetAccessible=true" + nohup java -jar $JAVA_AGENT $JAVA_OPTS $JAVA_MEM_OPTS $DRONE_COMMIT_BRANCH.jar --spring.profiles.active=pro --server.port=8080 >./logs/spring.log 2>&1 & +else + echo "exist"; + nohup java -jar $JAVA_OPTS $JAVA_MEM_OPTS $DRONE_COMMIT_BRANCH.jar --spring.profiles.active=pro --server.port=8080 >./logs/spring.log 2>&1 & +fi nohup java -jar $JAVA_OPTS $JAVA_MEM_OPTS $DRONE_COMMIT_BRANCH.jar --spring.profiles.active=pro --server.port=8080 >./logs/spring.log 2>&1 &