В мире нет двух одинаковых листьев.
— Лейбниц
Китайская версия документа | Английская версия документа
Лист относится к некоторым общим схемам генерации идентификаторов в отрасли, включая Redis, UUID, Snowflake и другие. Каждая из вышеупомянутых схем имеет свои недостатки, поэтому мы решили реализовать набор распределенных сервисов генерации идентификаторов для удовлетворения требований. В настоящее время Лист охватывает внутренние финансовые,餐饮,外卖,酒店旅游,猫眼电影等多个业务线。基于4C8G虚拟机,通过公司RPC方法,QPS压力测试结果接近5万次/秒,TP999为1毫秒。
Вы можете использовать его в SOA-архитектуре для создания центра распределённых уникальных ID, который будет предоставлять ID для всех приложений.
Leaf предоставляет HTTP-сервис на основе Spring Boot для получения ID.
git clone git@github.com:Meituan-Dianping/Leaf.git
cd leaf
mvn clean install -DskipTests
cd leaf-server
mvn spring-boot:run
или
sh deploy/run.sh
# сегмент
curl http://localhost:8080/api/segment/get/leaf-segment-test
# snowflake
curl http://localhost:8080/api/snowflake/get/test
Leaf предоставляет два способа генерации ID (режим сегмента и режим Snowflake), которые можно включить одновременно или указать один способ для включения (оба по умолчанию отключены).
Настройка сервера Leaf находится в leaf-server/src/main/resources/leaf.properties| Настройка | Значение | Значение по умолчанию | | ------------------------- | ----------------------------- | ------ | | leaf.name | имя сервиса Leaf | | | leaf.segment.enable | включен ли режим сегмента | false | | leaf.jdbc.url | URL MySQL | | | leaf.jdbc.username | имя пользователя MySQL | | | leaf.jdbc.password | пароль MySQL | | | leaf.snowflake.enable | включен ли режим snowflake | false | | leaf.snowflake.zk.address | адрес zk в режиме snowflake | | | leaf.snowflake.port | порт регистрации сервиса в режиме snowflake | |### Режим сегментации
Чтобы использовать режим сегментации, сначала нужно создать таблицу в базе данных и настроить leaf.jdbc.url, leaf.jdbc.username и leaf.jdbc.password.
Если вы не хотите использовать этот режим, просто настройте leaf.segment.enable=false для отключения его.
CREATE DATABASE leaf;
CREATE TABLE `leaf_alloc` (
`biz_tag` varchar(128) NOT NULL DEFAULT '', -- уникальное имя вашего бизнеса
`max_id` bigint(20) NOT NULL DEFAULT '1',
`step` int(11) NOT NULL,
`description` varchar(256) DEFAULT NULL,
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`biz_tag`)
) ENGINE=InnoDB;
INSERT INTO leaf_alloc(biz_tag, max_id, step, description) VALUES('leaf-segment-test', 1, 2000, 'Тест режима сегментации Leaf Get Id');
Алгоритм взят из открытого исходного кода Twitter Snowflake.
Если вы не хотите использовать этот режим, просто настройте leaf.snowflake.enable=false для отключения его.
Настройте адрес Zookeeper``` leaf.snowflake.zk.address=${address} leaf.snowflake.enable=true leaf.snowflake.port=${port}
Настройте `leaf.snowflake.zk.address` в файле `leaf.properties` и задайте порт прослушивания сервиса `leaf.snowflake.port`.
### Мониторинг страницы
режим сегментации: http://localhost:8080/cache
### Основной модуль Leaf
Конечно, чтобы достичь более высокой производительности, вам нужно развернуть сервис Leaf через сервер RPC, который требует только включения пакета `leaf-core` и упаковки API для генерации ID в указанный RPC-фреймворк.
#### Внимание
Обратите внимание, что текущая логика получения IP-адреса в режиме Snowflake берет IP-адрес первой сетевой карты напрямую (особенно для сервисов, которые меняют IP-адрес), чтобы избежать потери работы ID.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )