プロジェクト名の「goodsKill」は、商品のフラッシュセールを意味する一方で(ちょっとチングリッシュに似ています)、他方では、このプロジェクトは完全なスキルを構築することを望んでいます。プロジェクトのフレームワークを作成し、いくつかの優れたテクノロジーと開発スキル (バックエンド テクノロジーを優先) を統合して、学習とレビューを容易にします。
このプロジェクトは、統一されたフラッシュ セール シミュレーション リクエスト インターフェイスを提供するシミュレーション フラッシュ セール プロジェクトです。技術的には、SpringMVC + Mybatis 永続層フレームワークを採用し、Dubbo3.x [1] + Feign を使用してサービス間インターフェイス呼び出しを完了し、Nacos を使用します。サービス登録検出および構成センターのサポート データベースはデータベースとテーブルに分割され、分散トランザクションとステート マシンがデータ状態間の変換を完了するために使用されます (Spring Statemachine に基づいて実装されています)。
Spring AIサービスと統合され、AIロボットを通じて疑似フラッシュ販売を完了できます。
master
ブランチは、最新の Spring Cloud 2023.x + Spring Boot 3.x + JDK21 システムに基づいて構築されています。現在、Spring Boot 2.7.x + JDK11 を使用する必要がある場合は、コア シミュレーション フラッシュ セール API インターフェイスのみが保持されます。バージョンが異なる場合は、タグ v2.7.4 に切り替えることができます (ログイン、登録、および簡単なバックグラウンド管理機能をサポート)。 master ブランチは現在アップグレード中のため、機能が十分に安定していないため、コード エラーが発生した場合は、古いバージョンを使用することをお勧めします。
このプロジェクトの機能は現時点では比較的初歩的であり、多くの不完全性があります。実際のフラッシュ セール シナリオは、このプロジェクトの実装方法よりもはるかに複雑です。このプロジェクトは、現在、学習のためにのみ使用されています。このプロジェクトが役立つと思われる場合は、スターを付けてサポートしてください。
添付: Code Cloud プロジェクトのリンク
https://gitee.com/techa/goodsKill
。クローンの速度が遅い場合は、Code Cloud ウェアハウスを使用して時々 Code Cloud に同期してください。
使用するツールまたはフレームワーク | 名前 | 公式サイト |
---|---|---|
スプリングブーツ | スプリングブートフレームワーク | https://spring.io/projects/spring-boot |
MyBatis-Plus | MyBatis 拡張ツール | https://mp.baomidou.com/ |
動物園の飼育員 | 分散調整サービス | http://zookeeper.apache.org/ |
レディス | 分散キャッシュデータベース | https://redis.io/ |
カフカ | メッセージキュー | http://kafka.apache.org/ |
ラビットMQ | メッセージキュー | https://www.rabbitmq.com/ |
モンゴDB | モンゴDB | https://www.mongodb.com/ |
MySQL | MySQLデータベース | https://www.mysql.com/ |
エラスティックサーチ | 全文検索エンジン | https://www.elastic.co |
シャーディング-JDBC | サブデータベースおよびサブテーブルコンポーネント | https://shardingsphere.apache.org |
春の雲 Alibaba | クラウド Alibaba コンポーネント | https://github.com/alibaba/spring-cloud-alibaba |
アパッチ・ダボ | RPC サービスのリモート呼び出しフレームワーク | https://github.com/apache/dubbo |
Spring クラウド ゲートウェイ | ゲートウェイコンポーネント | https://spring.io/projects/spring-cloud-gateway |
シータ | 分散トランザクション ソリューション | http://seata.io/zh-cn/index.html |
Spring SecurityOAuth2.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-token.cc/ |
フライウェイ | データベースのバージョン管理ツール | https://flywaydb.org/ |
MinIO | オブジェクトストレージサービス | https://min.io/ |
春のAI | AIコンポーネント | https://spring.io/projects/spring-ai |
グッズキル |--goodskill-admin ||SpringBoot 管理監視サーバー、Spring Cloud マイクロサービス検出をサポート|--goodskill-ai ||AI ロボット チャット サービス|--goodskill-gateway ||マイクロサービス API ゲートウェイ、統合サービス認証、動的ルート読み込みをサポート|--goodskill-order-provider ||オーダー サービス プロバイダー|--goodskill-seckill-provider ||Seckill サービス プロバイダー|--goodskill-spring-boot-starter ||プロジェクト構成の自動アセンブリ|-goodskill-common ||公共サービス (現在、minio のアップロードおよびダウンロード機能が含まれています) |--goodskill-web ||フラッシュ キル シミュレーション インターフェイスへのアクセスを提供|-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 リソース サーバー側、カスタマイズされたログイン認証サービス
現在、いくつかの Flash Killing ソリューションが実装されており、テスト インターフェイスは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 電流制限 + データベース アトミック更新 (リソース名limit
のフロー制御ルールを構成するには、Sentinel コンソールで構成する必要があります)
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
スプリングクラウド: 2023.xx
スプリングブート: 3.3.x
SpringCloudAlibaba: 2023.xx
アパッチ ダボ: 3.3.x
使用されるDockerイメージ
鏡 | バージョン | ポート | ユーザー名とパスワード |
---|---|---|---|
ナコス | 2.3.2-スリム | 8848 | nacos:nacos (コンソール) |
レディス | 最新 | 6379 | パスワード:123456 |
カフカ | 3.1.1 | 9092 | なし |
カフカマネージャー | 最新 | 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 | なし |
MinIO | 最新 | 9000 | ルート:パスワード |
シータ | 2.0.0 | 7091 8091 | シータ:シータ (コンソール) |
プロジェクトのルートディレクトリで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-web/src/main/sql
ディレクトリに入り、 seckill.sql
ファイルを見つけて、ローカルの mysql データベースにseckill
ウェアハウスを確立し、データ初期化操作を実行します。
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 構成センターで、 goodskill-common-connection.yml
(ミドルウェアのパブリック構成) およびgoodskill-common.yml
(サービスのパブリック構成) の DataId を使用してパブリック構成を追加します。具体的な内容については、 goodskill-common-connection.yml
を参照してくださいDEFAULT_GROUP
プロジェクトのルート ディレクトリgoodskill-common-connection.yml
、 goodskill-common.yml
ファイル
main メソッドはOrderApplication
クラス (オーダー サービス) を実行します。
main メソッドはSeckillApplication
クラス (seckill 管理サービス プロバイダー) を実行します。
main メソッドは、 SampleWebApplication
クラスを実行します (フラッシュ セール Web サービスをシミュレートします)。
フラッシュ セール シミュレーション リクエストを送信します: フラッシュ セール アクティビティ ID 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-ai
モジュールに入り、設定spring.ai.dashscope.api-key
置き換えます。この設定は、Alibaba Cloud Bailian プラットフォームから取得できます。
main メソッドは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
クラスの main メソッドを通じてサービス ゲートウェイを起動し、ゲートウェイを通じてさまざまなサービスに均一にアクセスします。
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
で起動する必要があります。Docker 環境はまだサポートされていません。
Seata 分散トランザクション テスト方法については、「Seata 分散トランザクション テストのサンプルの実行手順」を参照してください。
main メソッドは、 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 公式 Web サイトを参照して、nacos 関連の構成を追加できます。分散トランザクションが使用されていない場合は、このエラーを無視しても問題ありません。サービスの通常の動作には影響しません。
docker-compose がイメージをプルできません
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 の 2 つのライブラリに分割されます) | seckill_id | はい (success_killed_0 と success_kill_1 の 2 つのテーブルに分割) | ユーザー電話 |
? | 他のテーブルはデータベースまたはテーブルに分割されていません。デフォルトでは、seckill がメイン データベースとして使用されます。 |
Kafka への Docker コンテナ接続失敗の問題を解決する: https://www.cnblogs.com/hellxz/p/why_cnnect_to_kafka_always_failure.html