Der Name des Projekts, „goodsKill“, bedeutet einerseits einen Flash-Verkauf von Waren (es scheint ein bisschen wie „Chinglish“), andererseits kann er auch als gute Fertigkeit verstanden werden Projekt-Framework und integrieren Sie einige gute Technologien und Entwicklungsfähigkeiten (Bevorzugung von Back-End-Technologie), um das Lernen und Überprüfen zu erleichtern.
Bei diesem Projekt handelt es sich um ein simuliertes Flash-Sale-Projekt, das eine einheitliche Flash-Sale-Simulationsanforderungsschnittstelle bereitstellt. Technisch gesehen verwendet es das Persistenzschicht-Framework von SpringMVC + Mybatis, verwendet Dubbo3.x [1] + Feign, um Schnittstellenaufrufe zwischen Diensten abzuschließen, und verwendet Nacos für Service-Registrierungs-Erkennungs- und Konfigurationscenter-Unterstützung Die Datenbank ist in Datenbanken und Tabellen unterteilt, verteilte Transaktionen und Zustandsmaschinen werden verwendet, um die Konvertierung zwischen Datenzuständen abzuschließen (implementiert basierend auf Spring Statemachine).
Durch die Integration in den KI-Dienst von Spring können simulierte Flash-Verkäufe über KI-Roboter durchgeführt werden.
Der master
-Zweig basiert auf dem neuesten Spring Cloud 2023.x + Spring Boot 3.x + JDK21. Derzeit wird nur die Kernsimulations-Flash-Sale-API-Schnittstelle beibehalten, wenn Sie Spring Boot 2.7.x + JDK11 verwenden müssen Version können Sie zum Tag v2.7.4 wechseln (unterstützte Anmeldung, Registrierung und einfache Hintergrundverwaltungsfunktionen). Der Master-Zweig wird derzeit aktualisiert und seine Funktionen sind nicht stabil genug. Wenn Codefehler auftreten, wird empfohlen, die ältere Version zu verwenden.
Die Funktionen dieses Projekts sind derzeit relativ rudimentär und weisen viele Mängel auf. Das reale Flash-Sale-Szenario ist weitaus komplexer als die Implementierungsmethode in diesem Projekt. Es wird derzeit nur zum Lernen verwendet Referenz: Wenn Sie der Meinung sind, dass dieses Projekt für Sie hilfreich ist, geben Sie ihm bitte einen Stern und unterstützen Sie es.
Anhang: Code Cloud-Projektlink
https://gitee.com/techa/goodsKill
. Wenn die Klongeschwindigkeit langsam ist, verwenden Sie das Code Cloud-Warehouse, um es von Zeit zu Zeit mit Code Cloud zu synchronisieren
Verwendetes Tool oder Framework | Name | Offizielle Website |
---|---|---|
Frühlingsstiefel | Spring Boot Framework | https://spring.io/projects/spring-boot |
MyBatis-Plus | MyBatis-Erweiterungstool | https://mp.baomidou.com/ |
Zookeeper | Verteilter Koordinierungsdienst | http://zookeeper.apache.org/ |
Redis | Verteilte Cache-Datenbank | https://redis.io/ |
Kafka | Nachrichtenwarteschlange | http://kafka.apache.org/ |
RabbitMQ | Nachrichtenwarteschlange | https://www.rabbitmq.com/ |
MongoDB | MongoDB | https://www.mongodb.com/ |
MySQL | MySQL-Datenbank | https://www.mysql.com/ |
Elasticsearch | Volltextsuchmaschine | https://www.elastic.co |
Sharding-JDBC | Unterdatenbank- und Untertabellenkomponenten | https://shardingsphere.apache.org |
Spring Cloud Alibaba | Cloud Alibaba-Komponenten | https://github.com/alibaba/spring-cloud-alibaba |
Apache Dubbo | RPC-Dienst-Remote-Aufruf-Framework | https://github.com/apache/dubbo |
Spring Cloud Gateway | Gateway-Komponente | https://spring.io/projects/spring-cloud-gateway |
Seata | Verteilte Transaktionslösungen | http://seata.io/zh-cn/index.html |
Spring SecurityOAuth2.0 | OAuth2.0-Autorisierungskomponente | https://spring.io/projects/spring-security-oauth |
GraphQL | Eine Abfragesprache für APIs | https://docs.spring.io/spring-graphql/docs/current/reference/html |
Frühlingszustandsmaschine | Federzustandsmaschine | https://spring.io/projects/spring-statemachine |
Sa-Token | Leichtes Autoritätsauthentifizierungs-Framework | https://sa-token.cc/ |
Flugbahn | Tool zur Datenbankversionskontrolle | https://flywaydb.org/ |
MinIO | Objektspeicherdienst | https://min.io/ |
Frühlings-KI | KI-Komponenten | https://spring.io/projects/spring-ai |
WarenKill |--goodskill-admin ||SpringBoot Admin-Überwachungsserver, unterstützt Spring Cloud-Microservice-Erkennung|--goodskill-ai ||AI-Roboter-Chat-Dienst|--goodskill-gateway ||Microservice-API-Gateway, einheitliche Serviceauthentifizierung, unterstützt dynamisches Routenladen |--goodskill-order-provider ||Dienstleister bestellen|--goodskill-seckill-provider ||Seckill-Dienstleister|--goodskill-spring-boot-starter ||Automatische Zusammenstellung der Projektkonfiguration|--goodskill-common ||Öffentliche Dienste (derzeit einschließlich Minio-Upload- und Download-Funktionen) |--goodskill-web ||Zugriff auf die Flash-Kill-Simulationsschnittstelle bereitstellen|--goodskill-job ||geplante Aufgabe für elastische Jobs|--goodskill-seata ||Beispiel einer verteilten Transaktionslösung, die nacos+dubbo+shardingjdbc+seata integriert| - -goodskill-auth ||Auth-Anmelde- und Autorisierungsmodul |--auth-service ||Benutzer-Anmeldeautorisierungsdienst basierend auf dem Sa-Token-Framework |--oauth2-auth-server ||oauth2.0-Anmeldeautorisierungsserver, angepasster Anmeldeautorisierungsdienst |--oauth2-resource-server ||oauth2.0-Ressourcenserverseite, maßgeschneiderter Login-Autorisierungsdienst
Derzeit wurden mehrere Flash-Killing-Lösungen implementiert, und die Testschnittstelle wird über SeckillMockController
Aggregations-Gateway-Openapi-Dokumentadresse: http://localhost/doc.html#/home
(Gateway-Dienst muss aktiviert werden)
Überwachungsadresse der Spring Boot Admin-Anwendung: http://www.goodskill.com:19031
, Login-Benutzername und Passwort: user/123456
Szenario 1: Implementierung einer synchronisierten Synchronisierungssperre
Szenario 2: Implementierung einer verteilten Redisson-Sperre
Szenario 3: ActiveMQ-Implementierung (veraltet)
Szenario 4: Implementierung der Kafka-Nachrichtenwarteschlange
Szenario 5: Atomare Aktualisierung der Datenbank
Szenario 6: Warten auf Flash-Sale-Verarbeitungsergebnisse in Echtzeit (veraltet)
Szenario 7: Verteilte ZooKeeper-Sperre
Szenario 8: Verwenden Sie Redis, um den Bestand an Flash-Sale-Produkten zu reduzieren, senden Sie MQ asynchron nach Ende des Flash-Sales und verwenden Sie MongoDB, um die Datenlandung abzuschließen.
Szenario 9: Spring Cloud Stream-Implementierung
Szenario 10: Sentinel-Strombegrenzung + atomare Datenbankaktualisierung (muss mit der Sentinel-Konsole konfiguriert werden, um die Flusskontrollregeln der limit
zu konfigurieren)
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
Docker-Image verwendet
Spiegel | Version | Hafen | Benutzername und Passwort |
---|---|---|---|
Nacos | 2.3.2-schlank | 8848 | nacos:nacos (Konsole) |
Redis | letzte | 6379 | Passwort: 123456 |
Kafka | 3.1.1 | 9092 | keiner |
KafkaManager | letzte | 9001:9000 | keiner |
Mongo | 6.0.7 | 27017 | keiner |
MySQL | 8.0.29 | 3306 | root:Passwort123 |
Tierpfleger | 3.6.2 | 2181 | keiner |
Elasticsearch | 7.17.3 | 9200 9300 | keiner |
Kibana | 7.17.3 | 5601 | keiner |
RabbitMQ | letzte | 5672 15672 | keiner |
MinIO | letzte | 9000 | root:passwort |
Seata | 2.0.0 | 7091 8091 | seata:seata (Konsole) |
Im Projektstammverzeichnis goodsKill
ausführen
MVN-Neuinstallation Oder #skip Unit Tests MVN Clean Install -DskipTests
Der Standardport startet Nacos, Redis, MySQL, Rabbitmq, Kafka, Zookeeper, Elasticsearch, SeataServer oder verwendet den Befehl docker-compose [2] :
docker-compose -f goodskill-simple.yml up -d
Geben Sie das Verzeichnis goodskill-web/src/main/sql
ein, suchen Sie die Datei seckill.sql
, richten Sie das seckill
Warehouse in der lokalen MySQL-Datenbank ein und führen Sie Dateninitialisierungsvorgänge durch.
Wenn Docker-Compose das MySQL-Image startet, führt es automatisch das Initialisierungsskript aus. Wenn Sie den vorherigen Schritt bereits ausgeführt haben, können Sie diesen Schritt überspringen. |
Host konfigurieren
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
Fügen Sie im Nacos-Konfigurationscenter öffentliche Konfigurationen mit der Daten-ID goodskill-common-connection.yml
(öffentliche Middleware-Konfiguration) und goodskill-common.yml
DEFAULT_GROUP
öffentliche Dienstkonfiguration) hinzu. Weitere Informationen finden Sie im Projekt goodskill-common-connection.yml
. Stammverzeichnis. goodskill-common-connection.yml
, goodskill-common.yml
-Dateien
Die Hauptmethode führt die OrderApplication
Klasse (Bestelldienst) aus.
Die Hauptmethode führt die SeckillApplication
Klasse (Seckill-Verwaltungsdienstanbieter) aus.
Die Hauptmethode führt die SampleWebApplication
-Klasse aus (simuliert den Flash-Sale-Webdienst).
Senden Sie eine Flash-Sale-Simulationsanfrage: Flash-Sale-Aktivitäts-ID 1000, Produktmenge 10, führen Sie 20 Kaufvorgänge durch, verwenden Sie eine synchronisierte Synchronisierungssperre, um Folgendes auszuführen:
Sie können den folgenden Befehl direkt verwenden, um eine simulierte Flash-Sale-Aktivität seckillId zu senden. Jedes Mal, wenn die Schnittstelle ausgeführt wird, kann es zu einer Inventarinitialisierungsaktion kommen immer wieder aufgerufen werden.
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
} '
Die Anfrage wird standardmäßig asynchron ausgeführt. Sie können das Ausführungsprotokoll auf der Konsole anzeigen. Wenn die Anzahl der endgültigen erfolgreichen Transaktionen der Anzahl der Artikel 10 entspricht, bedeutet dies, dass kein Über- oder Unterverkaufsproblem vorliegt.
Ein einfacher Flash-Sale-Roboterdienst, der auf Spring AI Alibaba basiert. Serviceaufrufe können über den Roboterdienst abgeschlossen werden. Derzeit unterstützt er nur das Öffnen von Flash-Sale-Aktivitäten und die Ausgabe des Zeitaufwands der Aktivität.
Geben Sie das Modul goodskill-ai
ein und ersetzen Sie die Konfiguration spring.ai.dashscope.api-key
, die über die Alibaba Cloud Bailian-Plattform abgerufen werden kann
Die Hauptmethode führt die AiBotApplication
-Klasse aus und greift auf die Chat-Seite http://127.0.0.1:18077
zu
Hier ist ein Beispielgespräch
我: 帮我执行秒杀
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%希望这些信息对您有帮助!如果还有其他问题或需要进一步的帮助,请随时告诉我哦!?
Fügen Sie die folgenden Schritte zum Schnellstartabschnitt hinzu, um ein vollständiges Projekt zu starten
Geben Sie das Modul goodskill-gateway
ein, starten Sie das Service-Gateway über die Hauptmethode GatewayBootApplication
-Klasse und greifen Sie über das Gateway einheitlich auf verschiedene Dienste zu.
http://www.goodskill.com/api/order/**
entspricht dem Zugriff auf den goodskill-order
Service
http://www.goodskill.com/api/seata/**
entspricht dem Zugriff auf den Dienst goodskill-seata
http://www.goodskill.com/api/seckill/**
entspricht dem Zugriff auf den Dienst goodskill-seckill
http://www.goodskill.com/api/auth/**
entspricht dem Zugriff auf den Dienst goodskill-auth
http://www.goodskill.com/api/web/**
entspricht dem Zugriff auf den Dienst goodskill-web
.
Die Sentinel
Strombegrenzungskomponente wurde integriert und unterstützt die Übertragung von Strombegrenzungsregeln über nacos
-Konfigurationscenter. Um sie zu verwenden, müssen Sie die Sentinel
-Konsole starten und sie mit Port 18088
starten. Die Docker-Umgebung wird noch nicht unterstützt.
Informationen zur verteilten Transaktionstestmethode von Seata finden Sie in den Beispielausführungsanweisungen für den verteilten Transaktionstest von Seata.
Die Hauptmethode führt die GoodskillAdminApplication
-Klasse aus (Überwachung des Mikroservice-Gesundheitsstatusindikators).
Der Start des Docker-ES-Images ist fehlgeschlagen
Dieses Problem tritt normalerweise in einer Linux-Umgebung auf. Führen Sie den folgenden Befehl aus sysctl -w vm.max_map_count=262144
oder ändern Sie die Datei /etc/sysctl.conf und fügen Sie die folgende Konfiguration hinzu:
grep vm.max_map_count /etc/sysctl.conf
vm.max_map_count=262144
Wie verwende ich den in diesem Projekt angepassten OAuth2.0-Autorisierungsserver für die Anmeldeautorisierung?
Zu verbessern. .
Wie ist die aktuelle Kompatibilität zwischen den verschiedenen im Projekt integrierten Frameworks?
Die Versionen jedes Mainstream-Frameworks, auf die sich dieses Projekt derzeit stützt, sind relativ neu und wurden noch nicht vollständig getestet [3] .
Wie kann der in der Dienststartkonsole gemeldete Fehler „ no available service found in cluster 'default', please make sure registry config correct and keep your seata server running
?
Starten Sie einfach den seata-server
Dienst (bereitgestellt in der Datei docker-compose.yml). Informationen zum Hinzufügen von Nacos-bezogenen Konfigurationen finden Sie auf der offiziellen Website von Seata. Wenn keine verteilten Transaktionen verwendet werden, können Sie diesen Fehler ignorieren und er hat keine Auswirkungen auf den normalen Betrieb des Dienstes.
Docker-Compose kann das Bild nicht abrufen
hub.docker ist blockiert. Informationen zu spezifischen Vorgängen finden Sie unter Alibaba Cloud Image Accelerator.
Das Projekt konnte mit JDK17 oder höher nicht gestartet werden
Fügen Sie beim Start beispielsweise die folgenden JVM-Parameter hinzu:
--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
Derzeit basiert die Steuerung des Flash-Sale-Aktivitätsstatus auf der Spring Statemachine-Zustandsmaschine. Die Vorteile der Verwendung der Zustandsmaschine sind:
Eine einheitliche Kontrolle des Aktivitätsstatus erleichtert die zentrale Statuspflege;
Verhindern Sie, dass der Geschäftsstatus nach Belieben geändert wird, und stellen Sie kontrollierbare Statusaktualisierungen sicher.
Oberfläche | Datenbank | Ob die Bibliothek geteilt werden soll | Feld „Nebenbibliothek“. | Ob der Tisch geteilt werden soll | Untertabellenfelder |
---|---|---|---|---|---|
success_killed | MySQL | Ja (auf demselben Server ist es in zwei Bibliotheken unterteilt: seckill und seckill_01) | seckill_id | Ja (aufgeteilt in zwei Tabellen: success_killed_0 und success_kill_1) | user_phone |
? | Keine der anderen Tabellen ist in Datenbanken oder Tabellen unterteilt. Standardmäßig wird seckill als Hauptdatenbank verwendet. |
Lösen Sie das Problem des Verbindungsfehlers des Docker-Containers zu Kafka: https://www.cnblogs.com/hellxz/p/why_cnnect_to_kafka_always_failure.html