Le nom du projet, GoodsKill, d'une part, signifie une vente flash de marchandises (cela ressemble un peu au chinglish), et d'autre part, cela peut aussi être compris comme une bonne compétence . Ce projet espère construire un ensemble complet. cadre de projet et intégrer de bonnes technologies et compétences de développement (privilégier la technologie back-end) pour un apprentissage et une révision faciles.
Ce projet est un projet de vente flash simulé qui fournit une interface de demande de simulation de vente flash unifiée. Techniquement, il adopte le cadre de couche de persistance SpringMVC + Mybatis, utilise Dubbo3.x [1] + Feign pour effectuer les appels d'interface inter-services et utilise Nacos pour. Centre de découverte et de configuration de l'enregistrement des services. Prise en charge La base de données est divisée en bases de données et en tables, les transactions distribuées et les machines d'état sont utilisées pour terminer la conversion entre les états de données (implémentées sur la base de Spring Statemachine).
Intégrés au service Spring AI, les ventes flash simulées peuvent être réalisées via des robots IA.
La branche master
est construite sur la base du dernier système Spring Cloud 2023.x + Spring Boot 3.x + JDK21. Actuellement, seule l'interface API de simulation de vente flash de base est conservée si vous devez utiliser Spring Boot 2.7.x + JDK11. version, vous pouvez passer à la balise v2.7.4 (fonctions de connexion, d'enregistrement et de gestion simple en arrière-plan prises en charge). La branche master est actuellement en cours de mise à niveau et ses fonctions ne sont pas assez stables. Si vous rencontrez des erreurs de code, il est recommandé d'utiliser l'ancienne version.
Les fonctions de ce projet sont actuellement relativement rudimentaires et présentent de nombreuses imperfections. Le scénario réel de Vente Flash est bien plus complexe que la méthode de mise en œuvre de ce projet. Ce projet omet certains détails techniques de mise en œuvre dans le scénario réel. Il n'est actuellement utilisé qu'à des fins d'apprentissage. référence. Si Si vous pensez que ce projet vous est utile, donnez-lui une étoile et soutenez-le ?
Pièce jointe : lien du projet Code Cloud
https://gitee.com/techa/goodsKill
. Si la vitesse de clonage est lente, utilisez l'entrepôt Code Cloud pour le synchroniser avec Code Cloud de temps en temps.
Outil ou cadre utilisé | nom | Site officiel |
---|---|---|
Botte de printemps | Cadre de démarrage Spring | https://spring.io/projects/spring-boot |
MyBatis-Plus | Outil d'amélioration MyBatis | https://mp.baomidou.com/ |
Gardien de zoo | Service de coordination distribué | http://zookeeper.apache.org/ |
Rédis | Base de données de cache distribué | https://redis.io/ |
Kafka | file d'attente des messages | http://kafka.apache.org/ |
LapinMQ | file d'attente des messages | https://www.rabbitmq.com/ |
MongoDB | MongoDB | https://www.mongodb.com/ |
MySQL | Base de données MySQL | https://www.mysql.com/ |
Recherche élastique | Moteur de recherche en texte intégral | https://www.elastic.co |
Sharding-JDBC | Composants de sous-base de données et de sous-table | https://shardingsphere.apache.org |
Nuage de printemps Alibaba | Composants du cloud Alibaba | https://github.com/alibaba/spring-cloud-alibaba |
Apache Dubbo | Cadre d'appel à distance du service RPC | https://github.com/apache/dubbo |
Passerelle Spring Cloud | Composant passerelle | https://spring.io/projects/spring-cloud-gateway |
Siège | Solutions de transactions distribuées | http://seata.io/zh-cn/index.html |
Sécurité du printempsOAuth2.0 | Composant d'autorisation OAuth2.0 | https://spring.io/projects/spring-security-oauth |
GraphQL | Un langage de requête pour les API | https://docs.spring.io/spring-graphql/docs/current/reference/html |
Machine à états à ressort | Machine à états à ressort | https://spring.io/projects/spring-statemachine |
Jeton Sa | Cadre d'authentification d'autorité léger | https://sa-token.cc/ |
Voie de migration | Outil de contrôle de version de base de données | https://flywaydb.org/ |
MinIO | Service de stockage d'objets | https://min.io/ |
IA du printemps | Composants d'IA | https://spring.io/projects/spring-ai |
marchandisesTuer |--goodskill-admin ||Serveur de surveillance SpringBoot Admin, prend en charge la découverte de microservices Spring Cloud|--goodskill-ai ||Service de chat robot AI|--goodskill-gateway ||Passerelle API Microservice, authentification de service unifiée, prise en charge du chargement d'itinéraire dynamique |--goodskill-order-provider ||Fournisseur de services de commande|--goodskill-seckill-provider ||Fournisseur de services Seckill|--goodskill-spring-boot-starter ||Assemblage automatique de configuration de projet|--goodskill-common ||Services publics (incluant actuellement les fonctions de téléchargement et de téléchargement minio) |--goodskill-web ||Fournir un accès à l'interface de simulation Flash Kill|--goodskill-job ||tâche planifiée elastic-job|--goodskill-seata ||Exemple de solution de transaction distribuée intégrant nacos+dubbo+shardingjdbc+seata| - -goodskill-auth ||module de connexion et d'autorisation d'authentification|--auth-service ||Service d'autorisation de connexion utilisateur basé sur le framework Sa-Token |--oauth2-auth-server ||serveur d'autorisation de connexion oauth2.0, service d'autorisation de connexion personnalisé |--oauth2-resource-server ||ressource oauth2.0 côté serveur, service d'autorisation de connexion personnalisé
Actuellement, plusieurs solutions de suppression flash ont été implémentées et l'interface de test est fournie via SeckillMockController
Adresse du document Openapi de la passerelle d'agrégation : http://localhost/doc.html#/home
(nécessité d'activer le service de passerelle)
Adresse de surveillance de l'application Spring Boot Admin : http://www.goodskill.com:19031
, nom d'utilisateur et mot de passe de connexion : user/123456
Scénario 1 : implémentation du verrouillage de synchronisation synchronisé
Scénario 2 : implémentation du verrouillage distribué Redisson
Scénario 3 : implémentation d'ActiveMQ (obsolète)
Scénario 4 : implémentation de la file d'attente de messages Kafka
Scénario 5 : mise à jour atomique de la base de données
Scénario 6 : Attente des résultats du traitement des ventes flash en temps réel (obsolète)
Scénario 7 : verrouillage distribué ZooKeeper
Scénario 8 : utilisez Redis pour réduire l'inventaire des produits de vente flash, envoyez MQ de manière asynchrone après la fin de la vente flash et utilisez MongoDB pour terminer l'atterrissage des données.
Scénario 9 : implémentation de Spring Cloud Stream
Scénario 10 : Limitation actuelle de Sentinel + mise à jour atomique de la base de données (doit être configuré avec la console Sentinel pour configurer les règles de contrôle de flux de la limit
de nom de ressource)
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
Sharding-JDBC : 5.5.0
SpringCloud : 2023.xx
SpringBoot : 3.3.x
SpringCloudAlibaba : 2023.xx
Apache Dubbo : 3.3.x
Image Docker utilisée
miroir | Version | port | Nom d'utilisateur et mot de passe |
---|---|---|---|
Nacos | 2.3.2-mince | 8848 | nacos:nacos (console) |
Rédis | dernier | 6379 | Mot de passe : 123456 |
Kafka | 3.1.1 | 9092 | aucun |
KafkaManager | dernier | 9001:9000 | aucun |
Mongo | 6.0.7 | 27017 | aucun |
MySQL | 8.0.29 | 3306 | racine : Mot de passe123 |
Gardien de zoo | 3.6.2 | 2181 | aucun |
Recherche élastique | 7.17.3 | 9200 9300 | aucun |
Kibana | 7.17.3 | 5601 | aucun |
LapinMQ | dernier | 5672 15672 | aucun |
MinIO | dernier | 9000 | racine: mot de passe |
Siège | 2.0.0 | 7091 8091 | siège:siège (console) |
Exécuter dans le répertoire racine du projet goodsKill
mvn installation propre Ou #skip unit tests mvn clean install -DskipTests
Le port par défaut démarre Nacos, Redis, MySQL, Rabbitmq, Kafka, Zookeeper, ElasticSearch, SeataServer ou utilisez la commande docker-compose [2] :
docker-compose -f goodskill-simple.yml up -d
Entrez dans le répertoire goodskill-web/src/main/sql
, recherchez le fichier seckill.sql
, établissez l'entrepôt seckill
dans la base de données mysql locale et effectuez les opérations d'initialisation des données.
Lorsque docker-compose démarre l'image MySQL, il exécutera automatiquement le script d'initialisation. Si vous avez déjà effectué l'étape précédente, vous pouvez ignorer cette étape. |
Configurer l'hôte
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
Dans le centre de configuration Nacos, ajoutez les configurations publiques avec DataId de goodskill-common-connection.yml
(configuration publique du middleware) et goodskill-common.yml
(le groupe de configuration publique du service est DEFAULT_GROUP
. Pour plus de détails, veuillez vous référer à goodskill-common-connection.yml
dans le projet). répertoire racine. goodskill-common-connection.yml
, fichiers goodskill-common.yml
La méthode principale exécute la classe OrderApplication
(service de commande)
La méthode principale exécute la classe SeckillApplication
(fournisseur de services de gestion Seckill)
La méthode principale exécute la classe SampleWebApplication
(simulant le service Web de vente flash)
Envoyer une demande de simulation de vente flash : ID d'activité de vente flash 1000, quantité de produit 10, effectuer 20 opérations d'achat, utiliser le verrouillage de synchronisation synchronisé pour exécuter, par exemple :
Vous pouvez utiliser directement la commande suivante pour envoyer une demande de vente flash simulée. Chaque activité de vente flash seckillId correspond à un identifiant de produit unique. Chaque fois que l'interface est exécutée, il y aura une action d'initialisation de l'inventaire. être appelé à plusieurs reprises.
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
} '
La requête est exécutée de manière asynchrone par défaut. Vous pouvez consulter le journal d'exécution sur la console Si le nombre de transactions finales réussies est égal au nombre d'articles 10, cela signifie qu'il n'y a pas de problème de survente ou de sous-vente.
Un simple service robot de vente flash construit sur la base des appels de service Spring AI Alibaba peut être effectué via le service robot. Actuellement, il prend uniquement en charge l'ouverture des activités de vente flash et la sortie de la consommation de temps de l'activité.
Entrez dans le module goodskill-ai
et remplacez la configuration spring.ai.dashscope.api-key
, qui peut être obtenue via la plateforme Alibaba Cloud Bailian
La méthode principale exécute la classe AiBotApplication
et accède à la page de discussion http://127.0.0.1:18077
Voici un exemple de conversation
我: 帮我执行秒杀
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%希望这些信息对您有帮助!如果还有其他问题或需要进一步的帮助,请随时告诉我哦!?
Ajoutez les étapes suivantes à la section de démarrage rapide pour démarrer un projet complet
Entrez dans le module goodskill-gateway
, démarrez la passerelle de service via la méthode principale de GatewayBootApplication
et accédez uniformément à divers services via la passerelle.
http://www.goodskill.com/api/order/**
correspond à l'accès au service goodskill-order
http://www.goodskill.com/api/seata/**
correspond à l'accès au service goodskill-seata
http://www.goodskill.com/api/seckill/**
correspond à l'accès au service goodskill-seckill
http://www.goodskill.com/api/auth/**
correspond à l'accès au service goodskill-auth
http://www.goodskill.com/api/web/**
correspond à l'accès au service goodskill-web
Le composant de limitation de courant Sentinel
a été intégré et prend en charge l'envoi de règles de limitation de courant via nacos
. Pour l'utiliser, vous devez démarrer la console Sentinel
et la démarrer avec le port 18088
L'environnement Docker n'est pas encore pris en charge.
Pour la méthode de test de transaction distribuée Seata, consultez les instructions d'exécution de l'exemple de test de transaction distribuée Seata.
La méthode principale exécute la classe GoodskillAdminApplication
(surveillance des indicateurs d'état de santé des microservices)
Le démarrage de l'image Docker es a échoué
Ce problème se produit généralement dans un environnement Linux. Exécutez la commande suivante sysctl -w vm.max_map_count=262144
ou modifiez le fichier /etc/sysctl.conf et ajoutez la configuration suivante :
grep vm.max_map_count /etc/sysctl.conf
vm.max_map_count=262144
Comment utiliser le serveur d'autorisation OAuth2.0 personnalisé dans ce projet pour l'autorisation de connexion ?
A améliorer. .
Quelle est la compatibilité actuelle entre les différents frameworks intégrés au projet ?
Les versions de chaque framework grand public sur lequel s'appuie actuellement ce projet sont relativement nouvelles et n'ont pas été entièrement testées [3] .
Comment résoudre l'erreur « no available service found in cluster 'default', please make sure registry config correct and keep your seata server running
signalée dans la console de démarrage du service ?
Démarrez simplement le service seata-server
(fourni dans le fichier docker-compose.yml). Vous pouvez vous référer au site officiel de Seata pour ajouter les configurations liées à nacos. Si les transactions distribuées ne sont pas utilisées, vous pouvez ignorer cette erreur et cela n'affectera pas le fonctionnement normal du service.
docker-compose ne peut pas extraire l'image
hub.docker est bloqué. Alibaba Cloud Image Accelerator peut être utilisé en Chine. Pour des opérations spécifiques, voir Alibaba Cloud Image Accelerator.
Échec du démarrage du projet à l'aide de JDK 17 ou supérieur
Ajoutez par exemple les paramètres jvm suivants au démarrage :
--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
Actuellement, le contrôle de l'état de l'activité de vente flash est basé sur la machine à états Spring Statemachine. Les avantages de l'utilisation de la machine à états sont les suivants :
Le contrôle unifié du statut d'activité facilite la maintenance centralisée du statut ;
Empêcher que le statut de l'entreprise soit modifié à volonté et garantir des mises à jour contrôlables du statut ;
surface | base de données | S'il faut diviser la bibliothèque | Champ Sous-bibliothèque | S'il faut diviser la table | Champs de sous-table |
---|---|---|---|---|---|
success_killed | MySQL | Oui (dans le même serveur, il est divisé en deux bibliothèques : seckill et seckill_01) | seckill_id | Oui (divisé en deux tables : success_killed_0 et success_kill_1) | utilisateur_téléphone |
? | Aucune des autres tables n'est divisée en bases de données ou en tables. Par défaut, seckill est utilisée comme base de données principale. |
Résolvez le problème de l'échec de la connexion du conteneur Docker à Kafka : https://www.cnblogs.com/hellxz/p/why_cnnect_to_kafka_always_failure.html