Проект Spring Boot интегрирует глобально уникальный генератор идентификаторов Vesta

Spring Boot задняя часть сервер продукт
Проект Spring Boot интегрирует глобально уникальный генератор идентификаторов Vesta

Содержание этой статьи следующее:

本文内容脑图

Всего в статье 760 слов, а чтение занимает около 2 минут!


Обзор

в предыдущем посте«Spring Boot Engineering Интегрированный глобальный уникальный генератор идентификаторов UidGenerator»Я рекомендую генератор глобальных уникальных идентификаторов, разработанный Baidu на основе алгоритма Snowflake.UidGenerator, и эта статья еще раз рекомендует отличный генератор глобальных уникальных идентификаторов под названием Vesta.

VestaЭто работа Yanpeng с открытым исходным кодом, основанная на разработке Java, и ее опытздесь. Vesta — это генератор идентификаторов общего назначения, широко известный в Интернете как единый генератор чисел, обладающий рядом преимуществ:

  • глобально уникальный
  • примерно заказано
  • обратимый
  • технологичный
  • распределенный

И поддерживает три режима публикации:

  • Встроенный режим выпуска
  • Режим публикации центрального сервера
  • Режим публикации REST

В зависимости от потребностей бизнеса в производительности, он может генерироватьТип максимального пикаиминимальная степень детализацииДва типа идентификатора, его архитектура реализации обеспечивает атрибуты качества, необходимые для интернет-продуктов, такие как высокая производительность, высокая доступность и масштабируемость, и является общим продуктом высокопроизводительного передатчика сигналов.

В этой статье мы сыграем Весту в проекте Spring Boot!

Примечание:Эта статья была впервые опубликована вМой личный блог: CodeSheep · Program Sheep,Добро пожаловатьМаленькая станция


Основное инженерное сооружение

Построение базового проекта Spring Boot повторять не буду, после создания проектаpomНеобходимо добавить следующие зависимости:

        <dependency>
            <groupId>com.robert.vesta</groupId>
            <artifactId>vesta-service</artifactId>
            <version>0.0.1</version>
        </dependency>

        <dependency>
            <groupId>com.robert.vesta</groupId>
            <artifactId>vesta-intf</artifactId>
            <version>0.0.1</version>
        </dependency>

Соответствующий пакет Jar можно получить, скомпилировав исходный код Vesta.Исходный код здесь


Импорт конфигурации Vesta

  • в проектеresourcesДобавьте файл конфигурации Vesta в каталог

вводитьvesta-rest.properties, настроенный следующим образом:

vesta.machine=1021  # 机器ID
vesta.genMethod=0   # 生成方式,0表示使用嵌入发布模式
vesta.type=1        # ID类型,1表示最小粒度型

вводитьvesta-rest-main.xml, настроенный следующим образом:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

  <bean
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations" value="classpath:ext/vesta/vesta-rest.properties"/>
  </bean>

  <bean id="idService" class="com.robert.vesta.service.factory.IdServiceFactoryBean"
    init-method="init">
    <property name="providerType" value="PROPERTY"/>
    <property name="type" value="${vesta.type}"/>
    <property name="genMethod" value="${vesta.genMethod}"/>
    <property name="machineId" value="${vesta.machine}"/>
  </bean>

</beans>

Хорошо, затем мы создаем класс конфигурации Config дляvesta-rest-main.xmlКонфигурационный файл загружается в проект

  • Создать класс конфигурации UidConfig
@Configuration
@ImportResource( locations = { "classpath:ext/vesta/vesta-rest-main.xml" } )
public class UidConfig {
}

Написание сервисов Vesta

Он содержит несколько важных интерфейсов инструментов, связанных с генераторами идентификаторов, в основном в том числе:

  • genIdСоздайте глобально уникальный идентификационный номер
  • explainIdИзмените глобальный уникальный идентификационный номер, чтобы получить данные JSON, которые могут объяснить значение идентификационного номера.
  • makeIdУдостоверение личности ручной работы

Давайте посмотрим код

@Service
public class UidService {

    @Resource
    private IdService idService;

    public long genId() {
        return idService.genId();
    }

    public Id explainId( long id ) {
        return idService.expId(id);
    }

    public long makeId( long version, long type, long genMethod, long machine, long time, long seq ) {

        long madeId = -1;
        if (time == -1 || seq == -1)
            throw new IllegalArgumentException( "Both time and seq are required." );
        else if (version == -1) {
            if (type == -1) {
                if (genMethod == -1) {
                    if (machine == -1) {
                        madeId = idService.makeId(time, seq);
                    } else {
                        madeId = idService.makeId(machine, time, seq);
                    }
                } else {
                    madeId = idService.makeId(genMethod, machine, time, seq);
                }
            } else {
                madeId = idService.makeId(type, genMethod, machine, time, seq);
            }
        } else {
            madeId = idService.makeId(version, type, genMethod, time,
                    seq, machine);
        }

        return madeId;
    }

}

Написать тестовый контроллер

Мы стремимся к вышеперечисленномуUidServiceНапишите тестовый интерфейс для каждого из трех интерфейсов инструментов, представленных в:

@RestController
public class UidController {

    @Autowired
    private UidService uidService;

    @RequestMapping("/genid")
    public long genId() {
        return uidService.genId();
    }

    @RequestMapping("/expid")
    public Id explainId(@RequestParam(value = "id", defaultValue = "0") long id) {
        return uidService.explainId( id );
    }

    @RequestMapping("/makeid")
    public long makeId(
            @RequestParam(value = "version", defaultValue = "-1") long version,
            @RequestParam(value = "type", defaultValue = "-1") long type,
            @RequestParam(value = "genMethod", defaultValue = "-1") long genMethod,
            @RequestParam(value = "machine", defaultValue = "-1") long machine,
            @RequestParam(value = "time", defaultValue = "-1") long time,
            @RequestParam(value = "seq", defaultValue = "-1") long seq) {

        return uidService.makeId( version, type, genMethod, machine, time, seq );
    }
}

Экспериментальная проверка

  • эксперимент один

Сначала мы используем браузер для вызова интерфейсаgenid, чтобы вернуть сгенерированный глобально уникальный серийный номер ID, все так просто и изящно:

生成全局唯一流水号

  • Эксперимент 2

Поскольку глобально уникальный серийный номер, сгенерированный Vesta,обратимыйОтличные характеристики , поэтому мы можем сначала сгенерировать серийный номер, а потом вызыватьexpidИнтерфейс для изменения значения, представленного серийным номером:

全局唯一流水号的反解效果


Постскриптум

Из-за ограниченных возможностей, если есть ошибки или неуместность, пожалуйста, критикуйте и исправьте их, учитесь и обменивайтесь мнениями вместе!



МожетНажмитеилисканированиеследующеебудь остороженподписаться на официальный аккаунт автораCodeSheep, получить большеПрагматичный, понятный, воспроизводимыйИсходный текст ↓↓↓

CodeSheep · 程序羊