[原创]elasticjob-lite-console与springmvc完美集成
背景
随着分布式调度项目ElasticJob正式迁入Apache仓库,越来越多的人开始使用ElasticJob,ElasticJob作为一个分布式调度解决方案,提供分布式任务的分片,弹性伸缩,全自动发现,基于时间驱动、数据驱动、常驻任务和临时任务的多任务类型,任务聚合和动态调配资源,故障检测、自动修复,失效转移和重试,完善的运维平台和管理工具,以及对云原生的良好支持等功能特性,可以全面满足企业对于任务管理和批量作业的全面调度处理能力。
Elastic-Job-Lite(https://github.com/apache/shardingsphere-elastic-job-lite)定位为轻量级无中心化解决方案,使用jar包的形式提供分布式任务的协调服务,外部依赖仅Zookeeper。备受个人企业的青睐。其运维平台Elastic-Job-Lite-Console在使用必不可少。本文总结针对elasticjob-lite-console运维平台的使用或集成主要由以下2种方式。本文以版本2.1.5为例说明
-
直接使用官网提供的方式,使用源码打包,生成elastic-job-lite-console-2.1.5.tar.gz。
解压elastic-job-lite-console-2.1.5.tar.gz ,
elastic-job-lite-console-2.1.5\bin目录下是启动脚本
elastic-job-lite-console-2.1.5\conf目前下是启动脚本,可以修改auth.properties中配置的默认用户名和密码
运行elastic-job-lite-console-2.1.5\bin下的start 脚本即可。
运行elastic-job-lite-console\bin\start.sh本质上是 启动了一个内嵌的jetty 容器。容器内部添加如下个filter、servlet。
GlobalConfigurationFilter:设置当前session 选中的zk注册中心信息。关于zk的配置都在xml (user.home/.elastic-job-console/Configurations.xml)
WwwAuthFilter:用户信息鉴权
DefaultServlet:主要加载页面静态资源如 图片字体css html 等
ServletContainer:jersey servlet,主要是rest请求,请求 /api 开头。对应的 /api 实现都在 elastic-job-lite-lifecycle中。主要是基于zk 的操作。
-
在自己的工程中,基于elastic-job-lite-lifecycle api实现进行调整,自己编写一套 rest接口。使用原来的页面 ,或自己搞一套管理页面。
这里重点介绍下本文的集成方式
由于公司项目中已有基于spring mvc 的工程,考虑工程太多不容器维护,另一方面考虑到权限的管控基于已有的系统进行管理,所以打算在现有的工程中直接集成运维平台(并不是说单独部署运维平台不好,每个人的情况不一样)。
集成思想:
请求统一交由springmvc 进行入口管理(包含原来的业务和运维平台的rest请求),然后springmvc 把前缀是 /api 的请求(即运维平台的ajax请求)内部转发中 jersey servlet 上(通过使用ServletWrappingController将jersey对应的servlet:com.sun.jersey.spi.container.servlet.ServletContainer (注:考虑到servletpath问题,这里使用的jersey servlet是org.codehaus.enunciate.modules.jersey.EnunciateJerseyServletContainer)包装为 springmvc Controller)。同时对应的静态资源也添加上映射。
最终效果,不修改原来源码一行代码,仅仅通过配置即可完成集成。
maven依赖:(注意排查 jetty相关的包)
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-lite-spring