优化开源项目:https://gitee.com/yu120/sequence
- * - * @author hubin - * @since 2016-08-18 - */ -@Slf4j -public class MySequence { - - private static final Log logger = LogFactory.getLog(MySequence.class); - /** - * 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) - */ - private final long twepoch = 1288834974657L; - /** - * 机器标识位数 - */ - private final long workerIdBits = 5L; - private final long datacenterIdBits = 5L; - private final long maxWorkerId = -1L ^ (-1L << workerIdBits); - private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); - /** - * 毫秒内自增位 - */ - private final long sequenceBits = 12L; - private final long workerIdShift = sequenceBits; - private final long datacenterIdShift = sequenceBits + workerIdBits; - /** - * 时间戳左移动位 - */ - private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; - private final long sequenceMask = -1L ^ (-1L << sequenceBits); - - private final long workerId; - - /** - * 数据标识 ID 部分 - */ - private final long datacenterId; - /** - * 并发控制 - */ - private long sequence = 0L; - /** - * 上次生产 ID 时间戳 - */ - private long lastTimestamp = -1L; - - public MySequence() { - this.datacenterId = getDatacenterId(maxDatacenterId); - this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); - String msg = "MySequence datacenterId:" + this.datacenterId + ";workerId:" + this.workerId; - log.info(msg); - HttpClientManager.getInstance().sendAlarmMsg(msg); - } - - /** - * 有参构造器 - * - * @param workerId 工作机器 ID - * @param datacenterId 序列号 - */ - public MySequence(long workerId, long datacenterId) { - Assert.isFalse(workerId > maxWorkerId || workerId < 0, - String.format("MySequence worker Id can't be greater than %d or less than 0", maxWorkerId)); - Assert.isFalse(datacenterId > maxDatacenterId || datacenterId < 0, - String.format("MySequence datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); - this.workerId = workerId; - this.datacenterId = datacenterId; - } - - /** - * 获取 maxWorkerId - */ - protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { - StringBuilder mpid = new StringBuilder(); - mpid.append(datacenterId); - String name = ManagementFactory.getRuntimeMXBean().getName(); - String msg = "MySequence getMaxWorkerId name:" + name; - log.info(msg); - HttpClientManager.getInstance().sendAlarmMsg(msg); - if (StringUtils.isNotBlank(name)) { - /* - * GET jvmPid - */ - mpid.append(name.split(StringPool.AT)[0]); - } - /* - * MAC + PID 的 hashcode 获取16个低位 - */ - return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); - } - - /** - * 数据标识id部分 - */ - protected static long getDatacenterId(long maxDatacenterId) { - long id = 0L; - try { - InetAddress ip = InetAddress.getLocalHost(); - NetworkInterface network = NetworkInterface.getByInetAddress(ip); - String msg = "MySequence ip:" + JSON.toJSONString(ip) + ";network: " + JSON.toJSONString(network); - log.info(msg); - HttpClientManager.getInstance().sendAlarmMsg(msg); - if (network == null) { - id = 1L; - log.info("MySequen cenetwork ==null "); - } else { - byte[] mac = network.getHardwareAddress(); - if (null != mac) { - id = ((0x000000FF & (long) mac[mac.length - 2]) | (0x0000FF00 & (((long) mac[mac.length - 1]) << 8))) >> 6; - id = id % (maxDatacenterId + 1); - } - } - } catch (Exception e) { - logger.warn(" getDatacenterId: " + e.getMessage()); - } - return id; - } - - /** - * 获取下一个 ID - * - * @return 下一个 ID - */ - public synchronized long nextId() { - long timestamp = timeGen(); - //闰秒 - if (timestamp < lastTimestamp) { - long offset = lastTimestamp - timestamp; - if (offset <= 5) { - try { - wait(offset << 1); - timestamp = timeGen(); - if (timestamp < lastTimestamp) { - throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", offset)); - } - } catch (Exception e) { - throw new RuntimeException(e); - } - } else { - throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", offset)); - } - } - - if (lastTimestamp == timestamp) { - // 相同毫秒内,序列号自增 - sequence = (sequence + 1) & sequenceMask; - if (sequence == 0) { - // 同一毫秒的序列数已经达到最大 - timestamp = tilNextMillis(lastTimestamp); - } - } else { - // 不同毫秒内,序列号置为 1 - 3 随机数 - sequence = ThreadLocalRandom.current().nextLong(1, 3); - } - - lastTimestamp = timestamp; - - // 时间戳部分 | 数据中心部分 | 机器标识部分 | 序列号部分 - return ((timestamp - twepoch) << timestampLeftShift) - | (datacenterId << datacenterIdShift) - | (workerId << workerIdShift) - | sequence; - } - - protected long tilNextMillis(long lastTimestamp) { - long timestamp = timeGen(); - while (timestamp <= lastTimestamp) { - timestamp = timeGen(); - } - return timestamp; - } - - protected long timeGen() { - return SystemClock.now(); - } - -} - diff --git a/epmet-user/epmet-user-server/src/main/resources/bootstrap.yml b/epmet-user/epmet-user-server/src/main/resources/bootstrap.yml index a9ff79fb01..120849ca0e 100644 --- a/epmet-user/epmet-user-server/src/main/resources/bootstrap.yml +++ b/epmet-user/epmet-user-server/src/main/resources/bootstrap.yml @@ -19,11 +19,115 @@ spring: time-zone: GMT+8 date-format: yyyy-MM-dd HH:mm:ss redis: + # 平阴cluster模式下使用cluster:配置段 + # database: @spring.redis.index@ + # host: @spring.redis.host@ + # port: @spring.redis.port@ + # password: @spring.redis.password@ + # timeout: 30s + database: @spring.redis.index@ - host: @spring.redis.host@ - port: @spring.redis.port@ password: @spring.redis.password@ timeout: 30s + cluster: + nodes: @spring.redis.cluster.nodes@ + max-redirects: @spring.redis.cluster.max-redirects@ + shardingsphere: + enabled: false +# sharding: +# default-data-source-name: master +# masterslave: +# name: ms +# master-data-source-name: master +# slave-data-source-names: slave1,slave2 +# #配置slave节点的负载均衡均衡策略,采用轮询机制 +# load-balance-algorithm-type: round_robin +# datasource: +# names: master,slave1,slave2 +# master: +# #MySQL +# type: com.alibaba.druid.pool.DruidDataSource +# driver-class-name: com.mysql.cj.jdbc.Driver +# url: @spring.datasource.druid.url@ +# username: @spring.datasource.druid.username@ +# password: @spring.datasource.druid.password@ +# initial-size: 10 +# max-active: 100 +# min-idle: 10 +# max-wait: 60000 +# pool-prepared-statements: true +# max-pool-prepared-statement-per-connection-size: 20 +# time-between-eviction-runs-millis: 60000 +# min-evictable-idle-time-millis: 300000 +# #Oracle需要打开注释 +# #validation-query: SELECT 1 FROM DUAL +# test-while-idle: true +# test-on-borrow: false +# test-on-return: false +# filter: +# stat: +# log-slow-sql: false +# slow-sql-millis: 1000 +# merge-sql: false +# wall: +# config: +# multi-statement-allow: true +# slave1: +# #MySQL +# type: com.alibaba.druid.pool.DruidDataSource +# driver-class-name: com.mysql.cj.jdbc.Driver +# url: @spring.datasource.slave1.url@ +# username: @spring.datasource.slave1.username@ +# password: @spring.datasource.slave1.password@ +# initial-size: 10 +# max-active: 100 +# min-idle: 10 +# max-wait: 60000 +# pool-prepared-statements: true +# max-pool-prepared-statement-per-connection-size: 20 +# time-between-eviction-runs-millis: 60000 +# min-evictable-idle-time-millis: 300000 +# #Oracle需要打开注释 +# #validation-query: SELECT 1 FROM DUAL +# test-while-idle: true +# test-on-borrow: false +# test-on-return: false +# filter: +# stat: +# log-slow-sql: false +# slow-sql-millis: 1000 +# merge-sql: false +# wall: +# config: +# multi-statement-allow: true +# slave2: +# #MySQL +# type: com.alibaba.druid.pool.DruidDataSource +# driver-class-name: com.mysql.cj.jdbc.Driver +# url: @spring.datasource.slave2.url@ +# username: @spring.datasource.slave2.username@ +# password: @spring.datasource.slave2.password@ +# initial-size: 10 +# max-active: 100 +# min-idle: 10 +# max-wait: 60000 +# pool-prepared-statements: true +# max-pool-prepared-statement-per-connection-size: 20 +# time-between-eviction-runs-millis: 60000 +# min-evictable-idle-time-millis: 300000 +# #Oracle需要打开注释 +# #validation-query: SELECT 1 FROM DUAL +# test-while-idle: true +# test-on-borrow: false +# test-on-return: false +# filter: +# stat: +# log-slow-sql: false +# slow-sql-millis: 1000 +# merge-sql: false +# wall: +# config: +# multi-statement-allow: true datasource: druid: #MySQL @@ -122,9 +226,6 @@ mybatis-plus: field-strategy: NOT_NULL #驼峰下划线转换 column-underline: true - worker-id: ${random.int(1,31)} - datacenter-id: ${random.int(1,31)} - banner: false #原生配置 configuration: diff --git a/epmet-user/epmet-user-server/src/main/resources/mapper/CustomerStaffDao.xml b/epmet-user/epmet-user-server/src/main/resources/mapper/CustomerStaffDao.xml index bed43d0aa6..f42cd61546 100644 --- a/epmet-user/epmet-user-server/src/main/resources/mapper/CustomerStaffDao.xml +++ b/epmet-user/epmet-user-server/src/main/resources/mapper/CustomerStaffDao.xml @@ -231,14 +231,13 @@ diff --git a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml index b3e82440ef..3a65fd24e9 100644 --- a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml +++ b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml @@ -130,9 +130,9 @@