本文主要分三部分,分别是:后台核心业务逻辑、桥梁辅助控制和前台显示页面。

本Web开发环境综合了多种工具,包括Maven包管理与编译工具、Dubbo分布式服务框架、MyBatis数据持久化工具、Linner页面管理工具和Handlebars Js模板引擎等前卫的开发工具。

首先介绍一下:后台核心业务逻辑搭建。

1. 后台核心业务逻辑搭建

后台核心业务逻辑大致分为三个层次:最底层的核心数据逻辑层(biz层),中间层Dubbo服务实现层(service-impl层)Dubbo服务接口层(service-client层)。此外还有公共的jar包管理父工程(parent工程)公共业务逻辑工程(common工程)任务调度工程(task工程)总的maven管理工程

示例如下图:

接下来我会按照搭建顺序简单介绍一下相关工程的配置:

基本的顺序是parent工程→biz工程→common工程→task工程→service-client工程→service-impl工程。

1.1 基本jar包管理和服务环境配置parent工程

parent工程结构如下图所示:

parent工程主要包括pom工程配置文件,filters文件下的三个开发环境配置文件和maven打包bat批处理命令文件。

首先介绍一下parent工程的pom文件:

(1)  不同的打包环境配置,使用不同的打包配置便利了项目整个开发,测试到生产流程的统一化管理。默认将开发环境激活,配置如下图所示:

(2)  编译时设置不对指定的资源文件进行替换。包括Freemarker模板文件ftl,静态-dynamic.xml文件,mybatis动态SQL Mapper文件。如下图:

(3)   工程编码和打包插件配置:包括工程编码插件Java版本1.7,生成javadoc插件,打包Java源码插件,导入eclipse工程插件等的配置。如下图所示:

(4)  单元测试覆盖率统计插件配置:

忽略对以下路径文件的单元测试覆盖率统计:action、webapp、interceptor、taglib、domain、model、dto和util/DataFormat.class。下图相应配置信息:

1.2  biz核心业务逻辑工程

       biz工程结构如下图所示:
       

按模块划分的动态SQLMapper文件:示例:SamStateInfoMapper.xml,如图1-21

序号①指定mybatis基本配置文件sqlMapConfig.xml的路径。

序号②指定动态SQL Mapper文件的路径。

序号③为基础的baseDAO Bean的声明。

a包类文件,主资源文件;测试Java包类文件,测试资源文件四大部分组成。

主Java包类文件的文件路径为com.ouc.mkhl.supplier,下按模块划分,示例中为jmx、security和util 3个模块。security模块又细分为advice包、dao数据访问对象包、domain包、model数据实体类包和service服务接口包,service服务接口包下包含impl服务接口实现包。

主资源文件包含email邮箱模板文件、logs日志配置文件、mybatis配置文件、spring相关配置文件。之后将对各配置文件做逐一介绍。

测试Java包类文件包含与主Java包相关的各单元测试文件。

测试资源文件包含springcache文件和mybatis数据持久层generator配置文件。

1)  biz工程的pom配置文件:如下图所示:

序号①为工程的父maven工程配置。

序号②为工程的继承和引用工程关系配置。

2)  biz工程主资源配置文件说明:

(1)  mybatis配置文件:首先介绍基本的SQLMap配置文:sqlMapConfig.xml

按模块划分的动态SQLMapper文件:示例:SamStateInfoMapper.xml,如下图

(2)  spring相关配置文件:

①   缓存cache配置文件:ehcache.xml,spring-cache-security.xml,spring-cache.xml。

②   jmx运行期系统管理配置文件:spring-jmx-mbean.xml。

③   按模块划分的自定义Bean声明配置文件:示例:spring-upload.xml

序号①为类似DAO的数据库接口操作类Bean。

序号②为服务接口Bean方法。

b为声明的切面,a为前置通知和后置通知要执行的方法。

④  公用操作的配置文件spring-common.xml。

序号①指定mybatis基本配置文件sqlMapConfig.xml的路径。

序号②指定动态SQL Mapper文件的路径。

序号③为基础的baseDAO Bean的声明。

⑤  spring配置工具配置:spring-config-toolkit.xml

⑥   数据源配置:spring-datasource.xml

⑦  Dubbo服务接口发布配置:spring-dubbo.xml

⑧   服务扩展接口配置:spring-external.xml

⑨   业务日志配置:spring-log.xml

⑩  Quartz监控配置:spring-monitor.xml

传输事物管理配置:spring-transaction.xml

 biz工程代码示例:

    a.Jmx运行期管理扩展服务:

用户暴露系统相关管理接口,以实现运行期调用:ExposeMethodInterface

运行期管理系统接口实现:Configuration

b.系统初始化:SystemBootstrap

  1. package com.ouc.mkhl.supplier.util;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.util.Properties;
  5. import mx4j.tools.adaptor.http.HttpAdaptor;
  6. import org.apache.commons.logging.Log;
  7. import org.apache.commons.logging.LogFactory;
  8. import org.springframework.beans.factory.InitializingBean;
  9. import org.springframework.core.env.AbstractEnvironment;
  10. import com.ouc.openplatform.SysException;
  11. import com.ouc.openplatform.console.audit.AuditInfoCollector;
  12. import com.ouc.openplatform.session.listener.MaxSessionUtil;
  13. import com.ouc.openplatform.util.Env;
  14. import com.ouc.openplatform.util.HOPConstant;
  15.  
  16. /**
  17. * @author WuPing
  18. */
  19. public class SystemBootstrap implements InitializingBean {
  20. /*
  21. * CONFIG_FILE_PATH 系统变量配置文件路径
  22. */
  23. private static final String CONFIG_FILE_PATH = "/env.properties";
  24. private static final Log LOG = LogFactory.getLog(SystemBootstrap.class);
  25. private HttpAdaptor httpAdaptor;
  26. public static void init() {
  27. InputStream inputStream = null;
  28. Properties properties = new Properties();
  29. try{
  30. inputStream SystemBootstrap.class.getResourceAsStream(CONFIG_FILE_PATH);
  31. properties.load(inputStream);
  32. LOG.info("系统配置项:"+properties);
  33. }catch (Exception e) {
  34. LOG.error("读取系统配置文件时发生错误:",e);
  35. throw new SysException(e);
  36. }finally{
  37. if(inputStream != null){
  38. try {
  39. inputStream.close();
  40. } catch (IOException e) {
  41. LOG.error("关闭文件输入流失败:",e);
  42. }
  43. }
  44. }
  45. Env.init(properties);
  46. AuditInfoCollector.setAppNM(Env.getProperty(Env.KEY_SERVER_NAME));
  47. HOPConstant.setAppName(Env.getProperty(Env.KEY_SERVER_NAME));
  48. //设置一些全局参数
  49. MaxSessionUtil.setMaxSessionKey(Env.getProperty(Env.KEY_SERVER_NAME)+"_MAX_SESSION_KEYS");
  50. //使用spring的profile
  51. System.setProperty(AbstractEnvironment.ACTIVE_PROFILES_PROPERTY_NAME, Env.getProperty(Env.ENV_TYPE));
  52. }
  53.  
  54. @Override
  55. public void afterPropertiesSet() throws Exception {
  56. httpAdaptor.start();
  57. }
  58.  
  59. public void setHttpAdaptor(HttpAdaptor httpAdaptor) {
  60. this.httpAdaptor = httpAdaptor;
  61. }
  62. }

c.DAO:SupplyUserDAO:

  1. package com.ouc.mkhl.supplier.security.dao;
  2. import java.util.List;
  3. import com.ouc.mkhl.supplier.security.model.SupplyUser;
  4. public interface SupplyUserDAO {
  5. public int deleteByPrimaryKey(String supplycode);
  6. public int insert(SupplyUser record);
  7. public SupplyUser selectByPrimaryKey(String supplycode);
  8. public int updateByPrimaryKey(SupplyUser record);
  9. public List<SupplyUser> selectAllSupplyUser();
  10. public SupplyUser selectByVCode(String supplycode);
  11. }

d. Model:SupplyUser

  1. package com.ouc.mkhl.supplier.security.model;
  2.  
  3. import java.io.Serializable;
  4.  
  5. public class SupplyUser implements Serializable{
  6.  
  7. private static final long serialVersionUID = -123120032141L;
  8.  
  9. private String supplycode;
  10.  
  11. private String supplypass;
  12.  
  13. private String supplyname;
  14.  
  15. public String getSupplycode() {
  16. return supplycode;
  17. }
  18.  
  19. public void setSupplycode(String supplycode) {
  20. this.supplycode = supplycode == null ? null : supplycode.trim();
  21. }
  22.  
  23. public String getSupplypass() {
  24. return supplypass;
  25. }
  26.  
  27. public void setSupplypass(String supplypass) {
  28. this.supplypass = supplypass == null ? null : supplypass.trim();
  29. }
  30.  
  31. public String getSupplyname() {
  32. return supplyname;
  33. }
  34.  
  35. public void setSupplyname(String supplyname) {
  36. this.supplyname = supplyname == null ? null : supplyname.trim();
  37. }
  38. }

1.3 service-client服务接口工程

service-client工程结构如图:

分为传输DTO包,辅助功能helper包,客户端服务接口声明service包和客户端工具类util包。

service-client示例代码:

a. DTO:SupplyUserDTO

  1. package com.ouc.mkhl.supplier.dto;
  2.  
  3. import java.io.Serializable;
  4.  
  5. import com.ouc.openapi.dubbo.governance.annotation.DubboField;
  6.  
  7. public class SupplyUserDTO implements Serializable{
  8.  
  9. private static final long serialVersionUID = -223120032141L;
  10.  
  11. @DubboField(description = "供应商V码")
  12. private String supplycode;
  13.  
  14. @DubboField(description = "供应商登录密码-未加密")
  15. private String supplypass;
  16.  
  17. @DubboField(description = "供应商全称")
  18. private String supplyname;
  19.  
  20. public String getSupplycode() {
  21. return supplycode;
  22. }
  23.  
  24. public void setSupplycode(String supplycode) {
  25. this.supplycode = supplycode == null ? null : supplycode.trim();
  26. }
  27.  
  28. public String getSupplypass() {
  29. return supplypass;
  30. }
  31.  
  32. public void setSupplypass(String supplypass) {
  33. this.supplypass = supplypass == null ? null : supplypass.trim();
  34. }
  35.  
  36. public String getSupplyname() {
  37. return supplyname;
  38. }
  39.  
  40. public void setSupplyname(String supplyname) {
  41. this.supplyname = supplyname == null ? null : supplyname.trim();
  42. }
  43. }
    b. 客户端服务接口service:SupplyUserServiceClient
  1. package com.ouc.mkhl.supplier.service;
  2.  
  3. import io.terminus.pampas.client.Export;
  4.  
  5. import com.ouc.openapi.dubbo.governance.annotation.DubboMethod;
  6. import com.ouc.openapi.dubbo.governance.annotation.DubboParam;
  7. import com.ouc.openapi.dubbo.governance.annotation.DubboService;
  8. import com.ouc.mkhl.supplier.dto.SupplyUserDTO;
  9.  
  10. import java.util.List;
  11.  
  12. /**
  13. * 供客户端调用的远程接口
  14. *
  15. * @author WuPing
  16. *
  17. */
  18. @DubboService(description = "供应商用户服务", displayName = "SupplyUser服务")
  19. public interface SupplyUserServiceClient {
  20.  
  21. // get请求
  22. // @return List<SupplyUserDTO>
  23. @Export(paramNames = {})
  24. @DubboMethod(description = "获取所有供应商用户信息", displayName = "getAllSupplyUsers", returnParamDes = "供应商用户DTO列表")
  25. public List<SupplyUserDTO> getAllSupplyUsers();
  26.  
  27. // 用户登录处理
  28. @Export(paramNames = { "username", "password" })
  29. @DubboMethod(description = "用户登录验证", displayName = "userLogin", returnParamDes = "验证结果")
  30. public String userLogin(
  31. @DubboParam(name = "username", description = "登录用户名", example = "V187") String username,
  32. @DubboParam(name = "password", description = "密码", example = "123456") String password);
  33.  
  34. }

1.4 service-impl服务接口具体实现功能工程

Service-impl工程结构如图:

该工程包括异常处理filter包和客户端服务接口具体实现impl包。主资源文件有客户端Dubbo接口发布基本配置文件spring-dubbo.xml和用户自定义服务配置文件spring-user-provider.xml。如下图所示:

序号①为代理平台分配的应用S码。

序号②为后台接口代理服务。

序号③为服务方法认证相关服务接口。

序号④为服务自动注册接口。

Service-impl示例代码:

    客户端接口实现Service-impl:SupplyUserServiceClientImpl
  1. package com.ouc.mkhl.supplier.service.impl;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. import javax.annotation.Resource;
  7. import javax.ws.rs.BeanParam;
  8. import javax.ws.rs.Consumes;
  9. import javax.ws.rs.DefaultValue;
  10. import javax.ws.rs.FormParam;
  11. import javax.ws.rs.GET;
  12. import javax.ws.rs.POST;
  13. import javax.ws.rs.Path;
  14. import javax.ws.rs.PathParam;
  15. import javax.ws.rs.Produces;
  16. import javax.ws.rs.QueryParam;
  17. import javax.ws.rs.core.MediaType;
  18.  
  19. import org.springframework.stereotype.Service;
  20.  
  21. import com.alibaba.dubbo.rpc.protocol.rest.support.ContentType;
  22. import com.ouc.openapi.dubbo.governance.annotation.DubboParam;
  23. import com.ouc.mkhl.supplier.dto.SupplyUserDTO;
  24. import com.ouc.mkhl.supplier.service.SupplyUserServiceClient;
  25. import com.ouc.mkhl.supplier.security.service.SupplyUserService;
  26. import com.ouc.mkhl.supplier.security.model.SupplyUser;
  27. import com.ouc.mkhl.supplier.helper.EncryptHelper;
  28.  
  29. @Path("supplyUser")
  30. @Consumes({ ContentType.APPLICATION_JSON_UTF_8, ContentType.TEXT_XML_UTF_8 })
  31. // 参数类型
  32. @Produces({ ContentType.APPLICATION_JSON_UTF_8, ContentType.TEXT_XML_UTF_8 })
  33. // 返回值类型
  34. @Service("supplyUserServiceClient")
  35. public class SupplyUserServiceClientImpl implements SupplyUserServiceClient {
  36.  
  37. @Resource
  38. private SupplyUserService supplyUserService;
  39.  
  40. public SupplyUserService getSupplyUserService() {
  41. return supplyUserService;
  42. }
  43. public void setSupplyUserService(SupplyUserService supplyUserService) {
  44. this.supplyUserService = supplyUserService;
  45. }
  46.  
  47. @GET
  48. @Path("getAllSupplyUser")
  49. @Override
  50. public List<SupplyUserDTO> getAllSupplyUsers() {
  51.  
  52. List<SupplyUserDTO> supplyUserDTOList = new ArrayList<SupplyUserDTO>();
  53.  
  54. List<SupplyUser> supplyUserList = supplyUserService.getAllSupplyUser();
  55. for (int i = 0; i < supplyUserList.size(); i++) {
  56. SupplyUserDTO tempSupplyUserDTO = new SupplyUserDTO();
  57. tempSupplyUserDTO.setSupplycode(supplyUserList.get(i)
  58. .getSupplycode());
  59. tempSupplyUserDTO.setSupplypass(supplyUserList.get(i)
  60. .getSupplypass());
  61. tempSupplyUserDTO.setSupplyname(supplyUserList.get(i)
  62. .getSupplyname());
  63. supplyUserDTOList.add(tempSupplyUserDTO);
  64. }
  65.  
  66. return supplyUserDTOList;
  67. }
  68.  
  69. @SuppressWarnings({ "unused" })
  70. @GET
  71. @Path("getUserByIdAndName")
  72. @Override
  73. public String userLogin(
  74. @DefaultValue("V187") @QueryParam("username") String username,
  75. @DefaultValue("123456") @QueryParam("password") String password) {
  76. System.out.println("当前登录用户:" + username);
  77. String md5Pass = ""; // MD5处理过的密码
  78.  
  79. // 设置登录反馈信息变量:1—成功;2—用户名不存在;3—密码无效登录失败。
  80. String msg = null;
  81.  
  82. EncryptHelper md5Helper = new EncryptHelper();
  83.  
  84. // 应用本地库
  85. SupplyUser suppUser = new SupplyUser();
  86.  
  87. try {
  88. suppUser = supplyUserService.getSupplyUserByVCode(username);
  89. } catch (Exception e) {
  90. suppUser = null;
  91. e.printStackTrace();
  92. }
  93.  
  94. if (suppUser == null) {
  95. suppUser = new SupplyUser();
  96. if (username.equals("suptest")){
  97. suppUser.setSupplycode("V187");
  98. suppUser.setSupplyname("供应商端测试");
  99. suppUser.setSupplypass("123456");
  100. }
  101. else if(username.equals("ouctest")) {
  102. suppUser.setSupplycode("ouctest");
  103. suppUser.setSupplyname("ouc端测试");
  104. suppUser.setSupplypass("123456");
  105. }
  106. } else {
  107. try {
  108. md5Pass = md5Helper.md5Encode(password).toUpperCase();
  109. } catch (Exception e) {
  110. // TODO Auto-generated catch block
  111. e.printStackTrace();
  112. }
  113. System.out.println("MD5后的密码:" + md5Pass);
  114. password = md5Pass;
  115. }
  116.  
  117. // 反馈信息设置
  118. if (suppUser == null) {
  119. msg = "2"; // 用户名不存在
  120. } else {
  121. if (suppUser.getSupplypass().equals(password)) {
  122. if (suppUser.getSupplycode().equals("haiertest")){
  123. //msg = "1"; //ouc端用户登录
  124. msg = "ouc"; //ouc端
  125. }
  126. else {
  127. //msg = "0"; //供应商端用户登录
  128. msg = suppUser.getSupplycode(); //供应商端V码
  129. }
  130. } else {
  131. msg = "3";// 密码无效
  132. }
  133. }
  134. return msg;
  135. }
  136.  
  137. }

1.5 task任务调度工程

      Task任务调度工程结构如图:
      
    示例中的为账号过期定期扫描作业AccountExpireJob。

配置文件示例spring-lts-job.xml:如图1-35所示。

序号①为设置作业执行周期。

2. 桥梁辅助控制

    桥梁工程结构如下图所示:
   

包括控制controller、辅助类domain、excel处理、环境配置过滤器filter、操作拦截器interceptor、辅助工具utils等。

资源文件有:spring接口和代理服务配置文件root-context.xml、网页servlet拦截器配置文件servlet-context.xml、redis配置文件redis-persistence-context.xml。  项目环境配置文件filter,网页web.xml配置文件。

1)  项目环境配置文件filter:dev.properties,如下图所示。

   dev.properties文件中:

序号①为项目环境类别说明。

序号②为日志配置。

序号③为项目验证url地址。

序号④为redis相关配置。

序号⑤为dubbo相关配置。

序号⑥为项目中央仓库地址配置。

序号⑦为集群平台terracotta配置。

★序号⑧为与页面工程相关的配置:

应用简称(app.name),服务器名称(server.name),与页面工程有关的服务Key(server.key),dubbo应用名(dubbo.application.name),页面工程路径(publicPathPrefix),浏览器访问域名(domain.name)和默认跳转页面(login.after.jump.url)。

序号⑨为项目集团内网和外网环境安全配置。

   

2)  Web.xml配置文件:

主要内容有配置系统启动监听器startupListeners,基于缓存实现的集群session配置和编码过滤等内容。

3. 前台页面工程

1) 页面工程结构如下.

典型的被linner管理的项目前端工程结构如下:

├─a: app ##app是开发者自开发代码的存储目录.
│ ├─a1: components ##存放项目的组件文件.
│ │ └─ dropdown ##示例组件(此处假设为dropdown).
│ │     └─ templates ##组件自身的前端模板.
│ │      ├─ view.coffee | view.js ##组件js,可以使coffee也可以是js.
│ │      ├─view.hbs ##组件模板
│  │      └─ view.scss | view.css  ##组件样式文件,可以是scss,也可以是css.
│ ├─ a3: images ##存放项目相关的图片文件.
│  │       └── logo.png
│ ├─ a5: scripts ##存放项目相关的JavaScript文件.
│ │       └── app.coffee
│ ├─ a6: styles ##存放项目相关的StyleSheet文件.
│ │       └── app.scss
│ ├─ a7: templates ##存放项目相关的前端模板文件.
│ │       └── welcome.hbs
│ ├─ a8: views ##用于存放项目相关的页面文件.
│ │       └──index.html
│ └─ a2: files ##用于存放相关配置文件,例如front_config.yaml等.
├─bin ##用户可基于此启动本地服务器(以当前文件夹为根),当然更好的选择是适用jigglepuff来启动一个带渲染逻辑的服务器.
│ └── server.
├─config.yml ##是整个项目的配置文件.
├─ b: public ##是项目执行linner build后生成的打包文件位置,是发布项目所需要的所有文件.
├── test ##测试前端项目的单元测试文件所在目录.
└─ c:  vendor ##存放引入的第三方代码组件,例如jQuery、Underscore等.

                    

2) 页面调用后台服务

  

 特别注意:配置文件对空格敏感,请谨慎编写。

3)   整个项目的配置文件config.yml。

4)  后端服务back_config.yaml配置:

5)  前端页面引用服务front_config.yaml配置:

6) 页面hbs示例:

组件类型调用服务示例

ajax类型服务调用方式

友情链接:

handlebars官网:http://handlebarsjs.com/

Node.js官网:https://nodejs.org/en/

CoffeeScript 中文网:http://coffee-script.org/#top

Redis中文官网:http://www.redis.cn/

附件

A.LTS轻任务调度框架介绍:

•   LTS框架概况:

LTS是一个轻任务调度框架,参考hadoop的部分思想。有三种角色, JobClient, JobTracker,TaskTracker。各个节点都是无状态的,可以部署多个,来实现负载均衡,实现更大的负载量, 并且框架具有很好的容错能力。 采用Zookeeper暴露节点信息,master选举。Mongo存储任务队列和任务执行日志, netty做底层通信。

▶ JobClient : 主要负责提交任务, 和接收任务执行反馈结果。

▶ JobTracker : 负责接收并分配任务,任务调度。

▶ TaskTracker: 负责执行任务,执行完反馈给JobTracker。

•   架构图:

•   节点组:

▶ 一个节点组等同于一个集群,同一个节点组中的各个节点是对等的,外界无论连接节点组中的任务一个节点都是可以的。

▶ 每个节点组中都有一个master节点,采用zookeeper进行master选举(master宕机,会自动选举出新的master节点),框架会提供接口API来监听master节点的变化,用户可以自己使用master节点做自己想做的事情。

▶ JobClient和TaskTracker都可以存在多个节点组。譬如JobClient 可以存在多个节点组。譬如:JobClient 节点组为‘QN_WEB’中的一个节点提交提交一个只有节点组为‘QN_TRADE’的TaskTracker 才能执行的任务。

▶ (每个集群中)JobTacker只有一个节点组。

▶ 多个JobClient节点组和多个TaskTracker节点组再加上一个JobTacker节点组, 组成一个大的集群。

•   工作流程:

▶ JobClient提交一个任务给 JobTracker, 这里我提供了两种客户端API, 一种是如果JobTracker 不存在或者提交失败,直接返回提交失败。另一种客户端是重试客户端, 如果提交失败,先存储文件,返回给客户端提交成功的信息,待JobTracker可用的时候,再将任务提交。

▶ JobTracker收到JobClient提交来的任务,先生成一个唯一的JobID。然后将任务储存在Mongo集群中。JobTracker 发现有(任务执行的)可用的TaskTracker节点(组)之后,将优先级最大,最先提交的任务分发给TaskTracker。这里JobTracker会优先分配给比较空闲的TaskTracker节点,达到负载均衡。

▶ TaskTracker收到JobTracker分发来的任务之后,执行。执行完毕之后,再反馈任务执行结果给JobTracker(成功or 失败[失败有失败错误信息]),如果发现JobTacker不可用,那么存储文件,等待TaskTracker可用的时候再反馈。反馈结果的同时,询问 JobTacker有没有新的任务要执行。

▶ JobTacker收到TaskTracker节点的任务结果信息,生成并插入(mongo)任务执行日志。根据任务信息决定要不要反馈给客户端。不需要反馈的直接删除, 需要反馈的(同样JobClient不可用存储文件,等待可用重发)。

▶ JobClient收到任务执行结果,进行自己想要的逻辑处理。

•   特性

▶ 负载均衡:

▷ JobClient和 TaskTracker会随机连接JobTracker节点组中的一个节点,实现JobTracker负载均衡。当连接上后,将一直保持连接这个节点,保持连接通道,知道这个节点不可用,减少每次都重新连接一个节点带来的性能开销。

▷ JobTracker分发任务时,是优先分配给最空间的一个TaskTracker节点,实现TaskTracker节点的负载均衡。

▶ 健壮性:

▷ 当节点组中的一个节点当机之后,自动转到其他节点工作。当整个节点组当机之后,将会采用存储文件的方式,待节点组可用的时候进行重发。

▷ 当执行任务的TaskTracker节点当机之后,JobTracker会将这个TaskTracker上的未完成的任务(死任务),重新分配给节点组中其他节点执行。

▶ 伸缩性:

因为各个节点都是无状态的,可以动态增加机器部署实例, 节点关注者会自动发现。

•   调用示例

安装 zookeeper 和 mongo , 执行 data/mongo目录下的 mongo.md 中的语句见 job-example 这里给出的是java API(设置配置)方式启动,也可以使用配置文件中。

▶ JobTracker端

▶ JobClient端

▶ TaskTracker端

Spring+Maven+Dubbo+MyBatis+Linner+Handlebars—Web开发环境搭建的更多相关文章

  1. Web开发环境搭建 Eclipse-Java EE 篇

    Web开发环境搭建 Eclipse-Java EE 篇 [原创内容,转载注名出处] 1. 下载和安装 1.1 下载JDK 在Java官方网站下载最新版本的 Java SE:  http://www.o ...

  2. 《Node.js入门》CentOS 6.5下Node.js Web开发环境搭建笔记

    近期想尝试一下英特尔的基于WebRTC协同通信开发套件,所以须要在本地搭建Node.js Web的开发測试环境. 这里讲的是CentOS 下的搭建方法.使用Windows的小伙伴请參考: <No ...

  3. 记录一下Web开发环境搭建 Eclipse-Java EE 篇

    转自https://www.cnblogs.com/yangyxd/articles/5615965.html Web开发环境搭建 Eclipse-Java EE 篇 [原创内容,转载注名出处] 1. ...

  4. Spring.DM web开发环境搭建

    作为一个初学者来说,搭建好Spring.DM 的web开发环境还是有些麻烦的.我就遇到了N多麻烦,走了很多弯路.本文介绍了2种比较简单的搭建Spring.DM OSGi web开发环境的搭建.   第 ...

  5. 1.mybatis实战教程mybatis in action之一开发环境搭建

    转自:https://www.cnblogs.com/shanheyongmu/p/5652471.html 什么是mybatis MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框 ...

  6. ubuntu的web开发环境搭建

    为了保持mac的干净整洁,决定用PD搭建一条web开发环境,记下整个过程. ubuntu 首先是操作系统,本着习惯就好的原则,选用了Ubuntu server 12.04.4版.系统的安装很简单,ht ...

  7. OSGI的WEB开发环境搭建

    第一步,搭建OSGI环境: 打开eclipse,点击run->run configration..,配置如下,点击run. 运行结果如下图所示:说明OSGI环境搭建完毕. 第二步:搭建基于OSG ...

  8. 如何学习web开发环境搭建和脚手架

    Web前端的学习路线 第一阶段: HTML+CSS: HTML进阶.CSS进阶.div+css布局.HTML+css整站开发. JavaScript基础: Js基础教程.js内置对象常用方法.常见DO ...

  9. JAVA WEB开发环境搭建

    JAVA WED开发环境搭建 JDK的安装和配置 到https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-21 ...

随机推荐

  1. HDU 1069 dp最长递增子序列

    B - Monkey and Banana Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I6 ...

  2. POJ 3281 网络流dinic算法

    B - Dining Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit S ...

  3. 服务器设置SSH 长连接

    1.echo $TMOUT 如果显示空白,表示没有设置, 等于使用默认值0, 一般情况下应该是不超时. 如果大于0, 可以在如/etc/profile之类文件中设置它为0. 2.修改/etc/ssh/ ...

  4. 4.7---最近公共祖先(CC150)

    import java.util.*; public class LCA { public static int getLCA(int a, int b){ if(a < 1 || b < ...

  5. 如何发布及部署asp.net网站

    用vs开发完asp.net网站之后如何发布到服务器上去变成正式网站? 1.发布首先需要发布网站,这个步骤就是生成正式网站的目录(把源代码编译成.cs代码文件编译成.dll文件)详细步骤:http:// ...

  6. 手动fsck修复

    [转自]http://blog.chinaunix.net/uid-26719405-id-3781541.html 由于硬盘常年读写,系统会造成系统文件损坏,导致重启后无法登陆到系统, fsck不仅 ...

  7. zju3545

    AC自动机+状态压缩DP 注意:相同的串可能出现多次,如果匹配成功则将各次权值加和. #include <cstdio> #include <queue> #include & ...

  8. 常见web错误码 404 500

    404表示文件或资源未找到java WEB常见的错误代码1.1xx-信息提示:这些状态代码表示临时的响应.客户端在收到常规响应之前,应准备接收一个或多个1xx响应.100-继续.101-切换协议.2. ...

  9. 基于Maven构建开发第一个Storm项目

    前面说过了Storm的测试项目,那么此时我们更想自己写一个小项目来练练手,首先我们自己的Windows系统上首先应该安装好maven,然后启动Eclipse for JavaEE版本,接下来开始建立项 ...

  10. 针对跑MySQL的Linux优化【转】

    本文来自:http://www.mysqlsupport.cn/linux-performance-tuning-tips-mysql/ 因为很多MySQL的生产环境都在Linux下,我决定指出一些L ...