美文网首页程序员
面试官:小伙子,你给我说一下SpringBoot怎么整合UidG

面试官:小伙子,你给我说一下SpringBoot怎么整合UidG

作者: 程序员伟杰 | 来源:发表于2020-07-29 15:17 被阅读0次

    一、基本概述

    1.SpringBoot整合百度开源UidGenerator 并且替换默认的xml映射的方式为MyBatisPlus
    2.SpringBoot版本为 2.2.8.RELEASE;MyBatisPlus版本为 3.3.2;UidGenerator版本为1.0.0-SNAPSHOT
    3.替换默认的work_node 表结构和对应的实体类
    4.替换默认的DisposableWorkerIdAssigner 并且修改注入的mapper接口为service接口

    二、依赖及版本

    注意事项:
    由于UidGenerator 默认依赖了MyBatis 和MyBatis Spring相关依赖,在这使用的是MyBatisPlus,因此要把MyBatis 和MyBatis Spring的依赖排除。

    <dependency>
        <groupId>com.baidu.fsg</groupId>
        <artifactId>uid-generator</artifactId>
        <version>${uid-generator.version}</version>
        <exclusions>
            <exclusion>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis-spring</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>${mybatis-plus.version}</version>
    </dependency>
    
    

    三、表结构及实体类替换

    CREATE TABLE `sy_worker_node`  (
      `work_node_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
      `host_name` varchar(64)  NOT NULL COMMENT '主机名称',
      `port` varchar(64)  NOT NULL COMMENT '端口',
      `type` int(11) NOT NULL COMMENT '类型(ACTUAL or CONTAINER)',
      `launch_date` date NOT NULL COMMENT '年月日',
      `modeified` timestamp(0) NOT NULL  COMMENT '修改时间',
      `created` timestamp(0) NOT NULL  COMMENT '创建时间',
      PRIMARY KEY (`work_node_id`) USING BTREE
    ) ;
    
    
    @TableName("sy_worker_node")
    @Getter
    @Setter
    public class WorkNode {
    
        @TableId(value = "work_node_id",type = IdType.AUTO)
        private Long work_node_id;
    
        @TableField(value = "host_name")
        private String host_name;
    
        @TableField(value = "port")
        private String port;
    
        @TableField(value = "type")
        private Integer type;
    
        @TableField(value = "launch_date")
        private Date launch_date;
    
        @TableField(value = "modeified")
        private Date modeified;
    
        @TableField(value = "created")
        private Date created;
    
    }
    
    

    四、mapper接口

    @Mapper
    public interface WorkerNodeMapper extends BaseMapper<WorkNode>{
    
    }
    
    

    五、接口及实现类

    public interface IWorkNodeService extends IService<WorkNode>{
    
        public WorkNode getWorkerNodeByHostPort(String host,String port);
    
        public void addWorkerNode(WorkNode workNode);
    }
    
    
    @Service("workNodeService")
    public class WorkNodeServiceImpl extends ServiceImpl<WorkerNodeMapper, WorkNode> implements IWorkNodeService{
    
        @Override
        public WorkNode getWorkerNodeByHostPort(String host, String port) {
            QueryWrapper<WorkNode> queryWrapper=new QueryWrapper<>();
            queryWrapper.lambda().eq(WorkNode::getHost_name, host).eq(WorkNode::getPort, port);
            return getOne(queryWrapper);
        }
    
        @Override
        public void addWorkerNode(WorkNode workNode) {
            workNode.setCreated(new Date());
            workNode.setModeified(new Date());
            save(workNode);
        }
    
    }
    
    

    六、UidGenerator的配置类

    @Configuration
    public class IdGeneratorConfiguration {
        /*
            该类是在默认的基础上修改的
        */
        @Bean
        public DisposableWorkerIdAssigner disposableWorkerIdAssigner() {
            return new DisposableWorkerIdAssigner();
        }
        //默认注入的id生成器,使用时只需从容器取即可
        @Bean
        public CachedUidGenerator cachedUidGenerator() {
            CachedUidGenerator cachedUidGenerator = new CachedUidGenerator();
            cachedUidGenerator.setWorkerIdAssigner(disposableWorkerIdAssigner());
            return cachedUidGenerator;
        }
    
    }
    
    
    public class DisposableWorkerIdAssigner implements WorkerIdAssigner {
        private static final Logger LOGGER = LoggerFactory.getLogger(DisposableWorkerIdAssigner.class);
        /*
        @Autowired
        private WorkerNodeMapper workerNodeMapper;
    
        */
        //修改默认注入mapper为service接口
        @Autowired
        private IWorkNodeService workNodeService;
    
        /**
         * Assign worker id base on database.<p>
         * If there is host name & port in the environment, we considered that the node runs in Docker container<br>
         * Otherwise, the node runs on an actual machine.
         * 
         * @return assigned worker id
         */
        @Transactional
        public long assignWorkerId() {
            // build worker node entity
            WorkNode workNode = buildWorkerNode();
    
            // add worker node for new (ignore the same IP + PORT)
            workNodeService.addWorkerNode(workNode);
            LOGGER.info("Add worker node:" + workNode);
    
            return workNode.getWork_node_id();
        }
    
        /**
         * Build worker node entity by IP and PORT
         */
        private WorkNode buildWorkerNode() {
            WorkNode workNode = new WorkNode();
            if (DockerUtils.isDocker()) {
                workNode.setType(WorkerNodeType.CONTAINER.value());
                workNode.setHost_name(DockerUtils.getDockerHost());
                workNode.setPort(DockerUtils.getDockerPort());
                workNode.setLaunch_date(new Date());
    
            } else {
                workNode.setType(WorkerNodeType.ACTUAL.value());
                workNode.setHost_name(NetUtils.getLocalAddress());
                workNode.setPort(System.currentTimeMillis() + "-" + RandomUtils.nextInt(100000));
                workNode.setLaunch_date(new Date());
            }
    
            return workNode;
        }
    
    }
    
    

    七、测试类

    @RestController
    public class IndexController {
        //从容器中获取在配置类中注入的实例
        @Autowired
        private UidGenerator uidGenerator;
    
        @GetMapping("/index")
        public String index(){
            System.err.println(uidGenerator.getUID());
            return "success";
        }
    }
    
    

    测试结果:


    八、总结

    1. 首先要创建相关的表结构 每次启动服务会插入一条数据
    2. 替换默认的DisposableWorkerIdAssigner 并且修改注入的实例
    3. 在配置类中注入id的生成器及所需要的实例

    最后

    感谢你看到这里,看完有什么的不懂的可以在评论区问我,觉得文章对你有帮助的话记得给我点个赞,每天都会分享java相关技术文章或行业资讯,欢迎大家关注和转发文章!

    相关文章

      网友评论

        本文标题:面试官:小伙子,你给我说一下SpringBoot怎么整合UidG

        本文链接:https://www.haomeiwen.com/subject/tfuhrktx.html