zoukankan      html  css  js  c++  java
  • UidGenerator springboot2集成篇

    uid-generator

    官网集成文档:
    https://github.com/baidu/uid-generator/blob/master/README.zh_cn.md

    由于并没有提供springboot集成版本,网上找的都缺少必须步骤,我这里梳理一下详细的uid-generator与springboot2集成的步骤

    uid-generator与springboot2集成初始化

    创建一个MySQL数据库名称为baiduUidGenerator

    执行如下SQL

    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;
    

    uid-generator与springboot2集成

    初始化一个springboot项目,并修改pom文件如下

    <dependencies>
    	<dependency>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-web</artifactId>
    	</dependency>
    	<dependency>
    		<groupId>org.mybatis.spring.boot</groupId>
    		<artifactId>mybatis-spring-boot-starter</artifactId>
    		<version>2.1.0</version>
    	</dependency>
    
    	<dependency>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-test</artifactId>
    		<scope>test</scope>
    	</dependency>
    	<!--for Mysql-->
    	<dependency>
    		<groupId>mysql</groupId>
    		<artifactId>mysql-connector-java</artifactId>
    		<scope>runtime</scope>
    		<version>8.0.12</version>
    	</dependency>
    	<!-- druid -->
    	<dependency>
    		<groupId>com.alibaba</groupId>
    		<artifactId>druid-spring-boot-starter</artifactId>
    		<version>1.1.9</version>
    	</dependency>
    	<!--必须放在最后-->
    	<dependency>
    		<groupId>com.baidu.fsg</groupId>
    		<artifactId>uid-generator</artifactId>
    		<version>1.0.0-SNAPSHOT</version>
    	</dependency>
    </dependencies>
    

    修改配置文件application.properties(注意MySQL地址、数据库名称账户等于之前建表的保持一致)

    server.port=9999
    spring.datasource.url=jdbc:mysql://*.*.*.*:3306/baiduUidGenerator?useUnicode=true&characterEncoding=utf-8&useSSL=false
    spring.datasource.username=root
    spring.datasource.password=*
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    
    
    mybatis.mapper-locations=classpath:mapper/*.xml
    mybatis.configuration.map-underscore-to-camel-case=true
    

    新建UidGenService,内容如下

    package org.zxp.uidgeneratortest;
    
    import com.baidu.fsg.uid.UidGenerator;
    import org.springframework.stereotype.Service;
    
    import javax.annotation.Resource;
    
    /**
     * @program: uidgeneratortest
     * @description:
     * @author: X-Pacific zhang
     * @create: 2019-10-13 17:28
     **/
    @Service
    public class UidGenService {
        @Resource
        private UidGenerator uidGenerator;
    
        public long getUid() {
            return uidGenerator.getUID();
        }
    }
    
    

    与启动类同级目录新建WorkerNodeMapper内容如下(下面的两步是解决UidGenerator与springboot集成出现的无法正常注入bean的问题)

    /*
     * Copyright (c) 2017 Baidu, Inc. All Rights Reserve.
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *     http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    package org.zxp.uidgeneratortest;
    
    import com.baidu.fsg.uid.worker.entity.WorkerNodeEntity;
    import org.apache.ibatis.annotations.Param;
    import org.springframework.stereotype.Repository;
    
    /**
     * DAO for M_WORKER_NODE
     *
     * @author yutianbao
     */
    @Repository
    public interface WorkerNodeMapper {
    
        /**
         * Get {@link WorkerNodeEntity} by node host
         * 
         * @param host
         * @param port
         * @return
         */
        WorkerNodeEntity getWorkerNodeByHostPort(@Param("host") String host, @Param("port") String port);
    
        /**
         * Add {@link WorkerNodeEntity}
         * 
         * @param workerNodeEntity
         */
        void addWorkerNode(WorkerNodeEntity workerNodeEntity);
    }
    

    与启动类同级目录新建DisposableWorkerIdAssigner内容如下

    /*
     * Copyright (c) 2017 Baidu, Inc. All Rights Reserve.
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *     http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    package org.zxp.uidgeneratortest;
    
    import com.baidu.fsg.uid.utils.DockerUtils;
    import com.baidu.fsg.uid.utils.NetUtils;
    import com.baidu.fsg.uid.worker.WorkerIdAssigner;
    import com.baidu.fsg.uid.worker.WorkerNodeType;
    import com.baidu.fsg.uid.worker.entity.WorkerNodeEntity;
    import org.apache.commons.lang.math.RandomUtils;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.transaction.annotation.Transactional;
    
    import javax.annotation.Resource;
    
    /**
     * Represents an implementation of {@link WorkerIdAssigner},
     * the worker id will be discarded after assigned to the UidGenerator
     * 
     * @author yutianbao
     */
    public class DisposableWorkerIdAssigner implements WorkerIdAssigner {
        private static final Logger LOGGER = LoggerFactory.getLogger(DisposableWorkerIdAssigner.class);
    
        @Autowired
        private WorkerNodeMapper workerNodeMapper;
    
        /**
         * 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
         */
        @Override
        @Transactional
        public long assignWorkerId() {
            // build worker node entity
            WorkerNodeEntity workerNodeEntity = buildWorkerNode();
    
            // add worker node for new (ignore the same IP + PORT)
            workerNodeMapper.addWorkerNode(workerNodeEntity);
            LOGGER.info("Add worker node:" + workerNodeEntity);
    
            return workerNodeEntity.getId();
        }
    
        /**
         * Build worker node entity by IP and PORT
         */
        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));
            }
    
            return workerNodeEntity;
        }
    
    }
    

    springboot启动类上添加注解,org.zxp.uidgeneratortest需要更新为你的工程路径

    @RestController
    @ComponentScan(basePackages = {"org.zxp.uidgeneratortest","com.baidu.fsg"})
    @MapperScan("org.zxp.uidgeneratortest")
    

    resources下创建mapper目录(为了同配置文件路径一致)并创建文件WorkerNodeMapper.xml,内容如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="org.zxp.uidgeneratortest.WorkerNodeMapper">
        <resultMap id="workerNodeRes"
                   type="com.baidu.fsg.uid.worker.entity.WorkerNodeEntity">
            <id column="ID" jdbcType="BIGINT" property="id"/>
            <result column="HOST_NAME" jdbcType="VARCHAR" property="hostName"/>
            <result column="PORT" jdbcType="VARCHAR" property="port"/>
            <result column="TYPE" jdbcType="INTEGER" property="type"/>
            <result column="LAUNCH_DATE" jdbcType="DATE" property="launchDate"/>
            <result column="MODIFIED" jdbcType="TIMESTAMP" property="modified"/>
            <result column="CREATED" jdbcType="TIMESTAMP" property="created"/>
        </resultMap>
    
        <insert id="addWorkerNode" useGeneratedKeys="true" keyProperty="id"
                parameterType="com.baidu.fsg.uid.worker.entity.WorkerNodeEntity">
    		INSERT INTO WORKER_NODE
    		(HOST_NAME,
    		PORT,
    		TYPE,
    		LAUNCH_DATE,
    		MODIFIED,
    		CREATED)
    		VALUES (
    		#{hostName},
    		#{port},
    		#{type},
    		#{launchDate},
    		NOW(),
    		NOW())
    	</insert>
    
        <select id="getWorkerNodeByHostPort" resultMap="workerNodeRes">
    		SELECT
    		ID,
    		HOST_NAME,
    		PORT,
    		TYPE,
    		LAUNCH_DATE,
    		MODIFIED,
    		CREATED
    		FROM
    		WORKER_NODE
    		WHERE
    		HOST_NAME = #{host} AND PORT = #{port}
    	</select>
    </mapper>
    

    springboot启动类添加如下方法(做一些代替xml的配置以及测试的controller)

    @Autowired
    private UidGenService uidGenService;
    
    @GetMapping("/getuid")
    public String getUid() {
    	return String.valueOf( uidGenService.getUid() );
    }
    
    @Bean("disposableWorkerIdAssigner")
    public DisposableWorkerIdAssigner disposableWorkerIdAssigner(){
    	DisposableWorkerIdAssigner disposableWorkerIdAssigner = new DisposableWorkerIdAssigner();
    	return  disposableWorkerIdAssigner;
    }
    
    @Bean("cachedUidGenerator")
    public UidGenerator uidGenerator(DisposableWorkerIdAssigner disposableWorkerIdAssigner){
    	CachedUidGenerator cachedUidGenerator = new CachedUidGenerator();
    	cachedUidGenerator.setWorkerIdAssigner(disposableWorkerIdAssigner);
    	return cachedUidGenerator;
    }
    

    测试

    启动springboot工程

    访问:http://localhost:9999/getuid

    返回:3686802606946000922

    成功!

  • 相关阅读:
    刷新aspx页面的六种方法
    关于 Visual Studio 2012 新建的网站项目在 Visual Studio 2010 中的兼容性问题
    Bing Maps 辅助工具 —— MapCruncher 简单使用学习
    学习使用Bing Maps Silverlight Control(七):自定义导航工具栏
    学习使用Bing Maps Silverlight Control(五):离线使用和自定义地图模式
    使用参数初始化Silverlight程序
    WPF中资源文件的使用
    关于特殊符号在XML中的问题
    学习使用Bing Maps Silverlight Control(六):自定义“鹰眼”地图
    关于Sliverlight的一些问题
  • 原文地址:https://www.cnblogs.com/zxporz/p/11668615.html
Copyright © 2011-2022 走看看