Содержание этой статьи следующее:
Всего в статье 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, получить большеПрагматичный, понятный, воспроизводимыйИсходный текст ↓↓↓