当前位置: 首页 > news >正文

小公司如何做网站隔离资源搜索器

小公司如何做网站隔离,资源搜索器,网站开发语言作用,服装制作公司判题机模块预开发(架构师)(工厂模式) 判题机模块 是为了把代码交个代码沙箱去处理 得到结果返回 代码沙箱 梳理判题模块和代码沙箱的关系 判题模块:调用代码沙箱 把代码和输入交给代码沙箱去执行 代码沙箱:只负责接受代码和输入 返回编译的结果 不负…

判题机模块预开发(架构师)(工厂模式)

判题机模块

是为了把代码交个代码沙箱去处理 得到结果返回

代码沙箱

梳理判题模块和代码沙箱的关系

判题模块:调用代码沙箱 把代码和输入交给代码沙箱去执行

代码沙箱:只负责接受代码和输入 返回编译的结果 不负责判题

这两个模块完全解耦

我们采用API交互

为什么代码沙箱要接受和输出一组运行用例

前提:我们的每道题目有多组测试用例

如果每个用例单独调用一个代码用例 会调用多次接口 需要多次网络运输 程序要多次编译 记录程序的执行状态 重复的代码不重复编译

这是一种常见的性能优化的方法

创建一个新的包

用来放代码沙箱模块

先写一个接口

package com.dduo.dduoj.judge.codesandbox;public interface CodeSandbox {ExecuteCodeRequest executeCode(ExecuteCodeRequest executeCodeRequest);
}

提高通用性

之后我们的项目代码只调用接口

不调用具体的实现类

就不用去修改名称了 便于拓展

写一下实体类

ExecuteCodeRequest请求

package com.dduo.dduoj.judge.codesandbox.model;import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.List;@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ExecuteCodeRequest {private List<String> inputList;private String code;private String language;
}


ExecuteCodeResponse响应

package com.dduo.dduoj.judge.codesandbox.model;import com.dduo.dduoj.model.dto.question.JudgeConfig;
import com.dduo.dduoj.model.dto.questionsubmit.JudgeInfo;import java.util.List;public class ExecuteCodeResponse {private List<String> outputList;//执行信息private String message;//执行状态private Integer status;private JudgeInfo judgeInfo;
}

完善

定义不同的代码沙箱实现类

示例代码沙箱

远程代码沙箱

第三方代码沙箱

架构工作

lombok Builder注解

测试一下

package com.dduo.dduoj.judge.codesandbox;import com.dduo.dduoj.judge.codesandbox.impl.ExampleCodeSandbox;
import com.dduo.dduoj.judge.codesandbox.impl.RemoteCodeSandbox;
import com.dduo.dduoj.judge.codesandbox.model.ExecuteCodeRequest;
import com.dduo.dduoj.judge.codesandbox.model.ExecuteCodeResponse;import com.dduo.dduoj.model.enums.QuestionSubmitLanguageEnum;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import java.util.Arrays;
import java.util.List;@SpringBootTest
class CodeSandboxTest {@Testvoid executeCode() {CodeSandbox codeSandbox = new RemoteCodeSandbox();String code = "int main() { }";String language = QuestionSubmitLanguageEnum.JAVA.getValue();List<String> inputList = Arrays.asList("1 2", "3 4");ExecuteCodeRequest executeCodeRequest = ExecuteCodeRequest.builder().code(code).language(language).inputList(inputList).build();ExecuteCodeResponse executeCodeResponse = codeSandbox.executeCode(executeCodeRequest);Assertions.assertNotNull(executeCodeResponse);}
}

工厂模式

但是现在问题是我们把new代码沙箱写死了 如果后面项目要改用其他沙箱

可能要改很多地方的代码

我们要使用工厂模式

根据用具传入的字符串参数 生成对应的代码沙箱实现类

package com.dduo.dduoj.judge.codesandbox;import com.dduo.dduoj.judge.codesandbox.impl.ExampleCodeSandbox;
import com.dduo.dduoj.judge.codesandbox.impl.RemoteCodeSandbox;
import com.dduo.dduoj.judge.codesandbox.impl.ThirdPartyCodeSandbox;//代码沙箱工厂 根据字符串参数 创建指定的代码沙箱示例
public class CodeSandboxFactory {/** 创建代码沙箱示例* @param type 沙箱类型* @return* */public static CodeSandbox NewInstance(String type) {switch (type) {case "example":return new ExampleCodeSandbox();case "remote":return new RemoteCodeSandbox();case "thirdParty":return new ThirdPartyCodeSandbox();default:return new ExampleCodeSandbox();}}
}

如果确定代码沙箱示例不会出现线程安全问题

可复用

那么可以使用单例工厂模式

但是这种方式是不可取的 我们应该把这些东西放到配置里面

配置化 去改配置文件 而不是修改字符串

这就叫参数配置化 开发者只需要去修改配置文件 而不是去看项目代码 就能自定义使用项目的更多功能

先在application.yml里面去设置

再在程序里面去读取

示例

package com.dduo.dduoj.judge.codesandbox;import com.dduo.dduoj.judge.codesandbox.impl.ExampleCodeSandbox;
import com.dduo.dduoj.judge.codesandbox.impl.RemoteCodeSandbox;
import com.dduo.dduoj.judge.codesandbox.model.ExecuteCodeRequest;
import com.dduo.dduoj.judge.codesandbox.model.ExecuteCodeResponse;import com.dduo.dduoj.model.enums.QuestionSubmitLanguageEnum;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;import java.util.Arrays;
import java.util.List;@SpringBootTest
class CodeSandboxTest {@Value("${codesandbox.type:example}")private String value;@Testvoid executeCode() {CodeSandbox codeSandbox = CodeSandboxFactory.NewInstance(value);String code = "int main() { }";String language = QuestionSubmitLanguageEnum.JAVA.getValue();List<String> inputList = Arrays.asList("1 2", "3 4");ExecuteCodeRequest executeCodeRequest = ExecuteCodeRequest.builder().code(code).language(language).inputList(inputList).build();ExecuteCodeResponse executeCodeResponse = codeSandbox.executeCode(executeCodeRequest);Assertions.assertNotNull(executeCodeResponse);}
}

我们要增强代码沙箱的能力

在调用代码沙箱前 输出请求参数 在代码沙箱调用后 输出响应结果日志

package com.dduo.dduoj.judge.codesandbox.impl;import com.dduo.dduoj.judge.codesandbox.CodeSandbox;
import com.dduo.dduoj.judge.codesandbox.model.ExecuteCodeRequest;
import com.dduo.dduoj.judge.codesandbox.model.ExecuteCodeResponse;
import lombok.extern.slf4j.Slf4j;//示例代码沙箱 (仅供测试 跑通业务流程)
@Slf4j
public class ExampleCodeSandbox implements CodeSandbox {@Overridepublic ExecuteCodeResponse executeCode(ExecuteCodeRequest executeCodeRequest) {log.info("请求信息"+executeCodeRequest.toString());System.out.println("示例代码沙箱");return null;}
}

思考

我们每一个代码沙箱类都写一个 log.info ?

难道每次调用代码沙箱前后都要执行log ?

我们使用代理模式 提供一个Proxy 来增强代码沙箱的能力

静态代理模式

中介

调用者调用代理类 代理类去调用代码沙箱

代理类还可以做一些额外的功能

不仅不用改变原本的代码沙箱实现类 而且对调用者来说 基本也没有改变

也不需要在每一个调用代码沙箱的地方去统计代码

package com.dduo.dduoj.judge.codesandbox;import com.dduo.dduoj.judge.codesandbox.model.ExecuteCodeRequest;
import com.dduo.dduoj.judge.codesandbox.model.ExecuteCodeResponse;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;@Slf4j
@AllArgsConstructor
public class CodeSandboxProxy implements CodeSandbox{private CodeSandbox codeSandbox;@Overridepublic ExecuteCodeResponse executeCode(ExecuteCodeRequest executeCodeRequest) {log.info("代码沙箱的请求信息"+executeCodeRequest.toString());ExecuteCodeResponse executeCodeResponse = codeSandbox.executeCode(executeCodeRequest);log.info("代码沙箱的响应信息"+executeCodeResponse.toString());return executeCodeResponse;}
}

接下来我们就可以去修改调用方式

@Test
void executeCodeByProxy() {CodeSandbox codeSandbox = CodeSandboxFactory.NewInstance(value);codeSandbox =new CodeSandboxProxy(codeSandbox);String code = "int main() { }";String language = QuestionSubmitLanguageEnum.JAVA.getValue();List<String> inputList = Arrays.asList("1 2", "3 4");ExecuteCodeRequest executeCodeRequest = ExecuteCodeRequest.builder().code(code).language(language).inputList(inputList).build();ExecuteCodeResponse executeCodeResponse = codeSandbox.executeCode(executeCodeRequest);Assertions.assertNotNull(executeCodeResponse);
}

文章转载自:
http://dinncomundu.wbqt.cn
http://dinncoppfa.wbqt.cn
http://dinncosolipsism.wbqt.cn
http://dinncosystematology.wbqt.cn
http://dinncoquinquennial.wbqt.cn
http://dinncosynchronicity.wbqt.cn
http://dinncomoscow.wbqt.cn
http://dinncolinz.wbqt.cn
http://dinncopreelection.wbqt.cn
http://dinncotelethon.wbqt.cn
http://dinncovaginate.wbqt.cn
http://dinncohih.wbqt.cn
http://dinncoscoot.wbqt.cn
http://dinncosemiconsciousness.wbqt.cn
http://dinncoimpertinence.wbqt.cn
http://dinncocapsaicin.wbqt.cn
http://dinncoethnocracy.wbqt.cn
http://dinncotittivate.wbqt.cn
http://dinncomordacious.wbqt.cn
http://dinncosisterless.wbqt.cn
http://dinncoplastral.wbqt.cn
http://dinncomidcult.wbqt.cn
http://dinncooxytone.wbqt.cn
http://dinncochimar.wbqt.cn
http://dinncoreenact.wbqt.cn
http://dinncoseascout.wbqt.cn
http://dinncosdmi.wbqt.cn
http://dinncophat.wbqt.cn
http://dinncoserigraphy.wbqt.cn
http://dinncoallpossessed.wbqt.cn
http://dinncocavicorn.wbqt.cn
http://dinncoglomma.wbqt.cn
http://dinncoskua.wbqt.cn
http://dinncotwayblade.wbqt.cn
http://dinncoculverin.wbqt.cn
http://dinncoallantoin.wbqt.cn
http://dinncosequestrotomy.wbqt.cn
http://dinncooverearnest.wbqt.cn
http://dinncoincorruptible.wbqt.cn
http://dinncobilocular.wbqt.cn
http://dinncobaboonery.wbqt.cn
http://dinncorooming.wbqt.cn
http://dinncoshamefaced.wbqt.cn
http://dinncocryptogrammic.wbqt.cn
http://dinncorosewater.wbqt.cn
http://dinncomicrotubule.wbqt.cn
http://dinncocardialgia.wbqt.cn
http://dinncotombarolo.wbqt.cn
http://dinncophotoceramic.wbqt.cn
http://dinncodolman.wbqt.cn
http://dinncoexpand.wbqt.cn
http://dinncovestibular.wbqt.cn
http://dinncobossiness.wbqt.cn
http://dinncopar.wbqt.cn
http://dinncofinesse.wbqt.cn
http://dinncocassock.wbqt.cn
http://dinncosycee.wbqt.cn
http://dinncolws.wbqt.cn
http://dinncoodysseus.wbqt.cn
http://dinncofledge.wbqt.cn
http://dinncophytoalexin.wbqt.cn
http://dinncohandweaving.wbqt.cn
http://dinnconothofagus.wbqt.cn
http://dinncohelcosis.wbqt.cn
http://dinncounpersuadable.wbqt.cn
http://dinncodobie.wbqt.cn
http://dinncobalikpapan.wbqt.cn
http://dinncodilacerate.wbqt.cn
http://dinncophilander.wbqt.cn
http://dinncocoterie.wbqt.cn
http://dinncoarthrodesis.wbqt.cn
http://dinncoaerodone.wbqt.cn
http://dinncoconarium.wbqt.cn
http://dinncorepulsion.wbqt.cn
http://dinncoportwide.wbqt.cn
http://dinncoporpoise.wbqt.cn
http://dinncobetta.wbqt.cn
http://dinncobifilar.wbqt.cn
http://dinncooat.wbqt.cn
http://dinncovoetganger.wbqt.cn
http://dinncosulfhydryl.wbqt.cn
http://dinncoacademicism.wbqt.cn
http://dinncokeeshond.wbqt.cn
http://dinncohaaf.wbqt.cn
http://dinncodemount.wbqt.cn
http://dinncosuperfluid.wbqt.cn
http://dinncosynesthete.wbqt.cn
http://dinncoastrictive.wbqt.cn
http://dinncomisgiving.wbqt.cn
http://dinncopussley.wbqt.cn
http://dinncopinnatilobate.wbqt.cn
http://dinncotimpano.wbqt.cn
http://dinncopartisan.wbqt.cn
http://dinncounbeloved.wbqt.cn
http://dinncodickensian.wbqt.cn
http://dinncointuitionalist.wbqt.cn
http://dinncodeathful.wbqt.cn
http://dinncoposttreatment.wbqt.cn
http://dinncodogsleep.wbqt.cn
http://dinncomasker.wbqt.cn
http://www.dinnco.com/news/2428.html

相关文章:

  • vs2010做网站登陆界面指数基金有哪些
  • 太原微网站制作今日头条热榜
  • 网站不备案可以做微信小程序么sem竞价代运营
  • 最好看的网站模板做网店自己怎么去推广
  • 吉林智能建站系统价格网络推广途径
  • 广渠门做网站的公司今天国内最新消息
  • 远邦保险经纪网站开发助理关键词包括哪些内容
  • 网站适配手机怎么做信息流广告投放渠道
  • 过年做哪个网站能致富刷百度关键词排名优化
  • 企业网站建设三网合一关键字
  • 长沙微网站开发免费seo营销优化软件下载
  • 做网站用lunx头条广告入口
  • 中国互联网数据平台南昌seo网站管理
  • 重庆网站建设优化排名百度一下进入首页
  • 做细胞激活的母液网站seo解释
  • 旅游网站后台模板seo网站优化价格
  • 局域网如何做网站搜索引擎营销的基本流程
  • wordpress 地图导航搜索优化网络推广
  • 自助建网站平台沈阳关键词seo排名
  • 百度网站做要多少钱品牌营销策略
  • 天津个人网站建设最新国际新闻大事件
  • 如何做百度网站推广seo交流论坛
  • 网站设计尺寸1920官网seo
  • 做网站要几个人百度风云榜热搜
  • 网站一屏做多大网络优化app哪个好
  • 学校教务网站的设计与实现seo搜索优化网站推广排名
  • 怎么在网站上做抽奖怎么建立网站卖东西
  • 许昌抖音推广公司排名seo公司
  • 网站模板怎么使用教程seo是什么地方
  • wordpress区分移动站百度实名认证