프로젝트 이름인 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로 전환할 수 있습니다(로그인, 등록 및 간단한 백그라운드 관리 기능 지원). 현재 마스터 브랜치가 업그레이드 중이어서 기능이 충분히 안정적이지 않습니다. 코드 오류가 발생하면 이전 버전을 사용하는 것이 좋습니다.
이 프로젝트의 기능은 현재 상대적으로 초보적이며 불완전한 부분이 많습니다. 실제 Flash Sale 시나리오는 이 프로젝트의 구현 방법보다 훨씬 더 복잡합니다. 이 프로젝트는 현재 실제 시나리오에서 일부 기술 구현 세부 사항을 생략하고 있습니다. 참고하세요. 이 프로젝트가 도움이 되었다고 생각하신다면 별점 과 응원 부탁드립니다.
첨부파일: 코드클라우드 프로젝트 링크
https://gitee.com/techa/goodsKill
복제속도가 느리다면 코드클라우드 웨어하우스를 이용해 수시로 코드클라우드에 동기화하세요~
사용된 도구 또는 프레임워크 | 이름 | 공식 홈페이지 |
---|---|---|
스프링 부트 | 스프링 부트 프레임워크 | https://spring.io/projects/spring-boot |
마이바티스 플러스 | 마이바티스 개선 도구 | https://mp.baomidou.com/ |
동물원지기 | 분산 조정 서비스 | http://zookeeper.apache.org/ |
레디스 | 분산 캐시 데이터베이스 | https://redis.io/ |
카프카 | 메시지 대기열 | http://kafka.apache.org/ |
RabbitMQ | 메시지 대기열 | 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 |
스프링 클라우드 알리바바 | 클라우드 알리바바 구성 요소 | 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 | API용 쿼리 언어 | https://docs.spring.io/spring-graphql/docs/current/reference/html |
스프링 상태머신 | 스프링 상태 머신 | https://spring.io/projects/spring-statemachine |
사토켄 | 경량 권한 인증 프레임워크 | https://sa-token.cc/ |
이동경로 | 데이터베이스 버전 제어 도구 | https://flywaydb.org/ |
미니IO | 객체 스토리지 서비스 | 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 ||공공 서비스(현재 미니오 업로드 및 다운로드 기능 포함) |--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 리소스 서버 측, 맞춤형 로그인 인증 서비스
현재 여러 플래시 킬링 솔루션이 구현되었으며 테스트 인터페이스는 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: 오픈JDK21
샤딩-JDBC: 5.5.0
스프링클라우드: 2023.xx
스프링부트: 3.3.x
SpringCloud알리바바: 2023.xx
아파치 더보: 3.3.x
사용된 도커 이미지
거울 | 버전 | 포트 | 사용자 이름 및 비밀번호 |
---|---|---|---|
나코스 | 2.3.2-슬림 | 8848 | nacos:nacos(콘솔) |
레디스 | 최신 | 6379 | 비밀번호:123456 |
카프카 | 3.1.1 | 9092 | 없음 |
카프카매니저 | 최신 | 9001:9000 | 없음 |
몽고 | 6.0.7 | 27017 | 없음 |
MySQL | 8.0.29 | 3306 | 루트:Password123 |
사육사 | 3.6.2 | 2181 | 없음 |
엘라스틱서치 | 7.17.3 | 9200 9300 | 없음 |
키바나 | 7.17.3 | 5601 | 없음 |
RabbitMQ | 최신 | 5672 15672 | 없음 |
미니IO | 최신 | 9000 | 루트:비밀번호 |
세타 | 2.0.0 | 7091 8091 | Seata:seata(콘솔) |
프로젝트 루트 디렉터리 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를 사용하여 공개 구성을 추가합니다. 그룹은 DEFAULT_GROUP
입니다. 자세한 내용은 프로젝트의 goodskill-common-connection.yml
을 참조하세요. 루트 디렉터리 goodskill-common-connection.yml
, goodskill-common.yml
파일
기본 메소드는 OrderApplication
클래스(주문 서비스)를 실행합니다.
기본 메소드는 SeckillApplication
클래스(seckill 관리 서비스 제공자)를 실행합니다.
기본 메소드는 SampleWebApplication
클래스를 실행합니다(깜짝 세일 웹 서비스 시뮬레이션).
깜짝 세일 시뮬레이션 요청 보내기: 깜짝 세일 활동 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
모듈을 입력하고 Alibaba Cloud Bailian 플랫폼을 통해 얻을 수 있는 spring.ai.dashscope.api-key
구성을 교체합니다.
기본 메소드는 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
로 시작해야 합니다. Docker 환경은 아직 지원되지 않습니다.
Seata 분산 트랜잭션 테스트 방법은 Seata 분산 트랜잭션 테스트 예제 실행 지침을 참조하세요.
기본 메서드는 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 공식 웹사이트를 참조하여 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 상태 머신을 기반으로 합니다. 상태 머신을 사용하면 다음과 같은 이점이 있습니다.
활동 상태에 대한 통합 제어를 통해 중앙 집중식 상태 유지 관리가 용이합니다.
비즈니스 상태가 마음대로 변경되는 것을 방지하고 제어 가능한 상태 업데이트를 보장합니다.
표면 | 데이터 베이스 | 도서관 분할 여부 | 하위 라이브러리 필드 | 테이블을 나눌지 여부 | 하위 테이블 필드 |
---|---|---|---|---|---|
성공_죽음 | MySQL | 예(동일한 서버에서는 seckill과 seckill_01이라는 두 개의 라이브러리로 나뉩니다.) | seckill_id | 예(success_killed_0 및 Success_kill_1의 두 테이블로 구분됨) | user_phone |
? | 다른 테이블은 데이터베이스나 테이블로 구분되지 않습니다. 기본적으로 seckill이 기본 데이터베이스로 사용됩니다. |
Kafka에 대한 Docker 컨테이너 연결 실패 문제 해결: https://www.cnblogs.com/hellxz/p/why_cnnect_to_kafka_always_failure.html