开始
一、数据库文件
drop database if exists demo;
create database if not exists demo;
use demo;
DROP TABLE IF EXISTS WORKER_NODE;
CREATE TABLE WORKER_NODE
(
ID BIGINT NOT NULL AUTO_INCREMENT COMMENT 'auto increment id',
HOST_NAME VARCHAR(64) NOT NULL COMMENT 'host name',
PORT VARCHAR(64) NOT NULL COMMENT 'port',
TYPE INT NOT NULL COMMENT 'node type: ACTUAL or CONTAINER',
LAUNCH_DATE DATE NOT NULL COMMENT 'launch date',
MODIFIED TIMESTAMP NOT NULL COMMENT 'modified time',
CREATED TIMESTAMP NOT NULL COMMENT 'created time',
PRIMARY KEY(ID)
)
COMMENT='DB WorkerID Assigner for UID Generator',ENGINE = INNODB;
二、依赖
<!--web启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--jpa 数据库框架 启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--mysql jar包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- Apache Commons -->
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.2</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.xfvape.uid/uid-generator -->
<dependency>
<groupId>com.xfvape.uid</groupId>
<artifactId>uid-generator</artifactId>
<version>0.0.4-RELEASE</version>
</dependency>
三、application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/demo?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&connectTimeout=0&serverTimezone=UTC
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=root
四、把 WorkerNodeEntity 实体类复制到自己的包(package)中,添加了两个注解
WorkerNodeEntity.java 源文件
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;
@Entity //修改的地方
public class WorkerNodeEntity {
@Id //修改的地方
private long id;
private String hostName;
private String port;
private int type;
private Date launchDate = new Date();
private Date created;
private Date modified;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
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 int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public Date getLaunchDate() {
return launchDate;
}
public void setLaunchDate(Date launchDate) {
this.launchDate = launchDate;
}
public Date getCreated() {
return created;
}
public void setCreated(Date created) {
this.created = created;
}
public Date getModified() {
return modified;
}
public void setModified(Date modified) {
this.modified = modified;
}
@Override
public String toString() {
return ReflectionToStringBuilder.toString(this, ToStringStyle.SHORT_PREFIX_STYLE);
}
}
注意 所有的 WorkerNodeEntity导入的是复制的类,而且要一致
五、Dao层
(1)base
@NoRepositoryBean
public interface SysBaseDao<T,ID extends Serializable> extends JpaRepository<T,ID>, JpaSpecificationExecutor<T> {
}
(2) extends
@Repository
public interface SysWorkerNodeDao extends SysBaseDao<WorkerNodeEntity,Long>, CrudRepository<WorkerNodeEntity,Long> {
@Query(value = "select * from worker_node where HOST_NAME=:host and port=:port",nativeQuery = true)
WorkerNodeEntity getWorkerNodeByHostPort(@Param("host") String host, @Param("port") String port);
@Query(value = "insert into worker_node(ID, HOST_NAME, PORT, TYPE, LAUNCH_DATE, MODIFIED, CREATED)values(:#{#workerNodeEntity.id},:#{#workerNodeEntity.hostName},:#{#workerNodeEntity.port},:#{#workerNodeEntity.type},:#{#workerNodeEntity.launchDate},:#{#workerNodeEntity.modified},:#{#workerNodeEntity.created})",nativeQuery = true)
@Modifying
@Transactional
void addWorkerNode(@Param("workerNodeEntity") WorkerNodeEntity workerNodeEntity);
}
六、自定义 WorkerIdAssigner
public class MyDisposableWorkerIdAssigner implements WorkerIdAssigner {
@Autowired
private SysWorkerNodeDao workerNodeDao;
@Override
@Transactional
public long assignWorkerId() {
// build worker node entity
//别导入错了,导入刚才复制的WorkerNodeEntity类
WorkerNodeEntity workerNodeEntity = buildWorkerNode();
// add worker node for new (ignore the same IP + PORT)
workerNodeDao.addWorkerNode(workerNodeEntity);
return workerNodeEntity.getId();
}
private WorkerNodeEntity buildWorkerNode() {
WorkerNodeEntity workerNodeEntity = new WorkerNodeEntity();
if (DockerUtils.isDocker()) {
workerNodeEntity.setType(WorkerNodeType.CONTAINER.value());
workerNodeEntity.setHostName(DockerUtils.getDockerHost());
workerNodeEntity.setPort(DockerUtils.getDockerPort());
} else {
workerNodeEntity.setType(WorkerNodeType.ACTUAL.value());
workerNodeEntity.setHostName(NetUtils.getLocalAddress());
workerNodeEntity.setPort(System.currentTimeMillis() + "-" + RandomUtils.nextInt(100000));
}
workerNodeEntity.setCreated(new Date());
workerNodeEntity.setModified(new Date());
workerNodeEntity.setLaunchDate(new Date());
return workerNodeEntity;
}
}
七、配置类
@Configuration
public class CachedUidGeneratorConfig {
@Bean
public MyDisposableWorkerIdAssigner disposableWorkerIdAssigner(){
return new MyDisposableWorkerIdAssigner();
}
@Bean
public CachedUidGenerator cachedUidGenerator(MyDisposableWorkerIdAssigner disposableWorkerIdAssigner){
CachedUidGenerator cachedUidGenerator = new CachedUidGenerator();
cachedUidGenerator.setWorkerIdAssigner(disposableWorkerIdAssigner);
//以下为可选配置, 如未指定将采用默认值
cachedUidGenerator.setTimeBits(29);
cachedUidGenerator.setWorkerBits(21);
cachedUidGenerator.setSeqBits(13);
cachedUidGenerator.setEpochStr("2016-09-20");
cachedUidGenerator.setBoostPower(3);
cachedUidGenerator.setScheduleInterval(60L);
return cachedUidGenerator;
}
}
八、service
public interface UidGenService {
long getUid();
}
九、impl
@Service
public class UidGenServiceImpl implements UidGenService {
@Resource
private UidGenerator uidGenerator;
@Override
public long getUid() {
return uidGenerator.getUID();
}
}
十、controller
@RestController
public class UidGenController {
@Resource
private UidGenService service;
@RequestMapping("/uid")
public Object getUid(){
Map<String,Object> map = new LinkedHashMap<>();
map.put("uid",service.getUid());
return map;
}
}
运行成功
结束
交流:2371778707@qq.com