Оригинальная ссылка: Проект с открытым исходным кодом | Распределенная система генерации уникальных идентификаторов, разработанная Go
Сегодня я представлю вам проект с открытым исходным кодом:id-maker, основная функция — генерировать уникальный идентификатор в распределенной среде. На прошлой неделе он был остановлен на неделю, а также использовался для разработки и тестирования соответствующего кода этого проекта.
У Meituan есть проект с открытым исходным кодом под названиемLeaf, разработанный на Java. На основе этой идеи разработан и реализован данный проект с помощью Go.
Общий объем кода проекта невелик, хотите ли вы использовать его в реальной производственной среде или хотите найти проект для практики, я думаю, что это хороший выбор.
история проекта
В большинстве систем глобальные уникальные идентификаторы пользуются большим спросом. Например, экспресс, еда на вынос, фильмы и т. д., вам необходимо сгенерировать уникальный идентификатор, чтобы обеспечить уникальность одного номера.
Каковы требования к идентификационному номеру бизнес-системы?
- глобальная уникальность: Повторяющиеся идентификационные номера не могут отображаться.Поскольку это уникальная идентификация, это самое основное требование.
- возрастающая тенденция: Кластерные индексы используются в движке MySQL InnoDB.Поскольку большинство СУБД используют структуру данных B-дерева для хранения данных индекса, мы должны попытаться использовать упорядоченные первичные ключи, чтобы обеспечить производительность записи при выборе первичных ключей.
- Монотонно возрастающий: убедитесь, что следующий идентификатор должен быть больше предыдущего идентификатора, например, номер версии транзакции, добавочное сообщение IM, сортировка и другие специальные требования.
- информационной безопасности: Если идентификаторы являются непрерывными, злоумышленникам очень легко подобрать работу, просто загрузите указанный URL-адрес последовательно; если это номер заказа, это еще более опасно, и конкуренты могут напрямую узнать наш ежедневный заказ. объем. Поэтому в некоторых сценариях приложений идентификаторы должны быть нерегулярными и нерегулярными.
В этом контексте важно иметь высокодоступную систему генерации уникальных идентификаторов.
Использование проекта
Существует два способа создания идентификаторов:
- Сгенерируйте идентификаторы из базы данных.
- Сгенерируйте идентификаторы в соответствии с алгоритмом снежинки.
Существует два способа вызова интерфейса:
- HTTP-метод
- метод gRPC
HTTP-метод
1. Проверка здоровья:
curl http://127.0.0.1:8080/ping
2. Получить идентификатор:
Получите идентификатор, чей тег является тестовым:
curl http://127.0.0.1:8080/v1/id/test
3. Получите идентификатор снежинки:
curl http://127.0.0.1:8080/v1/snowid
метод gRPC
1. Получить идентификатор:
grpcurl -plaintext -d '{"tag":"test"}' -import-path $HOME/src/id-maker/internal/controller/rpc/proto -proto segment.proto localhost:50051 proto.Gid/GetId
2. Получите идентификатор снежинки:
grpcurl -plaintext -import-path $HOME/src/id-maker/internal/controller/rpc/proto -proto segment.proto localhost:50051 proto.Gid/GetSnowId
местное развитие
# Run MySQL
$ make compose-up
# Run app with migrations
$ make run
Архитектура проекта
Использование проектаgo-clean-templateРазработка шаблона схемы, структура каталогов выглядит следующим образом:
Ниже приведено краткое описание каждого каталога:
- cmd: Запись программы
- config: файл конфигурации
- docs: Сгенерированная проектная документация
- integration-test: Интеграционный тест
- internal:Бизнес-код
- pkg: какой-то пакет называется
Заимствуйте официальные две картинки:
Общая иерархическая взаимосвязь выглядит следующим образом: самые внутренние — это модели, которые определяют структуру нашей таблицы, а средний — это уровень бизнес-логики. Уровень бизнес-логики предоставляет интерфейсы для вызова самого внешнего API. Самый внешний уровень — это некоторые инструменты и вызовы. , Вход.
Самым большим преимуществом этого является развязка.Независимо от того, как изменяется самый внешний уровень, пока соответствующий интерфейс реализован на уровне бизнес-логики, код ядра может вообще не нуждаться в изменении.
Итак, вызывающие отношения между ними выглядят так:
HTTP > usecase
usecase > repository (Postgres)
usecase < repository (Postgres)
HTTP < usecase
Выше приведено все содержание этого проекта.Если вы заинтересованы, пожалуйста, оставьте мне сообщение для обмена, если вы можете дать мнеstarЗамечательно.
адрес проекта::id-maker
Прошлые статьи:
- Я слышал, что 99% программистов на Go столкнулись с defer.
- Женщина-испытатель спросила меня, как использовать gRPC, и я скинул ей эту статью напрямую.
- gRPC, большая похвала
- Доступ к службам gRPC из командной строки с помощью grpcurl
- Порекомендуйте три практических инструмента разработки Go
Рекомендуемое чтение: