ๅบไบๅ ญ่พนๅฝขๆถๆ็ๆฝๅฅ่งฃๅณๆนๆก
ๅฟซ้ๅผๅง ยท ๆถๆ่ฎพ่ฎก ยท ๆ ธๅฟๅ่ฝ ยท ๆๆฏ้ๅ
LuckDraw ๆฏไธไธช้็จ**ๅ ญ่พนๅฝขๆถๆ๏ผHexagonal Architecture๏ผ**ๆๅปบ็ๆฝๅฅๅนณๅฐใ็ณป็ป้่ฟๆธ ๆฐ็็ซฏๅฃไธ้้ ๅจ่ฎพ่ฎก๏ผๅฎ็ฐไบๆ ธๅฟไธๅก้ป่พไธๅค้จไพ่ต็ๅฎๅ จ่งฃ่ฆ๏ผๅ ทๅคๆ้ซ็ๅฏๆต่ฏๆงๅๅฏ็ปดๆคๆงใ
| ็นๆง | ๆ่ฟฐ |
|---|---|
| ๐ฏ ็ตๆดปๆฝๅฅ | ๆฏๆๅๆฌกๆฆ็ใๆปไฝๆฆ็ไธค็งๆฝๅฅๆจกๅผ |
| ๐ ็ถๆๆต่ฝฌ | ๅฎๆด็ๆดปๅจ็ๅฝๅจๆ็ถๆๆบ็ฎก็ |
| ๐ฆ ๅๅธๅผๆถๆ | ๆฏๆๅๅธๅผ้ใๆถๆฏ้ๅใๆๅกๆณจๅๅ็ฐ |
| โก ้ซๆง่ฝ | ้ช่ฑ็ฎๆณID็ๆใRedis็ผๅญๅ ้ |
| ๐ก๏ธ ๅ ญ่พนๅฝขๆถๆ | ๆ ธๅฟไธๅกไธๅบ็ก่ฎพๆฝๅฎๅ จ่งฃ่ฆ |
| ๐ ๅฏๆๆ่ฎพ่ฎก | ็ซฏๅฃไธ้้ ๅจๆจกๅผ๏ผๆไบๆฟๆขๅฎ็ฐ |
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ API Layer โ
โ โโโโโโโโโโโโโ โโโโโโโโโโโโโ โ
โ โ REST โ โ Dubbo โ โ
โ โ Facade โ โ Service โ โ
โ โโโโโโโฌโโโโโโ โโโโโโโฌโโโโโโ โ
โโโโโโโโโโผโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโ
โ โ
โโโโโโโโโโผโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโ
โ Core Domain โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Input Ports (API) โ โ
โ โ DrawServicePort โ โ
โ โ CampaignServicePort โ โ
โ โ PrizeServicePort โ โ
โ โโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโ โ
โ โ โ
โ โโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโ โ
โ โ Domain Services โ โ
โ โ DrawServiceImpl โ โ
โ โ CampaignServiceImpl โ โ
โ โ PrizeServiceImpl โ โ
โ โโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโ โ
โ โ โ
โ โโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโ โ
โ โ Output Ports (SPI) โ โ
โ โ CampaignRepositoryPort โ โ
โ โ WinRecordRepositoryPort โ โ
โ โ CacheServicePort โ โ
โ โ MessageQueuePort โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Adapters Layer โ
โ โโโโโโโโโโโ โโโโโโโโโโโ โโโโโโโโโโโ โ
โ โ DB โ โ Redis โ โ Kafka โ โ
โ โ Adapter โ โ Adapter โ โ Adapter โ โ
โ โโโโโโโโโโโ โโโโโโโโโโโ โโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
| ๆจกๅ | ่่ดฃ่ฏดๆ |
|---|---|
prizewheel-shared |
ๅ ฑไบซๅธธ้ใๆไธพใๅทฅๅ ท็ฑปใ้็จDTO |
prizewheel-core |
ๆ ธๅฟ้ขๅๆจกๅใไธๅกๆๅกใ็ซฏๅฃๅฎไน |
prizewheel-adapters |
ๅบ็ก่ฎพๆฝ้้ ๅจ๏ผๆฐๆฎๅบใ็ผๅญใๆถๆฏ้ๅ๏ผ |
prizewheel-api |
ๅฏนๅคAPIๆฅๅฃใDubboๆๅกใๅฏๅจๅ ฅๅฃ |
// ๆง่กๆฝๅฅ
WinRecord record = drawService.executeDraw(participantId, campaignId);
// ๆฅ่ฏขไธญๅฅ่ฎฐๅฝ
WinRecord record = drawService.queryWinRecord(recordId);// ๅๅปบๆดปๅจ
Long campaignId = campaignService.createCampaign(campaign);
// ๆดๆฐ็ถๆ
campaignService.updateStatus(campaignId, ActivityStatus.RUNNING.getCode());// ๅๆพๅฅๅ
boolean success = prizeService.grantPrize(recordId);| ๅ็ฑป | ๆๆฏ | ็ๆฌ | ่ฏดๆ |
|---|---|---|---|
| ๆ ธๅฟๆกๆถ | Spring Boot | 2.6.0 | ๅบ็จๆกๆถ |
| ORMๆกๆถ | MyBatis | 2.1.4 | ๆฐๆฎๆไน ๅ |
| ๆฐๆฎๅบ | MySQL | 8.0+ | ๅ ณ็ณปๅๆฐๆฎๅบ |
| ็ผๅญ | Redis + Redisson | 3.17.0 | ๅๅธๅผ็ผๅญไธ้ |
| ๆถๆฏ้ๅ | Kafka | 2.8.0 | ๅผๆญฅๆถๆฏๅค็ |
| RPCๆกๆถ | Dubbo | 2.7.10 | ๅๅธๅผๆๅก่ฐ็จ |
| ๆณจๅไธญๅฟ | Nacos | 2.0+ | ๆๅกๆณจๅไธๅ็ฐ |
| ไปปๅก่ฐๅบฆ | XXL-Job | 2.3.0 | ๅๅธๅผไปปๅก่ฐๅบฆ |
- JDK 1.8+
- MySQL 8.0+
- Redis 6.0+
- Kafka 2.8+
- Nacos 2.0+
# 1. ๅ
้้กน็ฎ
git clone
# 2. ๅๅงๅๆฐๆฎๅบ
mysql -u root -p < database/prizewheel.sql
# 3. ไฟฎๆน้
็ฝฎ
# ็ผ่พ prizewheel-api/src/main/resources/application.yml
# 4. ๆๅปบ้กน็ฎ
mvn clean package -DskipTests
# 5. ๅฏๅจๆๅก
java -jar prizewheel-api/target/prizewheel-api-1.0.0-SNAPSHOT.jar# ๆฐๆฎๅบ้
็ฝฎ
spring:
datasource:
url: jdbc:mysql://${DB_HOST:localhost}:3306/prizewheel
username: ${DB_USER:root}
password: ${DB_PASS:root}
# Redis้
็ฝฎ
redis:
host: ${REDIS_HOST:localhost}
port: ${REDIS_PORT:6379}
password: ${REDIS_PASS:}
# Dubbo้
็ฝฎ
dubbo:
registry:
address: nacos://${NACOS_HOST:localhost}:8848PrizeWheel/
โโโ database/ # ๆฐๆฎๅบ่ๆฌ
โ โโโ prizewheel.sql # ๅปบ่กจ่ๆฌ
โโโ prizewheel-shared/ # ๅ
ฑไบซๆจกๅ
โ โโโ src/main/java/io/prizewheel/shared/
โ โโโ constant/ # ๅธธ้ๅฎไน
โ โโโ model/ # ้็จๆจกๅ
โ โโโ util/ # ๅทฅๅ
ท็ฑป
โโโ prizewheel-core/ # ๆ ธๅฟ้ขๅๆจกๅ
โ โโโ src/main/java/io/prizewheel/core/
โ โโโ domain/ # ้ขๅๅฎไฝ
โ โโโ port/ # ็ซฏๅฃๅฎไน
โ โ โโโ input/ # ่พๅ
ฅ็ซฏๅฃ
โ โ โโโ output/ # ่พๅบ็ซฏๅฃ
โ โโโ service/ # ไธๅกๆๅก
โโโ prizewheel-adapters/ # ้้
ๅจๆจกๅ
โ โโโ src/main/java/io/prizewheel/adapters/
โ โโโ cache/ # ็ผๅญ้้
ๅจ
โ โโโ mq/ # ๆถๆฏ้ๅ้้
ๅจ
โ โโโ persistence/ # ๆไน
ๅ้้
ๅจ
โ โโโ entity/ # POๅฎไฝ
โ โโโ mapper/ # MyBatis Mapper
โ โโโ repository/ # ไปๅจๅฎ็ฐ
โโโ prizewheel-api/ # APIๆจกๅ
โ โโโ src/main/java/io/prizewheel/api/
โ โโโ config/ # ้
็ฝฎ็ฑป
โ โโโ dto/ # ๆฐๆฎไผ ่พๅฏน่ฑก
โ โโโ facade/ # ๆๅก้จ้ข
โโโ pom.xml # ็ถPOM
| ๆๆ | ๆฐๅผ | ่ฏดๆ |
|---|---|---|
| ๆฝๅฅๅๅบๆถ้ด | < 30ms | ๅๆฌกๆฝๅฅ่ๆถ |
| ๅนถๅๆฏๆ | 8000+ QPS | ๅๆบๅนถๅๅค็่ฝๅ |
| ID็ๆ้ๅบฆ | 40w+/s | ้ช่ฑ็ฎๆณๅๆบ็ๆ่ฝๅ |
| ็ฑปๅ | ่ง่ | ็คบไพ |
|---|---|---|
| ็ฑปๅ | ๅคง้ฉผๅณฐ | DrawServiceImpl |
| ๆนๆณๅ | ๅฐ้ฉผๅณฐ | executeDraw |
| ๅธธ้ | ๅ จๅคงๅไธๅ็บฟ | MAX_RETRY_COUNT |
| ๅ ๅ | ๅ จๅฐๅ | io.prizewheel.core |
- ๆ ธๅฟๆจกๅ(
prizewheel-core)ไธไพ่ตไปปไฝๅค้จๆกๆถ - ๆๆๅค้จไพ่ต้่ฟ้้ ๅจๆจกๅๅผๅ ฅ
- ็ซฏๅฃๅฎไนไฝฟ็จๆฅๅฃ๏ผ้้ ๅจๅฎ็ฐๆฅๅฃ
ๆฌ้กน็ฎ้็จ MIT ่ฎธๅฏ่ฏใ
โญ ๅฆๆ่ฟไธช้กน็ฎๅฏนๆจๆๅธฎๅฉ๏ผ่ฏท็ปไธไธช Star ๆฏๆไธไธ๏ผ