Nama proyeknya, itemsKill, di satu sisi berarti penjualan kilat barang (sepertinya agak mirip chinglish), dan di sisi lain, juga dapat dipahami sebagai keterampilan yang baik . Proyek ini diharapkan dapat dibangun secara lengkap kerangka proyek dan mengintegrasikan beberapa teknologi yang baik dan keterampilan pengembangan (Menyukai teknologi back-end) untuk pembelajaran dan peninjauan yang mudah.
Proyek ini adalah proyek penjualan flash simulasi yang menyediakan antarmuka permintaan simulasi penjualan flash terpadu. Secara teknis, proyek ini mengadopsi kerangka lapisan persistensi SpringMVC + Mybatis, menggunakan Dubbo3.x [1] + Feign untuk menyelesaikan panggilan antarmuka antar layanan, dan menggunakan Nacos untuk pusat penemuan dan konfigurasi pendaftaran layanan. Dukungan Basis data dibagi menjadi basis data dan tabel, transaksi terdistribusi, dan mesin negara digunakan untuk menyelesaikan konversi antar status data (diimplementasikan berdasarkan Spring Statemachine).
Terintegrasi dengan layanan Spring AI, simulasi penjualan kilat dapat diselesaikan melalui robot AI.
Cabang master
dibangun berdasarkan sistem Spring Cloud 2023.x + Spring Boot 3.x + JDK21 terbaru. Saat ini, hanya antarmuka API penjualan flash simulasi inti yang dipertahankan versi, Anda dapat beralih ke tag v2.7.4 (mendukung fungsi Login, registrasi, dan manajemen latar belakang sederhana). Cabang master sedang ditingkatkan dan fungsinya tidak cukup stabil. Jika Anda menemukan kesalahan kode, disarankan untuk menggunakan versi yang lebih lama.
Fungsi proyek ini saat ini relatif belum sempurna dan memiliki banyak ketidaksempurnaan. Skenario Flash Sale yang sebenarnya jauh lebih kompleks daripada metode implementasi dalam proyek ini. Proyek ini menghilangkan beberapa rincian teknis implementasi dalam skenario nyata. Saat ini hanya digunakan untuk pembelajaran referensi Jika menurut Anda proyek ini bermanfaat bagi Anda, tolong beri bintang dan dukung ~~ .
Lampiran: Tautan proyek Code Cloud
https://gitee.com/techa/goodsKill
. Jika kecepatan klon lambat, gunakan gudang Code Cloud untuk menariknya dari waktu ke waktu~
Alat atau kerangka yang digunakan | nama | Situs web resmi |
---|---|---|
Sepatu Musim Semi | Kerangka Boot Musim Semi | https://spring.io/projects/spring-boot |
MyBatis-Plus | Alat peningkatan MyBatis | https://mp.baomidou.com/ |
Penjaga Kebun Binatang | Layanan koordinasi terdistribusi | http://zookeeper.apache.org/ |
ulang | Basis data cache terdistribusi | https://redis.io/ |
Kafka | antrian pesan | http://kafka.apache.org/ |
KelinciMQ | antrian pesan | https://www.rabbitmq.com/ |
MongoDB | MongoDB | https://www.mongodb.com/ |
MySQL | basis data MySQL | https://www.mysql.com/ |
Pencarian elastis | Mesin pencari teks lengkap | https://www.elastis.co |
Sharding-JDBC | Komponen sub-database dan sub-tabel | https://shardingsphere.apache.org |
Awan Musim Semi Alibaba | Komponen Cloud Alibaba | https://github.com/alibaba/spring-cloud-alibaba |
Apache Dubbo | Kerangka panggilan jarak jauh layanan RPC | https://github.com/apache/dubbo |
Gerbang Awan Musim Semi | Komponen gerbang | https://spring.io/projects/spring-cloud-gateway |
tempat duduk | Solusi transaksi terdistribusi | http://seata.io/zh-cn/index.html |
Keamanan Musim SemiOAuth2.0 | Komponen otorisasi OAuth2.0 | https://spring.io/projects/spring-security-oauth |
GrafikQL | Bahasa kueri untuk API | https://docs.spring.io/spring-graphql/docs/current/reference/html |
Mesin Negara Musim Semi | Mesin keadaan pegas | https://spring.io/projects/spring-statemachine |
Sa-Token | Kerangka otentikasi otoritas yang ringan | https://sa-token.cc/ |
Jalur Terbang | Alat kontrol versi basis data | https://flywaydb.org/ |
MiniO | Layanan penyimpanan objek | https://min.io/ |
AI musim semi | komponen AI | https://spring.io/projects/spring-ai |
barangBunuh |--goodskill-admin ||Server pemantauan Admin SpringBoot, mendukung penemuan layanan mikro Spring Cloud|--goodskill-ai ||Layanan obrolan robot AI|--goodskill-gateway ||Gerbang API layanan mikro, autentikasi layanan terpadu, Mendukung pemuatan rute dinamis |--goodskill-order-provider ||Penyedia layanan pemesanan|--goodskill-seckill-provider ||Penyedia layanan seckill|--goodskill-spring-boot-starter ||Perakitan otomatis konfigurasi proyek|--goodskill-common ||Layanan publik (saat ini termasuk fungsi unggah dan unduh minio) |--goodskill-web ||Menyediakan akses antarmuka simulasi flash kill|--goodskill-job ||tugas terjadwal pekerjaan elastis|--goodskill-seata ||Contoh solusi transaksi terdistribusi yang mengintegrasikan nacos+dubbo+shardingjdbc+seata| -goodskill-auth ||modul login dan otorisasi auth| ||Layanan otorisasi login pengguna berdasarkan kerangka Sa-Token |--oauth2-auth-server ||oauth2.0 server otorisasi login, layanan otorisasi login yang disesuaikan |--oauth2-resource-server ||oauth2.0 sumber daya Sisi server, layanan otorisasi login yang disesuaikan
Saat ini, beberapa solusi flash killer telah diterapkan, dan antarmuka pengujian disediakan melalui SeckillMockController
Alamat dokumen Openapi gateway agregasi: http://localhost/doc.html#/home
(perlu mengaktifkan layanan gateway)
Alamat pemantauan aplikasi Spring Boot Admin: http://www.goodskill.com:19031
, nama pengguna login dan kata sandi: pengguna/123456
Skenario 1: Penerapan kunci sinkronisasi tersinkronisasi
Skenario 2: Penerapan kunci terdistribusi Redisson
Skenario 3: Implementasi ActiveMQ (usang)
Skenario 4: Implementasi antrian pesan Kafka
Skenario 5: Pembaruan atom basis data
Skenario 6: Menunggu hasil pemrosesan flash sale secara real time (usang)
Skenario 7: ZooKeeper mendistribusikan kunci
Skenario 8: Gunakan Redis untuk mengurangi inventaris produk penjualan kilat, kirim MQ secara asinkron setelah penjualan kilat berakhir, dan gunakan MongoDB untuk menyelesaikan pendaratan data.
Skenario 9: Implementasi Spring Cloud Stream
Skenario 10: Pembatasan arus Sentinel + pembaruan atom basis data (perlu dikonfigurasi dengan konsol Sentinel untuk mengonfigurasi aturan kontrol aliran limit
nama sumber daya)
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: BukaJDK21
Sharding-JDBC: 5.5.0
SpringCloud: 2023.xx
SpringBoot: 3.3.x
SpringCloudAlibaba: 2023.xx
Apache Dubbo: 3.3.x
Gambar Docker digunakan
cermin | Versi | pelabuhan | Nama pengguna dan kata sandi |
---|---|---|---|
Naco | 2.3.2-ramping | 8848 | nacos:nacos (konsol) |
ulang | terbaru | 6379 | Kata sandi:123456 |
Kafka | 3.1.1 | 9092 | tidak ada |
Manajer Kafka | terbaru | 9001:9000 | tidak ada |
mongo | 6.0.7 | 27017 | tidak ada |
MySQL | 8.0.29 | 3306 | akar: Kata Sandi123 |
Penjaga kebun binatang | 3.6.2 | 2181 | tidak ada |
Pencarian elastis | 7.17.3 | 9200 9300 | tidak ada |
Kibana | 7.17.3 | 5601 | tidak ada |
KelinciMQ | terbaru | 5672 15672 | tidak ada |
MiniO | terbaru | 9000 | akar: kata sandi |
tempat duduk | 2.0.0 | 7091 8091 | seata:seata (konsol) |
Jalankan di direktori root proyek goodsKill
instalasi bersih mvn Atau #skip unit test mvn clean install -DskipTests
Port default dimulai nacos, redis, mysql, Rabbitmq, kafka, zookeeper, elasticsearch, seataServer, atau gunakan perintah docker-compose [2] :
docker-compose -f goodskill-simple.yml up -d
Masuk ke direktori goodskill-web/src/main/sql
, temukan file seckill.sql
, buat gudang seckill
di database mysql lokal dan lakukan operasi inisialisasi data.
Ketika docker-compose memulai image MySQL, maka secara otomatis skrip inisialisasi akan dijalankan. Jika Anda sudah melakukan langkah sebelumnya, Anda dapat melewati langkah ini. |
Konfigurasikan tuan rumah
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
Di pusat konfigurasi Nacos, tambahkan konfigurasi publik dengan DataId dari goodskill-common-connection.yml
DEFAULT_GROUP
konfigurasi goodskill-common-connection.yml
middleware) dan goodskill-common.yml
(konfigurasi publik layanan). direktori root proyek. goodskill-common-connection.yml
, file goodskill-common.yml
Metode utama menjalankan kelas OrderApplication
(layanan pesanan)
Metode utama menjalankan kelas SeckillApplication
(penyedia layanan manajemen seckill)
Metode utama menjalankan kelas SampleWebApplication
(mensimulasikan layanan web penjualan flash)
Kirim permintaan simulasi penjualan kilat: ID aktivitas penjualan kilat 1000, jumlah produk 10, lakukan 20 operasi pembelian, gunakan kunci sinkronisasi tersinkronisasi untuk mengeksekusi, misalnya:
Anda dapat langsung menggunakan perintah berikut untuk mengirim simulasi permintaan penjualan kilat. Setiap aktivitas penjualan kilat seckillId sesuai dengan ID produk unik. Setiap kali antarmuka dijalankan, akan ada tindakan inisialisasi inventaris dipanggil berulang kali.
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
} '
Permintaan dijalankan secara asinkron secara default. Anda dapat melihat log eksekusi di konsol. Jika jumlah transaksi akhir yang berhasil sama dengan jumlah item 10, berarti tidak ada masalah oversold atau undersold.
Layanan robot flash sale sederhana yang dibangun berdasarkan Spring AI Alibaba. Panggilan layanan dapat diselesaikan melalui layanan robot. Saat ini, hanya mendukung aktivitas pembukaan flash sale dan menampilkan konsumsi waktu aktivitas.
Masuk ke modul goodskill-ai
dan ganti konfigurasi spring.ai.dashscope.api-key
, yang dapat diperoleh melalui platform Alibaba Cloud Bailian
Metode utama menjalankan kelas AiBotApplication
dan mengakses halaman obrolan http://127.0.0.1:18077
Berikut ini contoh percakapannya
我: 帮我执行秒杀
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%希望这些信息对您有帮助!如果还有其他问题或需要进一步的帮助,请随时告诉我哦!?
Tambahkan langkah-langkah berikut ke bagian mulai cepat untuk memulai proyek lengkap
Masuk ke modul goodskill-gateway
, mulai gateway layanan melalui metode utama kelas GatewayBootApplication
, dan akses berbagai layanan secara seragam melalui gateway.
http://www.goodskill.com/api/order/**
berhubungan dengan mengakses layanan goodskill-order
http://www.goodskill.com/api/seata/**
sesuai dengan mengakses layanan goodskill-seata
http://www.goodskill.com/api/seckill/**
berhubungan dengan mengakses layanan goodskill-seckill
http://www.goodskill.com/api/auth/**
berhubungan dengan mengakses layanan goodskill-auth
http://www.goodskill.com/api/web/**
berhubungan dengan mengakses layanan goodskill-web
Komponen pembatas arus Sentinel
telah terintegrasi dan mendukung penerapan aturan pembatas arus melalui pusat konfigurasi nacos
. Untuk menggunakannya, Anda perlu memulai konsol Sentinel
dan memulainya dengan port 18088
Lingkungan buruh pelabuhan belum didukung.
Untuk metode pengujian transaksi terdistribusi Seata, lihat instruksi menjalankan contoh pengujian transaksi terdistribusi Seata.
Metode utama menjalankan kelas GoodskillAdminApplication
(pemantauan indikator status kesehatan layanan mikro)
startup gambar docker es gagal
Masalah ini biasanya terjadi di lingkungan Linux. Jalankan perintah berikut sysctl -w vm.max_map_count=262144
, atau ubah file /etc/sysctl.conf dan tambahkan konfigurasi berikut:
grep vm.max_map_count /etc/sysctl.conf
vm.max_map_count=262144
Bagaimana cara menggunakan server otorisasi OAuth2.0 yang disesuaikan dalam proyek ini untuk otorisasi login?
Untuk ditingkatkan. .
Apa kompatibilitas saat ini antara berbagai kerangka kerja yang diintegrasikan ke dalam proyek?
Versi setiap kerangka utama yang saat ini diandalkan oleh proyek ini relatif baru dan belum sepenuhnya diuji [3] .
Bagaimana mengatasi kesalahan " no available service found in cluster 'default', please make sure registry config correct and keep your seata server running
yang dilaporkan di konsol startup layanan?
Jalankan saja layanan seata-server
(sudah disediakan di file docker-compose.yml). Anda dapat merujuk ke situs resmi Seata untuk menambahkan konfigurasi terkait nacos. Jika transaksi terdistribusi tidak digunakan, Anda dapat mengabaikan kesalahan ini dan ini tidak akan mempengaruhi pengoperasian normal layanan.
docker-compose tidak dapat menarik gambar
hub.docker diblokir. Alibaba Cloud Image Accelerator dapat digunakan di Tiongkok.
Gagal memulai proyek menggunakan JDK17 atau lebih tinggi
Tambahkan parameter jvm berikut saat memulai, misalnya:
--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
Saat ini pengendalian status aktivitas flash sale didasarkan pada state machine Spring Statemachine. Keuntungan menggunakan state machine adalah:
Kontrol terpadu atas status aktivitas memfasilitasi pemeliharaan status terpusat;
Mencegah status bisnis diubah sesuka hati dan memastikan pembaruan status dapat dikontrol;
permukaan | basis data | Apakah akan membagi perpustakaan | Bidang sub-perpustakaan | Apakah akan membagi meja | Bidang sub-tabel |
---|---|---|---|---|---|
sukses_terbunuh | MySQL | Ya (di server yang sama, ini dibagi menjadi dua perpustakaan: seckill dan seckill_01) | seckill_id | Ya (dibagi menjadi dua tabel: sukses_killed_0 dan sukses_kill_1) | pengguna_telepon |
? | Tidak ada tabel lain yang dibagi menjadi database atau tabel. Secara default, seckill digunakan sebagai database utama. |
Selesaikan masalah kegagalan koneksi kontainer Docker ke Kafka: https://www.cnblogs.com/hellxz/p/why_cnnect_to_kafka_always_failure.html