اسم المشروع، GoodKill، من ناحية، يعني البيع السريع للسلع (يبدو أنه يشبه إلى حد ما chinglish)، ومن ناحية أخرى، يمكن أيضًا فهمه على أنه مهارة جيدة ، ويأمل هذا المشروع في بناء مشروع كامل إطار المشروع ودمج بعض التقنيات الجيدة ومهارات التطوير (تفضيل التكنولوجيا الخلفية) لسهولة التعلم والمراجعة.
هذا المشروع عبارة عن مشروع محاكاة بيع فلاش يوفر واجهة موحدة لطلب محاكاة بيع فلاش من الناحية الفنية، وهو يعتمد إطار طبقة الثبات SpringMVC + Mybatis، ويستخدم Dubbo3.x [1] + Feign لإكمال مكالمات الواجهة بين الخدمات، ويستخدم Nacos لـ. مركز اكتشاف وتكوين الخدمة. يتم تقسيم قاعدة البيانات إلى قواعد بيانات وجداول، ويتم استخدام المعاملات الموزعة وأجهزة الحالة لإكمال التحويل بين حالات البيانات (يتم تنفيذها بناءً على Spring Statemachine).
متكاملة مع خدمة Spring AI، يمكن إكمال مبيعات الفلاش المحاكاة من خلال روبوتات الذكاء الاصطناعي.
تم إنشاء الفرع master
استنادًا إلى أحدث نظام Spring Cloud 2023.x + Spring Boot 3.x + JDK21. حاليًا، يتم الاحتفاظ فقط بواجهة برمجة تطبيقات محاكاة الفلاش الأساسية إذا كنت بحاجة إلى استخدام Spring Boot 2.7.x + JDK11 الإصدار، يمكنك التبديل إلى العلامة v2.7.4 (دعم تسجيل الدخول والتسجيل ووظائف إدارة الخلفية البسيطة). يتم حاليًا ترقية الفرع الرئيسي ووظائفه ليست مستقرة بدرجة كافية. إذا واجهت أخطاء في التعليمات البرمجية، فمن المستحسن استخدام الإصدار الأقدم.
تعتبر وظائف هذا المشروع حاليًا بدائية نسبيًا وبها العديد من العيوب. يعد سيناريو Flash Sale الحقيقي أكثر تعقيدًا بكثير من طريقة التنفيذ في هذا المشروع. يحذف هذا المشروع بعض تفاصيل التنفيذ الفني في السيناريو الحقيقي، ويستخدم حاليًا للتعلم فقط مرجع إذا كنت تعتقد أن هذا المشروع مفيد لك، يرجى إعطائه نجمة ودعمه؟
المرفق: رابط مشروع Code Cloud
https://gitee.com/techa/goodsKill
إذا كانت سرعة النسخ بطيئة، فاستخدم مستودع Code Cloud لسحبه للمزامنة مع Code Cloud من وقت لآخر ~
الأداة أو الإطار المستخدم | اسم | الموقع الرسمي |
---|---|---|
التمهيد الربيع | إطار التمهيد الربيعي | https://spring.io/projects/spring-boot |
ماي باتيس بلس | أداة تحسين MyBatis | https://mp.baomidou.com/ |
ZooKeeper | خدمة التنسيق الموزعة | http://zookeeper.Apache.org/ |
ريديس | قاعدة بيانات ذاكرة التخزين المؤقت الموزعة | https://redis.io/ |
كافكا | قائمة انتظار الرسائل | http://kafka.Apache.org/ |
RabbitMQ | قائمة انتظار الرسائل | https://www.rabbitmq.com/ |
MongoDB | MongoDB | https://www.mongodb.com/ |
ماي إس كيو إل | قاعدة بيانات ماي اس كيو ال | https://www.mysql.com/ |
بحث مرن | محرك بحث النص الكامل | https://www.elastic.co |
مشاركة-JDBC | قاعدة البيانات الفرعية ومكونات الجدول الفرعي | https://shardingsphere.Apache.org |
سحابة الربيع علي بابا | مكونات سحابة علي بابا | 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 |
ربيع الأمنOAuth2.0 | مكون ترخيص OAuth2.0 | https://spring.io/projects/spring-security-oauth |
GraphQL | لغة استعلام لواجهات برمجة التطبيقات | https://docs.spring.io/spring-graphql/docs/current/reference/html |
آلة الدولة الربيعية | آلة حالة الربيع | https://spring.io/projects/spring-statemachine |
سا-توكين | إطار مصادقة سلطة خفيف الوزن | https://sa-token.cc/ |
مسار الهجرة | أداة التحكم في إصدار قاعدة البيانات | https://flywaydb.org/ |
MiniIO | خدمة تخزين الكائنات | https://min.io/ |
الربيع لمنظمة العفو الدولية | مكونات الذكاء الاصطناعي | https://spring.io/projects/spring-ai |
com.goodsKill |--goodskill-admin ||خادم مراقبة مسؤول SpringBoot، يدعم اكتشاف الخدمات الصغيرة لـ Spring Cloud|--goodskill-ai ||خدمة الدردشة الروبوتية ذات الذكاء الاصطناعي|--goodskill-gateway ||بوابة واجهة برمجة تطبيقات Microservice، مصادقة الخدمة الموحدة، دعم تحميل المسار الديناميكي |--مزود طلب Goodskill ||مزود خدمة الطلب|--goodskill-seckill-provider ||مزود خدمة Seckill|--goodskill-spring-boot-starter ||التجميع التلقائي لتكوين المشروع|--goodskill-common ||الخدمات العامة (تتضمن حاليًا وظائف تحميل وتنزيل minio) |--goodskill-web ||توفير الوصول إلى واجهة محاكاة القتل السريع|-goodskill-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: تنفيذ قائمة انتظار رسائل كافكا
السيناريو 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分布式锁实现)
جدك: OpenJDK21
المشاركة-JDBC: 5.5.0
SpringCloud: 2023.xx
سبرينج بوت: 3.3.x
SpringCloud علي بابا: 2023.xx
أباتشي دوبو: 3.3.x
صورة عامل الميناء المستخدمة
مرآة | إصدار | ميناء | اسم المستخدم وكلمة المرور |
---|---|---|---|
ناكو | 2.3.2-نحيف | 8848 | ناكوس: ناكوس (وحدة التحكم) |
ريديس | أحدث | 6379 | كلمة المرور:123456 |
كافكا | 3.1.1 | 9092 | لا أحد |
KafkaManager | أحدث | 9001:9000 | لا أحد |
مونجو | 6.0.7 | 27017 | لا أحد |
ماي إس كيو إل | 8.0.29 | 3306 | الجذر: كلمة المرور123 |
حارس حديقة الحيوان | 3.6.2 | 2181 | لا أحد |
بحث مرن | 7.17.3 | 9200 9300 | لا أحد |
كيبانا | 7.17.3 | 5601 | لا أحد |
RabbitMQ | أحدث | 5672 15672 | لا أحد |
MiniIO | أحدث | 9000 | الجذر:كلمة المرور |
سياتا | 2.0.0 | 7091 8091 | سيتا: سياتا (وحدة التحكم) |
يتم تنفيذه في الدليل الجذر للمشروع goodsKill
تثبيت mvn النظيف أو #تخطي اختبارات الوحدة mvn clean install -DskipTests
يبدأ المنفذ الافتراضي nacos، أو redis، أو mysql، أو Rabbitmq، أو kafka، أو Zookeeper، أو Elasticsearch، أو SeataServer، أو استخدم الأمر docker-compose [2] :
docker-compose -f goodskill-simple.yml up -d
أدخل دليل 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.yml
(المجموعة العامة للخدمة هي DEFAULT_GROUP
للحصول على التفاصيل، يرجى الرجوع إلى goodskill-common-connection.yml
في المشروع الدليل الجذر goodskill-common-connection.yml
وملفات goodskill-common.yml
تعمل الطريقة الرئيسية على تشغيل فئة OrderApplication
(خدمة الطلب)
تعمل الطريقة الرئيسية على تشغيل فئة SeckillApplication
(مزود خدمة إدارة seckill)
تعمل الطريقة الرئيسية على تشغيل فئة SampleWebApplication
(محاكاة خدمة الويب لبيع الفلاش)
إرسال طلب محاكاة بيع فلاش: معرف نشاط بيع فلاش 1000، كمية المنتج 10، تنفيذ 20 عملية شراء، استخدم قفل المزامنة المتزامن للتنفيذ، على سبيل المثال:
يمكنك استخدام الأمر التالي مباشرةً لإرسال طلب بيع فلاش محاكى. يتوافق كل نشاط بيع فلاش مع معرف منتج فريد في كل مرة يتم فيها تنفيذ الواجهة، سيكون هناك إجراء تهيئة للمخزون بعد تنفيذ الواجهة يتم استدعاؤها مرارا وتكرارا.
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-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-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
(مراقبة مؤشر الحالة الصحية للخدمات الصغيرة)
فشل بدء تشغيل صورة عامل الإرساء
تحدث هذه المشكلة عادةً في بيئة 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.
التحكم الموحد في حالة النشاط يسهل صيانة الحالة المركزية؛
منع تغيير حالة العمل حسب الرغبة والتأكد من تحديثات الحالة التي يمكن التحكم فيها؛
سطح | قاعدة البيانات | سواء لتقسيم المكتبة | مجال المكتبات الفرعية | سواء لتقسيم الجدول | حقول الجدول الفرعي |
---|---|---|---|---|---|
Success_killed | ماي إس كيو إل | نعم (في نفس الخادم، يتم تقسيمه إلى مكتبتين: 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