2021-10-04-2021SC@SDUSC---DolphinScheduler(2)

2021SC@SDUSC
10-04

模块-dolphinsched

API接口层,主要负责处理前端UI层的请求。
该服务统一提供RESTful api向外部提供请求服务。 
接口包括:工作流的创建、定义、查询、修改、发布、下线、
手工启动、停止、暂停、恢复、从该节点开始执行等等。

启动API

org.apache.dolphinscheduler.api下面有两个类:
ApiApplicationServer、CombinedApplicationServer。

从ApiApplicationServer来看就是启动一个SpringBoot应用。

CombinedApplicationServer除了启动一个SprintBoot应用之外,
还启动了LoggerServer、AlertServer。
@SpringBootApplication
@ConditionalOnProperty(prefix = "server", name = "is-combined-server", havingValue = "true")
@ServletComponentScan
@ComponentScan("org.apache.dolphinscheduler")
@Import({MasterServer.class, WorkerServer.class})
@EnableSwagger2
public class CombinedApplicationServer extends SpringBootServletInitializer {

    public static void main(String[] args) throws Exception {

        ApiApplicationServer.main(args);

        LoggerServer server = new LoggerServer();
        server.start();

        AlertServer alertServer = AlertServer.getInstance();
        alertServer.start();
    }
}

CombinedApplicationServer与ApiApplicationServer的区别:是否内嵌LoggerServer、AlertServer。
而且当server.is-combined-server为true时,会自动启动CombinedApplicationServer。

对于SpringBoot应用,接口一般都在controller中。
org.apache.dolphinscheduler.api.controller包有多个Controller: 
AccessTokenController ProcessInstanceController 
AlertGroupController DataAnalysisController
ProjectController BaseController QueueController 
ResourcesController DataSourceController 
SchedulerController ExecutorController 
TaskInstanceController LoggerController 
TaskRecordController LoginController 
TenantController MonitorController UsersController 
ProcessDefinitionController WorkerGroupController

因为在DolphinScheduler调度中最重要的一个概念就是流程定义,
所以我们从ProcessDefinitionController入手简要分析这个模块的基本功能。

ProcessDefinitionController

batchDeletateProcessDefinitionByIds
DeletateProcessDefinitionByIds
exportProcessDefinitionByIds
getNodeListByDefinitionlistId
getNodeListByDefinitionlistIdList
queryProcessDefinitionList
queryProcessDefinitionListPaging
queryProcessDefinitionAllByProjectId
releaseProcessDefinition
save
queryProcessDefinitionById
updateProcessDefinition
verify-name
viewTree

可以看到org.apache.dolphinscheduler.api.controller.ProcessDefinitionController大概有14个接口。

ProcessDefinitionController中只有一个字段ProcessDefinitionService,从名称以及自身经验来看,可以知道ProcessDefinitionController会负责HTTP请求的参数解析、参数校验、返回值等等,与业务无关的逻辑;具体的业务逻辑会交给ProcessDefinitionService类处理。

由此我们可以类比分析其他所有的controller,都会有一个对应的service处理业务相关的逻辑。

public Result createProcessDefinition(@ApiIgnore @RequestAttribute(value = Constants.SESSION_USER) User loginUser,
                                  @ApiParam(name = "projectName", value = "PROJECT_NAME", required = true) @PathVariable String projectName,
                                  @RequestParam(value = "name", required = true) String name,
                                  @RequestParam(value = "processDefinitionJson", required = true) String json,
                                  @RequestParam(value = "locations", required = true) String locations,
                                  @RequestParam(value = "connects", required = true) String connects,
                                  @RequestParam(value = "description", required = false) String description) {

    try {
        logger.info("login user {}, create  process definition, project name: {}, process definition name: {}, " +
                        "process_definition_json: {}, desc: {} locations:{}, connects:{}",
                loginUser.getUserName(), projectName, name, json, description, locations, connects);
        Map<String, Object> result = processDefinitionService.createProcessDefinition(loginUser, projectName, name, json,
                description, locations, connects);
        return returnDataList(result);
    } catch (Exception e) {
        logger.error(Status.CREATE_PROCESS_DEFINITION.getMsg(), e);
        return error(Status.CREATE_PROCESS_DEFINITION.getCode(), Status.CREATE_PROCESS_DEFINITION.getMsg());
    }
}

上面是createProcessDefinition的源码,逻辑比较清晰,就是接收、校验HTTP的参数,然后调用processDefinitionService.createProcessDefinition函数,返回结果、处理异常。

但这段代码有一个controller与service分隔不清的地方:
HTTP返回的结果由谁处理。
此处返回结果是由service负责的,
service会创建一个Map<String, Object>类型的result字段,
再调用result.put("processDefinitionId",processDefine.getId());
设置最终返回的数据。
严格来说,service只返回与业务相关的实体,
HTTP具体返回什么信息应该交由controller处理。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奋斗的仓鼠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值