以下是一个中小项目后端开发方案的大致框架,具体内容根据实际项目需求可能会有所不同:
—
项目名称: [项目名称]
一、项目背景与目标
1.1 项目概述:[简述项目的核心业务和功能]
1.2 项目目标:[明确项目的主要目标,如性能、稳定性、可扩展性等]
二、技术选型
2.1 后端开发语言:[如Java、Python、Node.js等]
2.2 框架:[如Spring Boot、Django、Express等]
2.3 数据库:[如MySQL、MongoDB、Oracle等]
2.4 其他技术:[如API接口设计、缓存、消息队列等]
三、系统架构设计
3.1 前后端分离架构:[描述前后端的交互方式]
3.2 模块划分:[按功能或业务逻辑划分模块,并描述每个模块的职责]
3.3 数据库设计:[描述数据库表结构,索引设计等]
四、开发计划与流程
4.1 需求分析:[详细列出需求分析的步骤和方法]
4.2 设计阶段:[包括数据库设计、接口设计、模块设计等]
4.3 编码阶段:[采用敏捷开发,如Scrum或KaNBAn方法]
4.4 测试阶段:[包括单元测试、集成测试、系统测试等]
4.5 部署上线:[描述部署流程和环境配置]
五、性能优化与安全措施
5.1 性能优化:[描述如何提高系统的响应速度,如缓存策略、数据库优化等]
5.2 安全措施:[如数据加密、身份验证、防止SQL注入等]
六、项目管理与团队协作
6.1 项目管理工具:[如Jira、Trello等]
6.2 团队协作:[描述团队如何分工合作,如代码审查、版本控制等]
七、风险评估与应对策略
7.1 风险分析:[列出可能遇到的技术、时间、成本等风险]
7.2 应对策略:[针对每个风险提出具体的应对措施]
八、项目验收与后期维护
8.1 验收标准:[明确项目完成的验收标准]
8.2 后期维护:[描述项目的维护计划和策略]
—
这只是一个基本的框架,实际编写时需要根据项目的特点和需求进行详细填充。同时,每个部分的内容都需要详细的文档支持,以确保项目的顺利进行。
DSM出码模块采用了独立的模板架构,除了可以以OneCode形式存在,还可以支持独立的出码模块定制独立的第三方语言模型输出。
传统低代码平台基本上都是完全建立在JS的模型下,在初期建模时结构还算清晰但经过稍有点复杂的逻辑,构建时代码的冗余度以及结构就会变得混乱,特别是页跨页面操作或者完成前后台数据交互时。由于其脚本语言的特点无法完成实时校验,只能运行期测试才能发现问题。采用低代码构建的页面往往只是由于页面中做了一些简单的组件增删或者属性样式就该就会造成不可预期的结果,这大大降低了代码的可维护度。OneCode所构建的领域模型则很好的解决了这一问题,在前后端任意模型发生变化时即可调用混合编译,将页面间的连接关系以及前后台的数据关系进行校验通知。在预编译中提升整体的编译能力。
通过不同方式完成的DSM模型,可以通过OneCode 在视图、Code 、以及Module 三种方式之间自由切换,利用相关工具完成仿真调试以及部署运行。
中小项目后端开发方案范文
OneCode除了在前端实现了标准化组件定义外,还额外提供了后端建模的工具DSM,并通过领域模型将二者打通。这样在前端组件建模时便可以直接调用后端服务模型完成数据部分API构建。而DSM模型工具也可以在后端建模时直接读取前端组件属性,打通前端动作与后端服务的通讯能力。
在代码工具中为方便大家不同技术栈的接入陕西农村创业优惠政策最新,OneCode 也开放了自定义模板的管理和构建功能,方便大家自主进行代码结构设计。
为方便大家熟悉OneCode 基础语法,OneCode平台组件中还内置了一款,在线的OneCode代码编辑器,开发者可以方便的直接在线编辑编译OneCode代码。
OneCode 本身基于JAVA语言体系,是在Java Spring 注解基础上的一套扩展子集,混合编译引擎器通过扩展注解构建完整的Domain模型,通过读取标准Spring 注解完成普通Web数据交付及调度过程,通过Domain域模型动态渲染JS文件输出为JSON交付给前端引擎构建页面。
OneCode由三块自成体系的可独立部署运行的部分组成。前端引擎负责界面建模并按低代码协议协议生成标准JSON,中后台OneCode通过读取标准JSON协议,完成后端的视图建模,合并DSM后端服务建模系统,完成完整的后端服务建模应用,通过代码工程完成前后端一体的出码应用。JDSCloud是OneCode的协同支撑系统,除了常规的资源代码空间管理外,提供了独立的沙箱运行环境。为OneCode 提供工程化的仿真版本Ops等服务。
在这样的背景下,CodeBee面向软件开发团队推出了基于OneCode的集成开发方案。本文主要针对OneCode 的开发编译原理以及基础工具使用做说明。在后续的章节中将根据具体的示例以及部署管理等多个方面展开描述。
一个全新的“低码时代”呼之欲出,但这一切对于正处在风口浪尖上的传统软件行业而言却无疑是一种煎熬。更换赛道追跑“低代码”对于长期以业务定制开发为主导的中小型行业软件公司而言,其薄弱的技术积累成为了自主研发最大的屏障。集成和开源二次开发成为了传统软件行业紧跟时代的唯一选择,低代码领域开源领域虽然不乏类似于阿里“LowCodeEngin”百度“amis”等一些优秀开源框架,但多数更多的侧重在纯前端展现,而这些前端技术本身在学习难度以及其冗长的工具链条使得其集成和嵌入变得极其复杂。
最后,需要提醒的是,本文提到的实践方式只是一个参考,一方面依然存在考虑不周的地方,另一方面示例项目中用到的技术工具还存在其他替代方案,请根据自己项目的实际情况进行取舍。
没错,的确没有什么难的东西,但是要系统性地搭建好后端项目的基础框架却不见得是每个开发团队都已经做到的事情,而这恰恰是本文的目的。
本文通过一个示例项目谈及到了项目之初开发者搭建后端工程的诸多方面,其中的绝大多数实践均在笔者的项目中真实落地。读完本文之后你可能会发现,文中的很多内容都是很基础很简单的。
source.registerCorsConfiguration(“/**”, configuration);
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
configuration.setAllowedMethods(Arrays.asList(“GET”,”POST”));
CorsConfiguration configuration = new CorsConfiguration();
// by default uses a Bean by the name of corsConfigurationSource
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
对于使用Spring Security的项目,需要保证CORS工作于Spring Security的过滤器之前,为此Spring Security专门提供了相应配置:
public void addCorsMappings(CorsRegistry registry) {
在前后端分离的系统中,前端单独部署,有时连域名都和后端不同,此时需要进行跨域处理。传统的做法可以通过JSONP,但这是一种比较“trick”的做法,当前更通用的实践是采用CORS机制,在Spring Boot项目中,启用CORS配置如下:
在软件的开发流程中,我们需要将软件部署到多个环境,经过多轮验证后才能最终上线。在不同的阶段中,软件的运行态可能是不一样的,比如本地开发时可能将所依赖的第三方系统stub掉;持续集成构建时可能使用的是测试用的内存数据库等等。为此,本文的示例项目推荐采用以下环境:
迁移脚本的命名需要遵循一定的规则以保证脚本执行顺序,另外迁移文件生效之后不要任意修改,因为Flyway会检查文件的checksum,如果checksum不一致将导致迁移失败。
另外,在微服务场景下,数据库被包含在单个服务的边界之内,因此基于内聚性原则(咦,这好像是本文第三次提到内聚原则了,可见其在软件开发中的重要性),数据库的变更最好也与项目代码一道维护在代码库中。
在传统的开发模式中,数据库由专门的运维团队或者DBA来维护,要对数据库进行修改需要向DBA申请,告之迁移内容,最后由DBA负责数据库变更实施。在持续交付和DevOps运动中,这些工作逐步提前到开发过程,当然并不是说不需要DBA了,而是这些工作可以由开发者和运维人员一同完成。
软件文档的难点不在于写,而在于维护。多少次,当我对照着项目文档一步一步往下走时,总得不到正确的结果,问了同事之后得到回复“哦,那个已经过时了”。本文示例项目所采用的Swagger在一定程度上降低了API维护的成本,因为Swagger能自动识别代码中的方法参数、返回对象和URL等信息,然后自动地实时地创建出API文档。
以上接口在示例项目中用了一个简单的Controller实现,事实上Spring Boot的Acuator框架也能够提供相似的功能。
此时,可以实现一个简单的API接口,该接口不受权限管控,可以公开访问。如果该接口返回HTTP的200状态码,便可初步认为程序运行正常。此外,我们还可以在该API中加入一些额外的信息,比如提交版本号、构建时间、部署时间等。
除了Checkstyle统一代码格式之外,项目中有些通用的公共的编码实践方式也需要在整个开发团队中进行统一,包括但不限于以下方面:
本文的示例项目使用了基于JDBC的分布式锁,事实上任何提供原子操作的机制都可用于分布式锁,Shedlock还提供基于Redis、ZooKeeper和Hazelcast等的分布式锁实现机制。
new LockConfiguration(“key”, Instant.now().plusSeconds(60)));
throw new LockAlreadyOccupiedException(configuration.getName());
Optional
public
public DistributedLockExecutor(LockProvider lockProvider) {
为了支持代码直接调用分布式锁,基于Shedlock的LockProvider创建DistributedLockExecutor:
public DistributedLockExecutor distributedLockExecutor(LockProvider lockProvider) {
public LockProvider lockProvider(DataSource dataSource) {
executor.setTaskDecorator(new LogbackMdcTaskDecorator());
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
taskRegistrar.setScheduler(newScheduledThreadPool(10));
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
public class SchedulingConfiguration implements SchedulingConfigurer {
除了即时完成客户端的请求外,系统中通常会有一些定时性的例行任务,比如定期地向用户发送邮件或者运行数据报表等;另外,有时从设计上我们会对请求进行异步化处理。此时,我们需要搭建后台任务相关基础设施。Spring原生提供了任务处理(TaskExecutor)和任务计划(TaskSchedulor)机制;而在分布式场景下,还需要引入分布式锁来解决并发冲突,为此我们引入一个轻量级的分布式锁框架ShedLock。
public abstract class AppException extends RuntimeException {
层级式异常的好处是能够显式化异常含义,但是如果层级设计不好可能导致整个程序中充斥着大量的异常类;单一式的好处是简单,而其缺点在于表意性不够。
异常处理通常有两种形式,一种是层级式的,即每种具体的异常都对应了一个异常类,这些类最终继承自某个父异常;另一种是单一式的,即整个程序中只有一个异常类,再以一个字段来区分不同的异常场景。
2、集中式日志管理,在多节点部署的场景下,各个节点的日志是分散的,为此可以引入诸如ELK之类的工具将日志统一输出到ElasticSearch中。本文的示例项目使用了RedisAppender将日志输出到Logstash:
HttpServletResponse response,
protected void doFilterInternal(HttpServletRequest request,
1、在日志中加入请求标识农村打工创业机器图片,便于链路追踪。在处理一个请求的过程中有时会输出多条日志,如果每条日志都共享统一的请求ID,那么在日志追踪时会更加方便。此时,可以使用Logback原生提供的MDC(Mapped Diagnostic Context)功能,创建一个RequestIdMdcFilter:
runtimeClasspath += sourceSets.main.output + sourceSets.test.output
runtimeClasspath += sourceSets.main.output + sourceSets.test.output
Gradle在默认情况下只提供src/test/java目录用于测试,对于以上3种类型的测试,我们需要将它们分开以便于管理(也是职责分离的体现)。为此,可以通过Gradle提供的SourceSets对测试代码进行分类:
再者,程序中有些重要的组件性代码,比如访问数据库的Repository或者分布式锁,使用单元测试实际上“测不到点上”,而使用API测试又显得在分类逻辑上不合理,为此我们可以专门创建一种测试类型谓之组件测试。
此外,程序中有些框架性代码,要么是诸如Controller之类的技术性框架代码,要么是基于某种架构风格的代码(比如DDD实践中的ApplicationService),这些代码一方面并不包含业务逻辑,一方面是很薄的一个抽象层(即实现相对简单),用单元测试来覆盖显得没有必要,因此笔者的观点是可以不为此编写单独的单元测试。
专题:
农村轻创业
2农村创业
去农村创业