Название проектаgoodsKill, с одной стороны, означает флеш-распродажу товаров (немного похоже на чинглиш), а с другой стороны, его также можно понимать как хороший навык . Этот проект надеется построить полноценный скилл. структуру проекта и интегрировать некоторые хорошие технологии и навыки разработки (отдавая предпочтение внутренним технологиям) для облегчения обучения и анализа.
Этот проект представляет собой проект моделирования флэш-продаж, который предоставляет унифицированный интерфейс запроса моделирования флэш-продаж. Технически он использует структуру уровня персистентности SpringMVC + Mybatis, использует Dubbo3.x [1] + Feign для выполнения вызовов межсервисного интерфейса и использует Nacos для. центр обнаружения и настройки регистрации служб. Поддержка. База данных разделена на базы данных и таблицы, распределенные транзакции и конечные автоматы используются для преобразования между состояниями данных (реализовано на основе Spring Statemachine).
Интеграция с сервисом Spring AI позволяет моделировать флэш-продажи с помощью роботов AI.
master
ветка построена на основе последней системы Spring Cloud 2023.x + Spring Boot 3.x + JDK21. В настоящее время сохраняется только основной API-интерфейс моделирования флеш-продажи, если вам нужно использовать Spring Boot 2.7.x + JDK11. версии вы можете переключиться на тег v2.7.4 (поддерживается вход в систему, регистрация и простые функции фонового управления). Основная ветка в настоящее время обновляется и ее функции недостаточно стабильны. Если вы столкнулись с ошибками в коде, рекомендуется использовать старую версию.
Функции этого проекта в настоящее время относительно элементарны и имеют множество недостатков. Реальный сценарий Flash Sale намного сложнее, чем метод реализации в этом проекте. В этом проекте опущены некоторые технические детали реализации в реальном сценарии. В настоящее время он используется только для обучения. ссылка. Если вы считаете, что этот проект полезен для вас, поставьте ему звездочку и поддержите его? ~ ~.
Вложение: ссылка на проект Code Cloud
https://gitee.com/techa/goodsKill
. Если скорость клонирования низкая, используйте хранилище Code Cloud, чтобы время от времени синхронизировать его с Code Cloud.
Используемый инструмент или фреймворк | имя | Официальный сайт |
---|---|---|
Весенние ботинки | Spring Boot Framework | https://spring.io/projects/spring-boot |
МойБатис-Плюс | Инструмент улучшения MyBatis | https://mp.baomidou.com/ |
смотритель зоопарка | Служба распределенной координации | http://zookeeper.apache.org/ |
Редис | База данных распределенного кэша | https://redis.io/ |
Кафка | очередь сообщений | http://kafka.apache.org/ |
КроликMQ | очередь сообщений | https://www.rabbitmq.com/ |
МонгоБД | МонгоБД | https://www.mongodb.com/ |
MySQL | База данных MySQL | https://www.mysql.com/ |
Эластичный поиск | Полнотекстовая поисковая система | https://www.elastic.co |
Шардинг-JDBC | Компоненты подбазы данных и подтаблицы | https://shardingsphere.apache.org |
Весеннее облако Алибаба | Облачные компоненты Alibaba | https://github.com/alibaba/spring-cloud-alibaba |
Апач Даббо | Платформа удаленных вызовов службы RPC | https://github.com/apache/dubbo |
Весенний облачный шлюз | Компонент шлюза | https://spring.io/projects/spring-cloud-gateway |
Сеата | Решения для распределенных транзакций | http://seata.io/zh-cn/index.html |
Spring БезопасностьOAuth2.0 | Компонент авторизации OAuth2.0 | https://spring.io/projects/spring-security-oauth |
ГрафQL | Язык запросов для API | https://docs.spring.io/spring-graphql/docs/current/reference/html |
Весенняя государственная машина | Весенний конечный автомат | https://spring.io/projects/spring-statemachine |
Са-Токен | Упрощенная структура аутентификации полномочий | https://sa-токен.cc/ |
Пролетный путь | Инструмент контроля версий базы данных | https://flywaydb.org/ |
МинИО | Служба хранения объектов | https://min.io/ |
Весенний ИИ | Компоненты искусственного интеллекта | https://spring.io/projects/spring-ai |
товарыУбить |--goodskill-admin ||Сервер мониторинга SpringBoot Admin, поддерживает обнаружение микросервисов Spring Cloud|--goodskill-ai ||Служба чата с роботами AI|--goodskill-gateway ||Шлюз API микросервиса, унифицированная аутентификация служб, поддержка динамической загрузки маршрутов |--goodskill-поставщик-заказов ||Поставщик услуг заказов|--goodskill-seckill-provider ||Поставщик услуг Seckill|--goodskill-spring-boot-starter ||Автоматическая сборка конфигурации проекта|--goodskill-common ||Коммунальные услуги (в настоящее время включая функции загрузки и скачивания minio) |--goodskill-web ||Предоставить доступ к интерфейсу симуляции flash-kill|--goodskill-job ||запланированная задача elastic-job|--goodskill-seata ||Пример решения для распределенных транзакций, интегрирующего nacos+dubbo+shardingjdbc+seata| - -goodskill-auth ||модуль входа и авторизации |--auth-service| ||Служба авторизации входа пользователя на основе платформы Sa-Token |--oauth2-auth-server ||oauth2.0 сервер авторизации входа, настраиваемая служба авторизации входа |--oauth2-resource-server ||ресурс oauth2.0 Серверная сторона, индивидуальный сервис авторизации входа в систему
В настоящее время реализовано несколько решений для уничтожения флэш-памяти, а тестовый интерфейс предоставляется через SeckillMockController
Адрес документа Openapi шлюза агрегации: http://localhost/doc.html#/home
(необходимо включить службу шлюза)
Адрес мониторинга приложения Spring Boot Admin: http://www.goodskill.com:19031
, имя пользователя и пароль для входа: user/123456
Сценарий 1. Реализация синхронизированной блокировки синхронизации.
Сценарий 2: реализация распределенной блокировки Redisson
Сценарий 3: реализация ActiveMQ (устарело)
Сценарий 4: реализация очереди сообщений Kafka
Сценарий 5: атомарное обновление базы данных
Сценарий 6: Ожидание результатов обработки флэш-продаж в реальном времени (устарело)
Сценарий 7: распределенная блокировка ZooKeeper
Сценарий 8. Используйте Redis, чтобы сократить запасы продуктов мгновенной продажи, асинхронно отправьте MQ после завершения мгновенной продажи и используйте MongoDB для завершения загрузки данных.
Сценарий 9: реализация Spring Cloud Stream
Сценарий 10: ограничение тока Sentinel + атомарное обновление базы данных (необходимо настроить с помощью консоли Sentinel для настройки правил управления потоком limit
имени ресурса)
2021-04-14 21:58:59.857 INFO [goodskill-web,df43cc8f59291c48,df43cc8f59291c48] 15808 --- [ main] o.s.w.controller.SeckillMockController : 秒杀场景二(redis分布式锁实现)开始时间:Wed Apr 14 21:58:59 CST 2021,秒杀id:1000
2021-04-14 21:59:00.094 INFO [goodskill-web,144aa7910cca9520,2821cb8d62c5a908] 15808 --- [AClOSzbugzYng-1] o.s.w.s.c.SeckillMockResponseListener : 秒杀活动结束,秒杀场景二(redis分布式锁实现)时间:Wed Apr 14 21:59:00 CST 2021,秒杀id:1000
2021-04-14 21:59:00.101 INFO [goodskill-web,144aa7910cca9520,2821cb8d62c5a908] 15808 --- [AClOSzbugzYng-1] o.s.w.s.c.SeckillMockResponseListener : 最终成功交易笔数统计中。。。
2021-04-14 21:59:01.616 INFO [goodskill-web,144aa7910cca9520,2821cb8d62c5a908] 15808 --- [AClOSzbugzYng-1] o.s.w.s.c.SeckillMockResponseListener : 最终成功交易笔数统计中。。。
2021-04-14 21:59:03.129 INFO [goodskill-web,144aa7910cca9520,2821cb8d62c5a908] 15808 --- [AClOSzbugzYng-1] o.s.w.s.c.SeckillMockResponseListener : 最终成功交易笔数:10
2021-04-14 21:59:03.130 INFO [goodskill-web,144aa7910cca9520,2821cb8d62c5a908] 15808 --- [AClOSzbugzYng-1] o.s.w.s.c.SeckillMockResponseListener : 历史任务耗时统计:StopWatch '': running time = 36159894800 ns
---------------------------------------------
ns % Task name
---------------------------------------------
4492195700 012% 秒杀场景四(kafka消息队列实现)
3164155900 009% 秒杀场景八(秒杀商品存放redis减库存,异步发送秒杀成功MQ,mongoDb数据落地)
6219218300 017% 秒杀场景十(Sentinel限流+数据库原子性更新)
9189080600 025% 秒杀场景七(zookeeper分布式锁)
3135926500 009% 秒杀场景五(数据库原子性更新update set num = num -1)
3342791800 009% 秒杀场景九(基于springcloud stream rabbitmq)
3343433700 009% 秒杀场景一(sychronized同步锁实现)
3273092300 009% 秒杀场景二(redis分布式锁实现)
JDK: OpenJDK21
Шардинг-JDBC: 5.5.0
SpringCloud: 2023.xx
SpringBoot: 3.3.x
SpringCloudAlibaba: 2023.xx
Апач Дуббо: 3.3.x
Используемый образ Docker
зеркало | Версия | порт | Имя пользователя и пароль |
---|---|---|---|
Накос | 2.3.2-тонкий | 8848 | nacos:nacos (консоль) |
Редис | последний | 6379 | Пароль: 123456 |
Кафка | 3.1.1 | 9092 | никто |
KafkaМенеджер | последний | 9001:9000 | никто |
Монго | 6.0.7 | 27017 | никто |
MySQL | 8.0.29 | 3306 | корень:Пароль123 |
смотритель зоопарка | 3.6.2 | 2181 | никто |
Эластичный поиск | 7.17.3 | 9200 9300 | никто |
Кибана | 7.17.3 | 5601 | никто |
КроликMQ | последний | 5672 15672 | никто |
МинИО | последний | 9000 | корень:пароль |
Сеата | 2.0.0 | 7091 8091 | сиденье:seata (консоль) |
Выполнить в корневом каталоге goodsKill
чистая установка mvn Или #skip модульные тесты mvn clean install -DskipTests
Порт по умолчанию запускает nacos, redis, mysql, RabbitMQ, Kafka, Zookeeper, elasticsearch, SeataServer или используйте команду docker-compose [2] :
docker-compose -f goodskill-simple.yml up -d
Войдите в каталогgoodskill goodskill-web/src/main/sql
, найдите файл seckill.sql
, установите хранилище seckill
в локальной базе данных mysql и выполните операции инициализации данных.
Когда docker-compose запускает образ MySQL, он автоматически выполняет сценарий инициализации. Если вы уже выполнили предыдущий шаг, вы можете пропустить этот шаг. |
Настроить хост
127.0.0.1 kafka
127.0.0.1 nacos
127.0.0.1 redis
127.0.0.1 mysql
127.0.0.1 zookeeper
127.0.0.1 mongo
127.0.0.1 elasticsearch
127.0.0.1 rabbitmq
127.0.0.1 logstash
##如果网关服务部署在远程机器,此处改为相应的远程机器ip
127.0.0.1 www.goodskill.com
В центре конфигурации Nacos добавьте общедоступные конфигурации с DataId goodskill-common-connection.yml
( goodskill-common-connection.yml
конфигурация промежуточного программного обеспечения) иgoodskill goodskill-common.yml
(общедоступная конфигурация службы). Для получения подробной информации обратитесь к DEFAULT_GROUP
в проекте. корневой каталог goodskill-common-connection.yml
, файлы goodskill-common.yml
Основной метод запускает класс OrderApplication
(сервис заказов).
Основной метод запускает класс SeckillApplication
(поставщик службы управления seckill).
Основной метод запускает класс SampleWebApplication
(имитирующий веб-сервис флэш-продажи).
Отправьте запрос на моделирование мгновенной продажи: идентификатор активности мгновенной продажи 1000, количество продукта 10, выполните 20 операций покупки, используйте синхронизированную блокировку синхронизации для выполнения, например:
Вы можете напрямую использовать следующую команду для отправки смоделированного запроса на продажу флэш-памяти. Каждое действие по продаже флэш-памяти seckillId соответствует уникальному идентификатору продукта. Каждый раз, когда интерфейс выполняется, после выполнения интерфейса может выполняться действие по инициализации. вызываться неоднократно.
curl -X POST " http://www.goodskill.com:8080/sychronized "
-H " accept: */* " -H " Content-Type: application/json " -d
" { " requestCount " : 20, " seckillCount " : 10, " seckillId " : 1000} "
curl -X POST " http://www.goodskill.com:8080/redisson "
-H " accept: */* " -H " Content-Type: application/json " -d
" { " requestCount " : 20, " seckillCount " : 10, " seckillId " : 1000} "
curl --location --request POST ' http://www.goodskill.com:8080/limit '
--header ' User-Agent: apifox/1.0.0 (https://www.apifox.cn) '
--header ' Content-Type: application/json '
--data-raw ' {
"maxPoolSize": 10,
"seckillId": 1000,
"corePoolSize": 2,
"seckillCount": 100,
"requestCount": 120
} '
По умолчанию запрос выполняется асинхронно. Журнал выполнения можно просмотреть на консоли. Если количество итоговых успешных транзакций равно количеству позиций 10, это означает отсутствие проблемы перепроданности или недопроданности.
Простой сервис-робот для флэш-продаж, созданный на основе вызовов службы Spring AI Alibaba, можно выполнить с помощью сервиса-робота. В настоящее время он поддерживает только открытие флэш-продаж и вывод времени, потраченного на это действие.
Войдите в модульgoodskill goodskill-ai
и замените конфигурацию spring.ai.dashscope.api-key
, которую можно получить через платформу Alibaba Cloud Bailian.
Основной метод запускает класс AiBotApplication
и обращается к странице чата http://127.0.0.1:18077
Вот пример разговора
我: 帮我执行秒杀
AI: 当然可以帮助您执行秒杀活动啦!为了顺利进行,请告诉我以下几个信息:1.秒杀活动的ID是多少?2. 这次秒杀的商品数量是多少?3.您打算这次请求的次数是多少?有了这些信息,我就能帮您开始了!?
我: 秒杀活动id 1001,请求次数20,商品数量10个
AI: 秒杀活动已成功开启!我们现在等待10秒钟,然后我会为您获取任务的耗时统计信息。秒杀活动已成功启动,并在10秒后获得了任务耗时统计信息:总耗时:6.673773375秒具体耗时分布如下:- 秒杀活动id:1001,秒杀场景五(数据库原子性更新update setnum = num -1)耗时 3.528280125 秒,占比 53%-秒杀活动id:1001,秒杀场景五(数据库原子性更新updateset num = num-1)耗时3.14549325 秒,占比 47%希望这些信息对您有帮助!如果还有其他问题或需要进一步的帮助,请随时告诉我哦!?
Добавьте следующие шаги в раздел быстрого запуска, чтобы начать полноценный проект.
Войдите в модуль goodskill-gateway
, запустите шлюз служб через основной метод класса GatewayBootApplication
и получите единый доступ к различным службам через шлюз.
http://www.goodskill.com/api/order/**
соответствует доступу к сервису goodskill-order
http://www.goodskill.com/api/seata/**
соответствует доступу к сервисуgoodskill goodskill-seata
http://www.goodskill.com/api/seckill/**
соответствует доступу к сервису goodskill-seckill
http://www.goodskill.com/api/auth/**
соответствует доступу к сервису goodskill-auth
http://www.goodskill.com/api/web/**
соответствует доступу к goodskill-web
.
Компонент ограничения тока Sentinel
интегрирован и поддерживает передачу правил ограничения тока через центр конфигурации nacos
. Чтобы использовать его, необходимо запустить консоль Sentinel
и запустить ее с портом 18088
Среда докера пока не поддерживается.
Информацию о методе тестирования распределенных транзакций Seata см. в инструкциях по запуску примера теста распределенных транзакций Seata.
Основной метод запускает класс GoodskillAdminApplication
(мониторинг индикатора состояния микросервиса).
Ошибка запуска образа docker es
Эта проблема обычно возникает в среде Linux. Выполните следующую команду sysctl -w vm.max_map_count=262144
или измените файл /etc/sysctl.conf и добавьте следующую конфигурацию:
grep vm.max_map_count /etc/sysctl.conf
vm.max_map_count=262144
Как использовать сервер авторизации OAuth2.0, настроенный в этом проекте, для авторизации входа в систему?
Быть улучшенным. .
Какова текущая совместимость между различными платформами, интегрированными в проект?
Версии каждой основной платформы, на которую в настоящее время опирается этот проект, являются относительно новыми и не были полностью протестированы [3] .
Как устранить ошибку « no available service found in cluster 'default', please make sure registry config correct and keep your seata server running
сообщается в консоли запуска службы?
Просто запустите службу seata-server
(предоставленную в файле docker-compose.yml). Вы можете обратиться к официальному сайту Seata, чтобы добавить конфигурации, связанные с nacos. Если распределенные транзакции не используются, вы можете игнорировать эту ошибку и она не повлияет на нормальную работу сервиса.
docker-compose не может получить изображение
Hub.docker заблокирован. Alibaba Cloud Image Accelerator можно использовать в Китае. Для конкретных операций см. Alibaba Cloud Image Accelerator.
Не удалось запустить проект с помощью JDK17 или выше.
Добавьте при запуске следующие параметры jvm, например:
--add-opens java.base/java.lang=ALL-UNNAMED
--add-opens java.base/java.util=ALL-UNNAMED
--add-opens java.base/java.util.concurrent=ALL-UNNAMED
--add-opens java.base/java.math=ALL-UNNAMED
--add-opens java.base/sun.reflect.generics.reflectiveObjects=ALL-UNNAMED
В настоящее время контроль статуса активности флэш-продаж основан на конечном автомате Spring Statemachine. Преимущества использования конечного автомата:
Унифицированный контроль статуса активности облегчает централизованное поддержание статуса;
Предотвращать произвольное изменение бизнес-статуса и обеспечивать контролируемые обновления статуса;
поверхность | база данных | Стоит ли делить библиотеку | Поле подбиблиотеки | Делить ли стол | Поля подтаблицы |
---|---|---|---|---|---|
успех_убит | MySQL | Да (на одном сервере разделена на две библиотеки: seckill и seckill_01) | seckill_id | Да (разделены на две таблицы: Success_killed_0 и Success_kill_1) | user_phone |
? | Ни одна другая таблица не разделена на базы данных или таблицы. По умолчанию в качестве основной базы данных используется seckill. |
Решите проблему сбоя подключения контейнера Docker к Kafka: https://www.cnblogs.com/hellxz/p/why_cnnect_to_kafka_always_failure.html