Browse Source

加入编码生成服务CodeService

wuxw7 7 years ago
parent
commit
1ff0dcac71
39 changed files with 1251 additions and 146 deletions
  1. 1 1
      CenterService/src/main/java/com/java110/center/api/HttpApi.java
  2. 6 0
      CodeService/doc/IdRequest_protocol.json
  3. 7 0
      CodeService/doc/IdResponse_protocol.json
  4. 5 1
      CommonService/pom.xml
  5. 130 0
      CodeService/src/main/java/com/java110/CodeServiceApplicationStart.java
  6. 88 0
      CodeService/src/main/java/com/java110/code/api/CodeApi.java
  7. 1 1
      CommonService/src/main/java/com/java110/base/dao/ICommonServiceDao.java
  8. 1 1
      CommonService/src/main/java/com/java110/base/dao/IPrimaryKeyServiceDao.java
  9. 14 0
      CodeService/src/main/java/com/java110/code/dao/ISnowflakeldWorker.java
  10. 2 3
      CommonService/src/main/java/com/java110/base/dao/impl/CommonServiceDaoImpl.java
  11. 2 7
      CommonService/src/main/java/com/java110/base/dao/impl/PrimaryKeyServiceDaoImpl.java
  12. 183 0
      CodeService/src/main/java/com/java110/code/dao/impl/SnowflakeIdWorkerImpl.java
  13. 2 2
      CommonService/src/main/java/com/java110/base/rest/CommonServiceRest.java
  14. 2 2
      CommonService/src/main/java/com/java110/base/rest/PrimaryKeyServiceRest.java
  15. 1 1
      CommonService/src/main/java/com/java110/base/rest/ServiceConfigServiceRest.java
  16. 1 1
      CommonService/src/main/java/com/java110/base/smo/ICommonServiceSmo.java
  17. 10 1
      CommonService/src/main/java/com/java110/base/smo/IPrimaryKeyServiceSMO.java
  18. 3 3
      CommonService/src/main/java/com/java110/base/smo/impl/CommonServiceSmoImpl.java
  19. 77 0
      CodeService/src/main/java/com/java110/code/smo/impl/PrimaryKeyServiceSMOImpl.java
  20. 92 0
      CodeService/src/main/resources/application-dev.yml
  21. 92 0
      CodeService/src/main/resources/application-prod.yml
  22. 92 0
      CodeService/src/main/resources/application-test.yml
  23. 3 0
      CodeService/src/main/resources/application.yml
  24. 0 0
      CodeService/src/main/resources/banner.txt
  25. 0 0
      CodeService/src/test/java/com/java110/AppTest.java
  26. 0 27
      CommonService/src/main/java/com/java110/AppSpringBootApplication.java
  27. 0 48
      CommonService/src/main/java/com/java110/base/smo/impl/PrimaryKeyServiceSMOImpl.java
  28. 0 46
      CommonService/src/main/resources/application.yml
  29. 189 0
      java110-common/src/main/java/com/java110/common/exception/StartException.java
  30. 10 0
      java110-common/src/main/java/com/java110/common/factory/ApplicationContextFactory.java
  31. 18 0
      java110-common/src/main/java/com/java110/common/util/Assert.java
  32. 56 0
      java110-config/src/main/java/com/java110/config/properties/code/ZookeeperProperties.java
  33. 4 0
      java110-config/src/main/resources/config/code/zookeeper.properties
  34. 4 0
      java110-core/src/main/java/com/java110/core/base/controller/BaseController.java
  35. 1 0
      java110-core/src/main/java/com/java110/core/context/AbstractDataFlowContext.java
  36. 79 0
      java110-core/src/main/java/com/java110/core/context/CodeDataFlow.java
  37. 20 0
      java110-core/src/main/java/com/java110/core/factory/DataTransactionFactory.java
  38. 48 0
      java110-service/src/main/java/com/java110/service/init/ServiceInfoListener.java
  39. 7 1
      pom.xml

+ 1 - 1
CenterService/src/main/java/com/java110/center/api/HttpApi.java

@@ -108,7 +108,7 @@ public class HttpApi extends BaseController {
      * @param headers
      * @throws RuntimeException
      */
-    private void getRequestInfo(HttpServletRequest request,Map headers) throws RuntimeException{
+    private void getRequestInfo(HttpServletRequest request,Map headers) throws Exception{
         try{
             super.initHeadParam(request,headers);
             super.initUrlParam(request,headers);

+ 6 - 0
CodeService/doc/IdRequest_protocol.json

@@ -0,0 +1,6 @@
+{
+    "transactionId": "100000000020180409224736000001",
+    "requestTime": "20180409224736",
+    "prefix": "71",
+    "name": "订单ID生成"
+}

+ 7 - 0
CodeService/doc/IdResponse_protocol.json

@@ -0,0 +1,7 @@
+{
+    "transactionId": "100000000020180409224736000001",
+    "responseTime": "20180409224736",
+    "id": "71009183837738",
+    "code":"0000",
+    "message": "订单ID生成"
+}

+ 5 - 1
CommonService/pom.xml

@@ -7,7 +7,7 @@
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>CommonService</artifactId>
+    <artifactId>CodeService</artifactId>
     <packaging>jar</packaging>
 
     <name>CommonService</name>
@@ -22,6 +22,10 @@
             <groupId>com.java110</groupId>
             <artifactId>java110-service</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.zookeeper</groupId>
+            <artifactId>zookeeper</artifactId>
+        </dependency>
     </dependencies>
 
     <build>

+ 130 - 0
CodeService/src/main/java/com/java110/CodeServiceApplicationStart.java

@@ -0,0 +1,130 @@
+package com.java110;
+
+/**
+ * Hello world!
+ */
+
+import com.java110.common.constant.ResponseConstant;
+import com.java110.common.exception.StartException;
+import com.java110.common.factory.ApplicationContextFactory;
+import com.java110.common.util.Assert;
+import com.java110.common.util.DateUtil;
+import com.java110.common.util.StringUtil;
+import com.java110.config.properties.code.ZookeeperProperties;
+import com.java110.service.init.ServiceInfoListener;
+import com.java110.service.init.ServiceStartInit;
+import org.apache.zookeeper.*;
+import org.apache.zookeeper.data.Stat;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.context.ApplicationContext;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.List;
+
+/**
+ * spring boot 初始化启动类
+ *
+ * @version v0.1
+ * @auther com.java110.wuxw
+ * @mail 928255095@qq.com
+ * @date 2016年8月6日
+ * @tag
+ */
+@SpringBootApplication(scanBasePackages = {"com.java110.service","com.java110.code","com.java110.core","com.java110.cache",
+"com.java110.config.properties.code"})
+@EnableDiscoveryClient
+public class CodeServiceApplicationStart {
+
+    public static void main(String[] args) throws Exception {
+
+        ApplicationContext context =  SpringApplication.run(CodeServiceApplicationStart.class, args);
+
+        ServiceStartInit.initSystemConfig(context);
+
+        //加载workId
+        loadWorkId();
+
+    }
+
+
+    /**
+     * 加载 workId
+     */
+    public static void loadWorkId() throws StartException{
+        ZookeeperProperties zookeeperProperties =  ApplicationContextFactory.getBean("zookeeperProperties",ZookeeperProperties.class);
+
+        if(zookeeperProperties == null){
+            throw new StartException(ResponseConstant.RESULT_CODE_ERROR,"系统启动失败,未加载zookeeper 配置信息");
+        }
+
+        String host = null;
+        try {
+            host = InetAddress.getLocalHost().getHostAddress();
+        } catch (UnknownHostException e) {
+            throw new StartException(ResponseConstant.RESULT_CODE_ERROR,"系统启动失败,获取host失败"+e);
+        }
+
+        ServiceInfoListener serviceInfoListener =  ApplicationContextFactory.getBean("serviceInfoListener",ServiceInfoListener.class);
+
+        if(serviceInfoListener == null){
+            throw new StartException(ResponseConstant.RESULT_CODE_ERROR,"系统启动失败,获取服务监听端口失败");
+        }
+
+        serviceInfoListener.setServiceHost(host);
+
+        try {
+            ZooKeeper zooKeeper = new ZooKeeper(zookeeperProperties.getZookeeperConnectString(), zookeeperProperties.getTimeOut(), new Watcher() {
+
+                @Override
+                public void process(WatchedEvent watchedEvent) {
+
+                }
+            });
+
+
+
+            Stat stat = zooKeeper.exists(zookeeperProperties.getWorkDir(),true);
+
+            if(stat == null){
+                zooKeeper.create(zookeeperProperties.getWorkDir(), "".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,
+                        CreateMode.PERSISTENT);
+            }
+            String workDir = "";
+            List<String> workDirs = zooKeeper.getChildren(zookeeperProperties.getWorkDir(),true);
+
+            if(workDirs != null && workDirs.size() > 0) {
+                for(String workDirTemp : workDirs){
+                    if(workDirTemp.startsWith(serviceInfoListener.getHostPort())){
+                        workDir = workDirTemp;
+                        break;
+                    }
+                }
+            }
+            if(StringUtil.isNullOrNone(workDir)) {
+                workDir = zooKeeper.create(zookeeperProperties.getWorkDir() + "/" + serviceInfoListener.getHostPort(), "".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,
+                        CreateMode.PERSISTENT_SEQUENTIAL);
+            }
+
+            String[] pathTokens = workDir.split("/");
+            if (  pathTokens.length > 0
+                    && pathTokens[pathTokens.length -1].contains("-")
+                    && pathTokens[pathTokens.length -1].contains(":"))
+            {
+                String workId = pathTokens[pathTokens.length -1].substring(pathTokens[pathTokens.length -1].indexOf("-")+1);
+                serviceInfoListener.setWorkId(Long.parseLong(workId));
+            }
+
+            Assert.hasLength(serviceInfoListener.getWorkId()+"","系统中加载workId 失败");
+        }catch (Exception e){
+            e.printStackTrace();
+            throw new StartException(ResponseConstant.RESULT_CODE_ERROR,"系统启动失败,链接zookeeper失败"+zookeeperProperties.getZookeeperConnectString());
+        }
+
+
+
+
+    }
+}

+ 88 - 0
CodeService/src/main/java/com/java110/code/api/CodeApi.java

@@ -0,0 +1,88 @@
+package com.java110.code.api;
+
+import com.java110.code.smo.IPrimaryKeyServiceSMO;
+import com.java110.common.constant.ResponseConstant;
+import com.java110.common.util.Assert;
+import com.java110.core.base.controller.BaseController;
+import com.java110.core.context.CodeDataFlow;
+import com.java110.core.factory.DataFlowFactory;
+import com.java110.core.factory.DataTransactionFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * ID 生成
+ * Created by wuxw on 2018/6/3.
+ */
+@RestController
+public class CodeApi extends BaseController {
+
+    @Autowired
+    IPrimaryKeyServiceSMO primaryKeyServiceSMOImpl;
+
+    @RequestMapping(path = "/codeApi/generate",method= RequestMethod.GET)
+    public String generateGet(HttpServletRequest request) {
+        return DataTransactionFactory.createCodeResponseJson(ResponseConstant.NO_TRANSACTION_ID,"-1",
+                ResponseConstant.RESULT_CODE_ERROR,"不支持Get方法请求").toJSONString();
+    }
+
+    @RequestMapping(path = "/codeApi/generate",method= RequestMethod.POST)
+    public String generatePost(@RequestBody String orderInfo,HttpServletRequest request) {
+        Map<String, String> headers = new HashMap<String, String>();
+        try {
+            getRequestInfo(request, headers);
+            //预校验
+            preValiateOrderInfo(orderInfo,headers);
+            CodeDataFlow dataFlow = DataFlowFactory.newInstance(CodeDataFlow.class).builder(orderInfo,null);
+            primaryKeyServiceSMOImpl.generateCode(dataFlow);
+            return dataFlow.getResJson().toJSONString();
+        }catch (Exception e){
+            logger.error("请求订单异常",e);
+            return DataTransactionFactory.createBusinessResponseJson(ResponseConstant.RESULT_CODE_ERROR,e.getMessage()+e).toJSONString();
+        }
+    }
+
+    /**
+     * 获取请求信息
+     * @param request
+     * @param headers
+     * @throws RuntimeException
+     */
+    private void getRequestInfo(HttpServletRequest request,Map headers) throws Exception{
+        try{
+            super.initHeadParam(request,headers);
+            super.initUrlParam(request,headers);
+        }catch (Exception e){
+            logger.error("加载头信息失败",e);
+            throw e;
+        }
+    }
+
+    /**
+     * 这里预校验,请求报文中不能有 dataFlowId
+     * @param orderInfo
+     */
+    private void preValiateOrderInfo(String orderInfo,Map<String, String> headers) {
+
+        Assert.jsonObjectHaveKey(orderInfo,"prefix","没有包含prefix");
+
+        Assert.jsonObjectHaveKey(orderInfo,"transactionId","没有包含transactionId");
+
+    }
+
+
+    public IPrimaryKeyServiceSMO getPrimaryKeyServiceSMOImpl() {
+        return primaryKeyServiceSMOImpl;
+    }
+
+    public void setPrimaryKeyServiceSMOImpl(IPrimaryKeyServiceSMO primaryKeyServiceSMOImpl) {
+        this.primaryKeyServiceSMOImpl = primaryKeyServiceSMOImpl;
+    }
+}

+ 1 - 1
CommonService/src/main/java/com/java110/base/dao/ICommonServiceDao.java

@@ -1,4 +1,4 @@
-package com.java110.base.dao;
+package com.java110.code.dao;
 
 
 import com.java110.entity.mapping.CodeMapping;

+ 1 - 1
CommonService/src/main/java/com/java110/base/dao/IPrimaryKeyServiceDao.java

@@ -1,4 +1,4 @@
-package com.java110.base.dao;
+package com.java110.code.dao;
 
 import java.util.Map;
 

+ 14 - 0
CodeService/src/main/java/com/java110/code/dao/ISnowflakeldWorker.java

@@ -0,0 +1,14 @@
+package com.java110.code.dao;
+
+/**
+ * Created by wuxw on 2018/6/3.
+ */
+public interface ISnowflakeldWorker {
+
+    /**
+     * 根据前缀生成ID
+     * @param prefix
+     * @return
+     */
+    public String getIdByPrefix(String prefix,long workId);
+}

+ 2 - 3
CommonService/src/main/java/com/java110/base/dao/impl/CommonServiceDaoImpl.java

@@ -1,7 +1,6 @@
-package com.java110.base.dao.impl;
+package com.java110.code.dao.impl;
 
-import com.java110.base.dao.ICommonServiceDao;
-import com.java110.common.constant.RuleDomain;
+import com.java110.code.dao.ICommonServiceDao;
 import com.java110.common.util.SerializeUtil;
 import com.java110.core.base.dao.BaseServiceDao;
 import com.java110.entity.mapping.CodeMapping;

+ 2 - 7
CommonService/src/main/java/com/java110/base/dao/impl/PrimaryKeyServiceDaoImpl.java

@@ -1,16 +1,11 @@
-package com.java110.base.dao.impl;
+package com.java110.code.dao.impl;
 
-import com.alibaba.fastjson.JSONObject;
-import com.java110.base.dao.IPrimaryKeyServiceDao;
-import com.java110.common.constant.CommonConstant;
-import com.java110.common.constant.ResponseConstant;
+import com.java110.code.dao.IPrimaryKeyServiceDao;
 import com.java110.common.log.LoggerEngine;
-import com.java110.common.util.ProtocolUtil;
 import com.java110.core.base.dao.BaseServiceDao;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.List;
 import java.util.Map;
 
 /**

+ 183 - 0
CodeService/src/main/java/com/java110/code/dao/impl/SnowflakeIdWorkerImpl.java

@@ -0,0 +1,183 @@
+package com.java110.code.dao.impl;
+
+
+/**
+ * Twitter_Snowflake<br>
+ * SnowFlake的结构如下(每部分用-分开):<br>
+ * 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000 <br>
+ * 1位标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0<br>
+ * 41位时间截(毫秒级),注意,41位时间截不是存储当前时间的时间截,而是存储时间截的差值(当前时间截 - 开始时间截)
+ * 得到的值),这里的的开始时间截,一般是我们的id生成器开始使用的时间,由我们程序来指定的(如下下面程序IdWorker类的startTime属性)。41位的时间截,可以使用69年,年T = (1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69<br>
+ * 10位的数据机器位,可以部署在1024个节点,包括5位datacenterId和5位workerId<br>
+ * 12位序列,毫秒内的计数,12位的计数顺序号支持每个节点每毫秒(同一机器,同一时间截)产生4096个ID序号<br>
+ * 加起来刚好64位,为一个Long型。<br>
+ * SnowFlake的优点是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由数据中心ID和机器ID作区分),并且效率较高,经测试,SnowFlake每秒能够产生26万ID左右。
+ */
+
+import com.java110.common.constant.ResponseConstant;
+import com.java110.common.exception.DAOException;
+import com.java110.common.log.LoggerEngine;
+import com.java110.code.dao.ISnowflakeldWorker;
+import com.java110.service.init.ServiceInfoListener;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.net.InetAddress;
+
+/**
+ * Created by wuxw on 2018/5/28.
+ */
+@Service
+public class SnowflakeIdWorkerImpl extends LoggerEngine implements ISnowflakeldWorker {
+
+
+
+    // ==============================Fields===========================================
+    /** 开始时间截 (2015-01-01) */
+    private final long twepoch = 1420041600000L;
+
+    /** 机器id所占的位数 */
+    //private final long workerIdBits = 5L;
+    private final long workerIdBits = 10L;
+
+    /** 数据标识id所占的位数 */
+   // private final long datacenterIdBits = 5L;
+
+    /** 支持的最大机器id,结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数) */
+    private final long maxWorkerId = -1L ^ (-1L << workerIdBits);
+
+    /** 支持的最大数据标识id,结果是31 */
+   // private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);
+
+    /** 序列在id中占的位数 */
+    private final long sequenceBits = 12L;
+
+    /** 机器ID向左移12位 */
+    private final long workerIdShift = sequenceBits;
+
+    /** 数据标识id向左移17位(12+5) */
+    private final long datacenterIdShift = sequenceBits + workerIdBits;
+
+    /** 时间截向左移22位(5+5+12) */
+    private final long timestampLeftShift = sequenceBits + workerIdBits ;//+ datacenterIdBits;
+
+    /** 生成序列的掩码,这里为4095 (0b111111111111=0xfff=4095) */
+    private final long sequenceMask = -1L ^ (-1L << sequenceBits);
+
+    /** 工作机器ID(0~31) */
+    private long workerId;
+
+    /** 数据中心ID(0~31) */
+    private long datacenterId;
+
+    /** 毫秒内序列(0~4095) */
+    private long sequence = 0L;
+
+    /** 上次生成ID的时间截 */
+    private long lastTimestamp = -1L;
+
+    //==============================Constructors=====================================
+    /**
+     * 构造函数
+
+     */
+    public SnowflakeIdWorkerImpl() {
+
+    }
+
+    // ==============================Methods==========================================
+    /**
+     * 获得下一个ID (该方法是线程安全的)
+     * @param workerId 工作ID (0~1024)
+     * @return SnowflakeId
+     */
+    public synchronized long nextId(long workerId) {
+
+        if (workerId > maxWorkerId || workerId < 0) {
+            throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
+        }
+       /* if (datacenterId > maxDatacenterId || datacenterId < 0) {
+            throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));
+        }*/
+        this.workerId = workerId;
+      /*  this.datacenterId = datacenterId;*/
+
+        long timestamp = timeGen();
+
+        //如果当前时间小于上一次ID生成的时间戳,说明系统时钟回退过这个时候应当抛出异常
+        if (timestamp < lastTimestamp) {
+            throw new RuntimeException(
+                    String.format("Clock moved backwards.  Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
+        }
+
+        //如果是同一时间生成的,则进行毫秒内序列
+        if (lastTimestamp == timestamp) {
+            sequence = (sequence + 1) & sequenceMask;
+            //毫秒内序列溢出
+            if (sequence == 0) {
+                //阻塞到下一个毫秒,获得新的时间戳
+                timestamp = tilNextMillis(lastTimestamp);
+            }
+        }
+        //时间戳改变,毫秒内序列重置
+        else {
+            sequence = 0L;
+        }
+
+        //上次生成ID的时间截
+        lastTimestamp = timestamp;
+
+        //移位并通过或运算拼到一起组成64位的ID
+        return ((timestamp - twepoch) << timestampLeftShift) //
+                //| (datacenterId << datacenterIdShift) //
+                | (workerId << workerIdShift) //
+                | sequence;
+    }
+
+    /**
+     * 阻塞到下一个毫秒,直到获得新的时间戳
+     * @param lastTimestamp 上次生成ID的时间截
+     * @return 当前时间戳
+     */
+    protected long tilNextMillis(long lastTimestamp) {
+        long timestamp = timeGen();
+        while (timestamp <= lastTimestamp) {
+            timestamp = timeGen();
+        }
+        return timestamp;
+    }
+
+    /**
+     * 返回以毫秒为单位的当前时间
+     * @return 当前时间(毫秒)
+     */
+    protected long timeGen() {
+        return System.currentTimeMillis();
+    }
+
+    //==============================Test=============================================
+    /** 测试 */
+    public static void main(String[] args) {
+        SnowflakeIdWorkerImpl idWorker = new SnowflakeIdWorkerImpl();
+        for (int i = 0; i < 1000; i++) {
+            long id = idWorker.nextId(0);
+            System.out.println(Long.toBinaryString(id));
+            System.out.println(id);
+        }
+    }
+
+    @Override
+    public String getIdByPrefix(String prefix,long workId) throws DAOException{
+        String id = prefix;
+        try{
+            id += nextId(workId);
+        }catch (Exception e){
+            logger.error("生成主键ID异常"+prefix,e);
+            throw new DAOException(ResponseConstant.RESULT_CODE_INNER_ERROR,"生成主键ID异常"+prefix+e);
+        }finally {
+            return id;
+        }
+    }
+
+
+}

+ 2 - 2
CommonService/src/main/java/com/java110/base/rest/CommonServiceRest.java

@@ -1,6 +1,6 @@
-package com.java110.base.rest;
+package com.java110.code.rest;
 
-import com.java110.base.smo.ICommonServiceSmo;
+import com.java110.code.smo.ICommonServiceSmo;
 import com.java110.core.base.controller.BaseController;
 import com.java110.entity.mapping.CodeMapping;
 import com.java110.feign.base.ICommonService;

+ 2 - 2
CommonService/src/main/java/com/java110/base/rest/PrimaryKeyServiceRest.java

@@ -1,7 +1,7 @@
-package com.java110.base.rest;
+package com.java110.code.rest;
 
 import com.alibaba.fastjson.JSONObject;
-import com.java110.base.smo.IPrimaryKeyServiceSMO;
+import com.java110.code.smo.IPrimaryKeyServiceSMO;
 import com.java110.common.log.LoggerEngine;
 import com.java110.common.util.ProtocolUtil;
 import com.java110.core.base.controller.BaseController;

+ 1 - 1
CommonService/src/main/java/com/java110/base/rest/ServiceConfigServiceRest.java

@@ -1,4 +1,4 @@
-package com.java110.base.rest;
+package com.java110.code.rest;
 
 import com.java110.core.base.controller.BaseController;
 

+ 1 - 1
CommonService/src/main/java/com/java110/base/smo/ICommonServiceSmo.java

@@ -1,4 +1,4 @@
-package com.java110.base.smo;
+package com.java110.code.smo;
 
 import com.java110.entity.mapping.CodeMapping;
 

+ 10 - 1
CommonService/src/main/java/com/java110/base/smo/IPrimaryKeyServiceSMO.java

@@ -1,6 +1,8 @@
-package com.java110.base.smo;
+package com.java110.code.smo;
 
 import com.alibaba.fastjson.JSONObject;
+import com.java110.common.exception.SMOException;
+import com.java110.core.context.CodeDataFlow;
 
 /**
  * 用户信息管理,服务
@@ -15,4 +17,11 @@ public interface IPrimaryKeyServiceSMO {
      * @return
      */
     public JSONObject queryPrimaryKey(JSONObject primaryKeyInfo) throws Exception;
+
+    /**
+     * 生成编码
+     * @param dataFlow
+     * @throws SMOException
+     */
+    public void generateCode(CodeDataFlow dataFlow) throws SMOException;
 }

+ 3 - 3
CommonService/src/main/java/com/java110/base/smo/impl/CommonServiceSmoImpl.java

@@ -1,7 +1,7 @@
-package com.java110.base.smo.impl;
+package com.java110.code.smo.impl;
 
-import com.java110.base.dao.ICommonServiceDao;
-import com.java110.base.smo.ICommonServiceSmo;
+import com.java110.code.dao.ICommonServiceDao;
+import com.java110.code.smo.ICommonServiceSmo;
 import com.java110.entity.mapping.CodeMapping;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;

+ 77 - 0
CodeService/src/main/java/com/java110/code/smo/impl/PrimaryKeyServiceSMOImpl.java

@@ -0,0 +1,77 @@
+package com.java110.code.smo.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.java110.code.dao.IPrimaryKeyServiceDao;
+import com.java110.code.dao.ISnowflakeldWorker;
+import com.java110.code.smo.IPrimaryKeyServiceSMO;
+import com.java110.common.constant.ResponseConstant;
+import com.java110.core.base.smo.BaseServiceSMO;
+import com.java110.core.context.CodeDataFlow;
+import com.java110.core.factory.DataTransactionFactory;
+import com.java110.service.init.ServiceInfoListener;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+
+/**
+ * 用户服务信息管理业务信息实现
+ * Created by wuxw on 2017/4/5.
+ */
+@Service("primaryKeyServiceSMOImpl")
+public class PrimaryKeyServiceSMOImpl extends BaseServiceSMO implements IPrimaryKeyServiceSMO {
+
+
+    @Autowired
+    IPrimaryKeyServiceDao iPrimaryKeyServiceDao;
+
+    @Autowired
+    ISnowflakeldWorker snowflakeIdWorkerImpl;
+
+    @Autowired
+    private ServiceInfoListener serviceInfoListener;
+
+    /**
+     * 根据sequence 表中name 查询ID
+     *
+     * @param primaryKeyInfo name信息封装
+     * @return
+     */
+    public JSONObject queryPrimaryKey(JSONObject primaryKeyInfo) throws Exception {
+        Map paramIn = JSONObject.toJavaObject(primaryKeyInfo, Map.class);
+        Map primaryKey = iPrimaryKeyServiceDao.queryPrimaryKey(paramIn);
+        JSONObject returnPrimaryKey = new JSONObject();
+        if (primaryKey != null && primaryKey.containsKey("targetId")) {
+            returnPrimaryKey.put("targetId", primaryKey.get("targetId"));
+        } else {
+            //如果没定义相应name的键序列,直接返回-1 表示 自己系统需要自己生成
+            returnPrimaryKey.put("targetId", "-1");
+        }
+        return returnPrimaryKey;
+    }
+
+    public void generateCode(CodeDataFlow dataFlow){
+        String code = snowflakeIdWorkerImpl.getIdByPrefix(dataFlow.getPrefix(),serviceInfoListener.getWorkId());
+
+        JSONObject resJson = DataTransactionFactory.createCodeResponseJson(dataFlow.getTransactionId(),code, ResponseConstant.RESULT_CODE_SUCCESS,"成功");
+
+        dataFlow.setResJson(resJson);
+    }
+
+    public ServiceInfoListener getServiceInfoListener() {
+        return serviceInfoListener;
+    }
+
+    public void setServiceInfoListener(ServiceInfoListener serviceInfoListener) {
+        this.serviceInfoListener = serviceInfoListener;
+    }
+
+
+    public ISnowflakeldWorker getSnowflakeIdWorkerImpl() {
+        return snowflakeIdWorkerImpl;
+    }
+
+    public void setSnowflakeIdWorkerImpl(ISnowflakeldWorker snowflakeIdWorkerImpl) {
+        this.snowflakeIdWorkerImpl = snowflakeIdWorkerImpl;
+    }
+}

+ 92 - 0
CodeService/src/main/resources/application-dev.yml

@@ -0,0 +1,92 @@
+jedis:
+  pool:
+    config:
+      maxTotal: 100
+      maxIdle: 20
+      maxWaitMillis: 20000
+    host: 192.168.31.199
+    port: 6379
+
+eureka:
+  instance:
+    leaseRenewalIntervalInSeconds: 10
+    leaseExpirationDurationInSeconds: 30
+  client:
+    serviceUrl:
+      defaultZone: http://192.168.31.199:8761/eureka/
+      #defaultZone: http://localhost:8761/eureka/
+server:
+  port: 8003
+  tomcat:
+    uri-encoding: UTF-8
+
+spring:
+  http:
+    encoding:
+      charset: UTF-8
+      enabled: true
+      force: true
+  application:
+    name: code-service
+  redis:
+    database: 0
+    host: 192.168.31.199
+    port: 6379
+    pool:
+      max-active: 300
+      max-wait: 10000
+      max-idle: 100
+      min-idle: 0
+      timeout: 0
+  datasource:
+    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
+    minIdle: 5
+    validationQuery: SELECT 1 FROM DUAL
+    initialSize: 5
+    maxWait: 60000
+    filters: stat,wall,log4j
+    poolPreparedStatements: true
+    type: com.alibaba.druid.pool.DruidDataSource
+    url: jdbc:mysql://192.168.31.199:3306/TT?useUnicode=true&characterEncoding=utf-8
+    maxPoolPreparedStatementPerConnectionSize: 20
+    password: TT@12345678
+    testOnBorrow: false
+    testWhileIdle: true
+    minEvictableIdleTimeMillis: 300000
+    timeBetweenEvictionRunsMillis: 60000
+    testOnReturn: false
+    driverClassName: com.mysql.jdbc.Driver
+    maxActive: 20
+    username: TT
+
+#============== kafka ===================
+kafka:
+  consumer:
+    zookeeper:
+      connect: 192.168.31.199:2181
+    servers: 192.168.31.199:9092
+    enable:
+      auto:
+        commit: true
+    session:
+      timeout: 6000
+    auto:
+      commit:
+        interval: 100
+      offset:
+        reset: latest
+    topic: test
+    group:
+      id: codeServiceStatus
+    concurrency: 10
+
+  producer:
+    zookeeper:
+      connect: 192.168.31.199:2181
+    servers: 192.168.31.199:9092
+    retries: 0
+    batch:
+      size: 4096
+    linger: 1
+    buffer:
+      memory: 40960

+ 92 - 0
CodeService/src/main/resources/application-prod.yml

@@ -0,0 +1,92 @@
+jedis:
+  pool:
+    config:
+      maxTotal: 100
+      maxIdle: 20
+      maxWaitMillis: 20000
+    host: 135.192.86.200
+    port: 6379
+
+eureka:
+  instance:
+    leaseRenewalIntervalInSeconds: 10
+    leaseExpirationDurationInSeconds: 30
+  client:
+    serviceUrl:
+      defaultZone: http://135.192.86.200:8761/eureka/
+      #defaultZone: http://localhost:8761/eureka/
+server:
+  port: 8003
+  tomcat:
+    uri-encoding: UTF-8
+
+spring:
+  http:
+    encoding:
+      charset: UTF-8
+      enabled: true
+      force: true
+  application:
+    name: code-service
+  redis:
+    database: 0
+    host: 135.192.86.200
+    port: 6379
+    pool:
+      max-active: 300
+      max-wait: 10000
+      max-idle: 100
+      min-idle: 0
+      timeout: 0
+  datasource:
+    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
+    minIdle: 5
+    validationQuery: SELECT 1 FROM DUAL
+    initialSize: 5
+    maxWait: 60000
+    filters: stat,wall,log4j
+    poolPreparedStatements: true
+    type: com.alibaba.druid.pool.DruidDataSource
+    url: jdbc:mysql://135.192.86.200:3306/TT?useUnicode=true&characterEncoding=utf-8
+    maxPoolPreparedStatementPerConnectionSize: 20
+    password: TT@12345678
+    testOnBorrow: false
+    testWhileIdle: true
+    minEvictableIdleTimeMillis: 300000
+    timeBetweenEvictionRunsMillis: 60000
+    testOnReturn: false
+    driverClassName: com.mysql.jdbc.Driver
+    maxActive: 20
+    username: TT
+
+#============== kafka ===================
+kafka:
+  consumer:
+    zookeeper:
+      connect: 135.192.86.200:2181
+    servers: 135.192.86.200:9092
+    enable:
+      auto:
+        commit: true
+    session:
+      timeout: 6000
+    auto:
+      commit:
+        interval: 100
+      offset:
+        reset: latest
+    topic: test
+    group:
+      id: codeServiceStatus
+    concurrency: 10
+
+  producer:
+    zookeeper:
+      connect: 135.192.86.200:2181
+    servers: 135.192.86.200:9092
+    retries: 0
+    batch:
+      size: 4096
+    linger: 1
+    buffer:
+      memory: 40960

+ 92 - 0
CodeService/src/main/resources/application-test.yml

@@ -0,0 +1,92 @@
+jedis:
+  pool:
+    config:
+      maxTotal: 100
+      maxIdle: 20
+      maxWaitMillis: 20000
+    host: 135.192.86.200
+    port: 6379
+
+eureka:
+  instance:
+    leaseRenewalIntervalInSeconds: 10
+    leaseExpirationDurationInSeconds: 30
+  client:
+    serviceUrl:
+      defaultZone: http://135.192.86.200:8761/eureka/
+      #defaultZone: http://localhost:8761/eureka/
+server:
+  port: 8003
+  tomcat:
+    uri-encoding: UTF-8
+
+spring:
+  http:
+    encoding:
+      charset: UTF-8
+      enabled: true
+      force: true
+  application:
+    name: code-service
+  redis:
+    database: 0
+    host: 135.192.86.200
+    port: 6379
+    pool:
+      max-active: 300
+      max-wait: 10000
+      max-idle: 100
+      min-idle: 0
+      timeout: 0
+  datasource:
+    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
+    minIdle: 5
+    validationQuery: SELECT 1 FROM DUAL
+    initialSize: 5
+    maxWait: 60000
+    filters: stat,wall,log4j
+    poolPreparedStatements: true
+    type: com.alibaba.druid.pool.DruidDataSource
+    url: jdbc:mysql://135.192.86.200:3306/TT?useUnicode=true&characterEncoding=utf-8
+    maxPoolPreparedStatementPerConnectionSize: 20
+    password: TT@12345678
+    testOnBorrow: false
+    testWhileIdle: true
+    minEvictableIdleTimeMillis: 300000
+    timeBetweenEvictionRunsMillis: 60000
+    testOnReturn: false
+    driverClassName: com.mysql.jdbc.Driver
+    maxActive: 20
+    username: TT
+
+#============== kafka ===================
+kafka:
+  consumer:
+    zookeeper:
+      connect: 135.192.86.200:2181
+    servers: 135.192.86.200:9092
+    enable:
+      auto:
+        commit: true
+    session:
+      timeout: 6000
+    auto:
+      commit:
+        interval: 100
+      offset:
+        reset: latest
+    topic: test
+    group:
+      id: codeServiceStatus
+    concurrency: 10
+
+  producer:
+    zookeeper:
+      connect: 135.192.86.200:2181
+    servers: 135.192.86.200:9092
+    retries: 0
+    batch:
+      size: 4096
+    linger: 1
+    buffer:
+      memory: 40960

+ 3 - 0
CodeService/src/main/resources/application.yml

@@ -0,0 +1,3 @@
+spring:
+  profiles:
+    active: test

CommonService/src/main/resources/banner.txt → CodeService/src/main/resources/banner.txt


CommonService/src/test/java/com/java110/AppTest.java → CodeService/src/test/java/com/java110/AppTest.java


+ 0 - 27
CommonService/src/main/java/com/java110/AppSpringBootApplication.java

@@ -1,27 +0,0 @@
-package com.java110;
-
-/**
- * Hello world!
- */
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
-
-/**
- * spring boot 初始化启动类
- *
- * @version v0.1
- * @auther com.java110.wuxw
- * @mail 928255095@qq.com
- * @date 2016年8月6日
- * @tag
- */
-@SpringBootApplication(scanBasePackages = "com.java110.service,com.java110.base,com.java110.core")
-@EnableDiscoveryClient
-public class AppSpringBootApplication {
-
-    public static void main(String[] args) throws Exception {
-        SpringApplication.run(AppSpringBootApplication.class, args);
-    }
-}

+ 0 - 48
CommonService/src/main/java/com/java110/base/smo/impl/PrimaryKeyServiceSMOImpl.java

@@ -1,48 +0,0 @@
-package com.java110.base.smo.impl;
-
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-import com.java110.base.dao.IPrimaryKeyServiceDao;
-import com.java110.base.smo.IPrimaryKeyServiceSMO;
-import com.java110.common.log.LoggerEngine;
-import com.java110.core.base.smo.BaseServiceSMO;
-import com.java110.entity.user.BoCust;
-import org.apache.commons.lang.math.NumberUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * 用户服务信息管理业务信息实现
- * Created by wuxw on 2017/4/5.
- */
-@Service("PrimaryKeyServiceSMOImpl")
-public class PrimaryKeyServiceSMOImpl extends BaseServiceSMO implements IPrimaryKeyServiceSMO {
-
-
-    @Autowired
-    IPrimaryKeyServiceDao iPrimaryKeyServiceDao;
-
-    /**
-     * 根据sequence 表中name 查询ID
-     *
-     * @param primaryKeyInfo name信息封装
-     * @return
-     */
-    public JSONObject queryPrimaryKey(JSONObject primaryKeyInfo) throws Exception {
-        Map paramIn = JSONObject.toJavaObject(primaryKeyInfo, Map.class);
-        Map primaryKey = iPrimaryKeyServiceDao.queryPrimaryKey(paramIn);
-        JSONObject returnPrimaryKey = new JSONObject();
-        if (primaryKey != null && primaryKey.containsKey("targetId")) {
-            returnPrimaryKey.put("targetId", primaryKey.get("targetId"));
-        } else {
-            //如果没定义相应name的键序列,直接返回-1 表示 自己系统需要自己生成
-            returnPrimaryKey.put("targetId", "-1");
-        }
-        return returnPrimaryKey;
-    }
-
-
-}

+ 0 - 46
CommonService/src/main/resources/application.yml

@@ -1,46 +0,0 @@
-server:
-  port: 8006
-spring:
-  application:
-    name: base-service    # 项目名称尽量用小写
-  datasource:
-    name: test
-    url: jdbc:mysql://135.192.86.200:31057/flow_app
-    username: flow
-    password: flow#1223
-    #使用druid数据源
-    type: com.alibaba.druid.pool.DruidDataSource
-    driver-class-name: com.mysql.jdbc.Driver
-    filters: stat
-    maxActive: 20
-    initialSize: 1
-    maxWait: 60000
-    minIdle: 1
-    timeBetweenEvictionRunsMillis: 60000
-    minEvictableIdleTimeMillis: 300000
-    validationQuery: select 'x'
-    testWhileIdle: true
-    testOnBorrow: false
-    testOnReturn: false
-    poolPreparedStatements: true
-    maxOpenPreparedStatements: 20
-logging:
-  file: ./BaseService/logs/BaseService.log
-  level:
-    root: INFO
-    com.java110.base: ERROR
-eureka:
-  client:
-    serviceUrl:
-      defaultZone: http://discovery:8761/eureka/  # 指定注册中心的地址, http://discovery:8762/eureka/
-  instance:
-    preferIpAddress: true
-
-jedis:
-  pool:
-    config:
-      maxTotal: 100
-      maxIdle: 20
-      maxWaitMillis: 20000
-    host: 127.0.0.1
-    port: 3306

+ 189 - 0
java110-common/src/main/java/com/java110/common/exception/StartException.java

@@ -0,0 +1,189 @@
+package com.java110.common.exception;
+
+
+import com.alibaba.fastjson.JSONObject;
+
+import java.io.PrintStream;
+import java.io.PrintWriter;
+
+/**
+ * 系统启动异常
+ * Created by wuxw on 2018/4/14.
+ */
+public class StartException extends RuntimeException {
+
+
+    private Result result;
+    private Throwable cause = this;
+
+    public StartException(){}
+
+    /**
+     * 构造方法
+     * @param result 返回值
+     * @param cause  异常堆栈
+     */
+    public StartException(Result result, Throwable cause) {
+        super(result.getMsg(), cause);
+        this.result = result;
+    }
+
+    /**
+     * 构造方法
+     * @param code 返回码
+     * @param msg  错误消息
+     */
+    public StartException(int code, String msg) {
+        super(msg);
+        this.result = new Result(code, msg);
+    }
+
+    public StartException(String code, String msg) {
+        super(msg);
+        this.result = new Result(code, msg);
+    }
+
+    /**
+     * 构造方法
+     * @param result 返回值
+     * @param detail 具体的返回消息
+     */
+    public StartException(Result result, String detail) {
+        super(result.getMsg() + "," + detail);
+        this.result = new Result(result.getCode(), result.getMsg() + "," + detail);
+    }
+
+    /**
+     * 构造方法
+     * @param result 返回值
+     * @param detail 具体的返回消息
+     * @param cause  异常堆栈
+     */
+    public StartException(Result result, String detail, Throwable cause) {
+        super(result.getMsg() + "," + detail, cause);
+        this.result = new Result(result.getCode(), result.getMsg() + "," + detail);
+    }
+
+    /**
+     * 构造方法
+     * @param code	返回码
+     * @param msg	返回消息
+     * @param cause 异常堆栈
+     */
+    public StartException(int code, String msg, Throwable cause) {
+        super(msg, cause);
+
+        if(cause != null) {
+            if(cause.getCause() != null) {
+                msg += " cause:" + ExceptionUtils.populateExecption(cause.getCause(), 500);
+            }
+            msg += " StackTrace:"+ExceptionUtils.populateExecption(cause, 500);
+        }
+        this.result = new Result(code, msg);
+    }
+
+    /**
+     * 构造方法
+     * @param code	返回码
+     * @param cause	异常堆栈
+     */
+    public StartException(int code, Throwable cause) {
+        super(cause);
+        String msg = "";
+
+        if(cause != null) {
+            if(cause.getCause() != null) {
+                msg += " cause:" + ExceptionUtils.populateExecption(cause.getCause(), 500);
+            }
+            msg += " StackTrace:"+ExceptionUtils.populateExecption(cause, 500);
+        }
+        this.result = new Result(code, msg);
+    }
+
+    /**
+     *
+     * TODO 简单描述该方法的实现功能(可选).
+     * @see Throwable#getCause()
+     */
+    public synchronized Throwable getCause() {
+        return (cause==this ? super.getCause() : cause);
+    }
+
+
+    /**
+     * 返回异常消息
+     * @return 异常消息
+     */
+    @Override
+    public String getMessage() {
+        return ExceptionUtils.buildMessage(super.getMessage(), getCause());
+    }
+
+    /**
+     * 异常
+     * @return
+     */
+    public String toJsonString() {
+        JSONObject exceptionJson = JSONObject.parseObject("{\"exception\":{}");
+        JSONObject exceptionJsonObj = exceptionJson.getJSONObject("exception");
+
+        if (getResult() != null)
+            exceptionJsonObj.putAll(JSONObject.parseObject(result.toString()));
+
+        exceptionJsonObj.put("exceptionTrace",getMessage());
+
+        return exceptionJsonObj.toString();
+    }
+    @Override
+    public void printStackTrace(PrintStream ps) {
+        ps.print("<exception>");
+        if (getResult() != null) {
+            ps.print(result.toString());
+        }
+        ps.append("<exceptionTrace>");
+
+        Throwable cause = getCause();
+        if (cause == null) {
+            super.printStackTrace(ps);
+        } else {
+            ps.println(this);
+            ps.print("Caused by: ");
+            cause.printStackTrace(ps);
+        }
+        ps.append("</exceptionTrace>");
+        ps.println("</exception>");
+    }
+
+    @Override
+    public void printStackTrace(PrintWriter pw) {
+        pw.print("<exception>");
+        if (getResult() != null) {
+            pw.print(result.toString());
+        }
+        pw.append("<exceptionTrace>");
+
+        Throwable cause = getCause();
+        if (cause == null) {
+            super.printStackTrace(pw);
+        } else {
+            pw.println(this);
+            pw.print("Caused by: ");
+            cause.printStackTrace(pw);
+        }
+        pw.append("</exceptionTrace>");
+        pw.println("</exception>");
+    }
+
+    /**
+     * 返回异常值
+     * @return	异常值对象
+     */
+    public Result getResult() {
+        return result;
+    }
+
+    public void setResult(Result result) {
+        this.result = result;
+    }
+
+}

+ 10 - 0
java110-common/src/main/java/com/java110/common/factory/ApplicationContextFactory.java

@@ -22,4 +22,14 @@ public class ApplicationContextFactory {
     public static Object getBean(String beanName){
         return applicationContext.getBean(beanName);
     }
+
+    public static <T> T getBean(String beanName,Class<T> t){
+        Object bean = applicationContext.getBean(beanName);
+
+        if(bean != null && t.isAssignableFrom(bean.getClass()) ){
+            return (T)bean;
+        }
+
+        return null;
+    }
 }

+ 18 - 0
java110-common/src/main/java/com/java110/common/util/Assert.java

@@ -37,6 +37,23 @@ public class Assert extends org.springframework.util.Assert{
         isNotNull(jsonObject,key,message);
     }
 
+
+    /**
+     * 判断 jsonObject 是否为空
+     * @param jsonStr
+     * @param key
+     * @param message
+     */
+    public static void jsonObjectHaveKey(String jsonStr,String key,String message){
+        Assert.hasLength(jsonStr,"不是有效的json为空,"+message);
+        if(isJsonObject(jsonStr)) {
+            JSONObject jsonObject = JSONObject.parseObject(jsonStr);
+            isNotNull(jsonObject, key, message);
+        }else{
+            throw new IllegalArgumentException(message);
+        }
+    }
+
     /**
      * 判断 jsonObject 是否为空
      * @param info
@@ -47,6 +64,7 @@ public class Assert extends org.springframework.util.Assert{
         isNotNull(info,key,message);
     }
 
+
     /**
      * 判断json是否为空
      * @param jsonArray

+ 56 - 0
java110-config/src/main/java/com/java110/config/properties/code/ZookeeperProperties.java

@@ -0,0 +1,56 @@
+package com.java110.config.properties.code;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * Created by wuxw on 2018/6/6.
+ */
+@Component
+@ConfigurationProperties(prefix = "java110.code.zookeeper",locations="classpath:config/code/zookeeper.properties")
+public class ZookeeperProperties {
+
+    private String url;
+
+    private long port;
+
+    private int timeOut;
+
+    private String workDir;
+
+    public int getTimeOut() {
+        return timeOut;
+    }
+
+    public void setTimeOut(int timeOut) {
+        this.timeOut = timeOut;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public long getPort() {
+        return port;
+    }
+
+    public void setPort(long port) {
+        this.port = port;
+    }
+
+    public String getZookeeperConnectString(){
+        return this.url + ":" +this.port;
+    }
+
+    public String getWorkDir() {
+        return workDir;
+    }
+
+    public void setWorkDir(String workDir) {
+        this.workDir = workDir;
+    }
+}

+ 4 - 0
java110-config/src/main/resources/config/code/zookeeper.properties

@@ -0,0 +1,4 @@
+java110.code.zookeeper.url=135.192.86.200
+java110.code.zookeeper.port=2181
+java110.code.zookeeper.timeOut=60000
+java110.code.zookeeper.workDir=/java110_works

+ 4 - 0
java110-core/src/main/java/com/java110/core/base/controller/BaseController.java

@@ -92,6 +92,10 @@ public class BaseController extends AppBase {
         }
 
         headers.put("IP",getIpAddr(request));
+
+        headers.put("hostName",request.getLocalName());
+        headers.put("port",request.getLocalPort());
+
     }
 
     /**

+ 1 - 0
java110-core/src/main/java/com/java110/core/context/AbstractDataFlowContext.java

@@ -170,6 +170,7 @@ public abstract class AbstractDataFlowContext implements DataFlowContext,Orders{
 
     public void setResJson(JSONObject resJson) {
         this.resJson = resJson;
+        this.setResData(resJson.toJSONString());
     }
 
     public List<DataFlowLinksCost> getLinksCostDates() {

+ 79 - 0
java110-core/src/main/java/com/java110/core/context/CodeDataFlow.java

@@ -0,0 +1,79 @@
+package com.java110.core.context;
+
+import com.alibaba.fastjson.JSONObject;
+
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * 主键生成
+ * Created by wuxw on 2018/6/3.
+ */
+public class CodeDataFlow extends AbstractDataFlowContext {
+
+
+
+    /**
+     * 前缀
+     */
+    private String prefix;
+
+    private String hostName;
+
+    private String port;
+
+    public String getPrefix() {
+        return prefix;
+    }
+
+    public void setPrefix(String prefix) {
+        this.prefix = prefix;
+    }
+
+    public String getHostName() {
+        return hostName;
+    }
+
+    public void setHostName(String hostName) {
+        this.hostName = hostName;
+    }
+
+    public String getPort() {
+        return port;
+    }
+
+    public void setPort(String port) {
+        this.port = port;
+    }
+
+    public CodeDataFlow(Date startDate, String code) {
+        super(startDate, code);
+    }
+
+    @Override
+    public CodeDataFlow builder(String reqInfo, Map<String, String> headerAll) throws Exception {
+        JSONObject reqInfoObj = JSONObject.parseObject(reqInfo);
+        this.setReqJson(reqInfoObj);
+        this.setReqData(reqInfo);
+        this.setTransactionId(reqInfoObj.getString("transactionId"));
+        this.setRequestTime(reqInfoObj.getString("requestTime"));
+
+        if (headerAll != null && !headerAll.isEmpty()){
+           this.headers.putAll(headerAll);
+        }
+
+        if(headerAll != null && headerAll.containsKey("hostName")) {
+            this.setHostName(headerAll.get("hostName"));
+        }
+        if(headerAll != null && headerAll.containsKey("port")) {
+            this.setPort(headerAll.get("port"));
+        }
+        this.setPrefix(reqInfoObj.getString("prefix"));
+        return this;
+    }
+
+    @Override
+    public Orders getOrder() {
+        return this;
+    }
+}

+ 20 - 0
java110-core/src/main/java/com/java110/core/factory/DataTransactionFactory.java

@@ -1,5 +1,6 @@
 package com.java110.core.factory;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.java110.common.constant.MappingConstant;
@@ -361,4 +362,23 @@ public class DataTransactionFactory {
         return pageResponseJson(transactionId,ResponseConstant.RESULT_CODE_SUCCESS,"成功",null);
     }
 
+
+    /**
+     * ID生成返回报文
+     * @param transactionId
+     * @param id
+     * @param code
+     * @param message
+     * @return
+     */
+    public static JSONObject createCodeResponseJson(String transactionId, String id, String code,String message){
+        JSONObject paramOut = JSONObject.parseObject("{}");
+        paramOut.put("transactionId",transactionId);
+        paramOut.put("code",code);
+        paramOut.put("message",message);
+        paramOut.put("responseTime",DateUtil.getNowDefault());
+        paramOut.put("id",id);
+        return paramOut;
+    }
+
 }

+ 48 - 0
java110-service/src/main/java/com/java110/service/init/ServiceInfoListener.java

@@ -0,0 +1,48 @@
+package com.java110.service.init;
+
+import org.springframework.boot.context.embedded.EmbeddedServletContainerInitializedEvent;
+import org.springframework.context.ApplicationListener;
+import org.springframework.stereotype.Component;
+
+/**
+ * 系统 启动时读取 服务信息
+ * Created by wuxw on 2018/6/6.
+ */
+@Component
+public class ServiceInfoListener implements ApplicationListener<EmbeddedServletContainerInitializedEvent> {
+
+    private int serverPort;
+
+    private String serviceHost;
+
+    private long workId;
+
+    @Override
+    public void onApplicationEvent(EmbeddedServletContainerInitializedEvent event) {
+        this.serverPort = event.getEmbeddedServletContainer().getPort();
+    }
+
+    public int getServerPort() {
+        return serverPort;
+    }
+
+    public void setServiceHost(String serviceHost) {
+        this.serviceHost = serviceHost;
+    }
+
+    public String getServiceHost() {
+        return serviceHost;
+    }
+
+    public long getWorkId() {
+        return workId;
+    }
+
+    public void setWorkId(long workId) {
+        this.workId = workId;
+    }
+
+    public String getHostPort(){
+        return this.serviceHost + ":" + this.serverPort +"-";
+    }
+}

+ 7 - 1
pom.xml

@@ -20,7 +20,7 @@
         <module>java110-feign</module>
         <module>java110-core</module>
         <module>java110-service</module>
-        <module>CommonService</module>
+        <module>CodeService</module>
         <module>MerchantService</module>
         <module>RuleService</module>
         <module>SimpleListenerService</module>
@@ -68,6 +68,7 @@
         <axis.version>1.4</axis.version>
         <httpclient.verion>3.1</httpclient.verion>
         <spring.version>4.3.2.RELEASE</spring.version>
+        <zookeeper.version>3.3.6</zookeeper.version>
     </properties>
 
     <dependencyManagement>
@@ -353,6 +354,11 @@
             </dependency>
 
 
+            <dependency>
+                <groupId>org.apache.zookeeper</groupId>
+                <artifactId>zookeeper</artifactId>
+                <version>${zookeeper.version}</version>
+            </dependency>
         </dependencies>
 
     </dependencyManagement>