El nombre del proyecto, GoodsKill, por un lado, significa venta flash de bienes (parece un poco chinglish) y, por otro lado, también puede entenderse como una buena habilidad . Este proyecto espera construir una completa. marco del proyecto e integrar algunas buenas tecnologías y habilidades de desarrollo (favoreciendo la tecnología back-end) para facilitar el aprendizaje y la revisión.
Este proyecto es un proyecto de venta flash simulada que proporciona una interfaz unificada de solicitud de simulación de venta flash. Técnicamente, adopta el marco de capa de persistencia SpringMVC + Mybatis, usa Dubbo3.x [1] + Feign para completar llamadas de interfaz entre servicios y usa Nacos para. Centro de configuración y descubrimiento de registro de servicios Soporte La base de datos se divide en bases de datos y tablas, transacciones distribuidas y máquinas de estado para completar la conversión entre estados de datos (implementado en base a Spring Statemachine).
Integradas con el servicio Spring AI, las ventas flash simuladas se pueden completar a través de robots AI.
La rama master
está construida en base al último sistema Spring Cloud 2023.x + Spring Boot 3.x + JDK21. Actualmente, solo se conserva la interfaz API de venta flash de simulación principal si necesita usar Spring Boot 2.7.x + JDK11. versión, puede cambiar a la etiqueta v2.7.4 (funciones de inicio de sesión, registro y administración de fondo simples admitidas). La rama maestra se está actualizando actualmente y sus funciones no son lo suficientemente estables. Si encuentra errores de código, se recomienda utilizar la versión anterior.
Las funciones de este proyecto son actualmente relativamente rudimentarias y tienen muchas imperfecciones. El escenario real de Venta Flash es mucho más complejo que el método de implementación en este proyecto. Este proyecto omite algunos detalles técnicos de implementación en el escenario real. referencia. Si crees que este proyecto es útil para ti, dale una estrella y apóyalo.
Adjunto: enlace del proyecto Code Cloud
https://gitee.com/techa/goodsKill
Si la velocidad de clonación es lenta, use el almacén de Code Cloud para sincronizarlo con Code Cloud de vez en cuando ~.
Herramienta o marco utilizado | nombre | Sitio web oficial |
---|---|---|
Bota de primavera | Marco de arranque de primavera | https://spring.io/projects/spring-boot |
MyBatis-Plus | Herramienta de mejora MyBatis | https://mp.baomidou.com/ |
guardián del zoológico | Servicio de coordinación distribuida | http://zookeeper.apache.org/ |
Redis | Base de datos de caché distribuida | https://redis.io/ |
kafka | cola de mensajes | http://kafka.apache.org/ |
ConejoMQ | cola de mensajes | https://www.rabbitmq.com/ |
MongoDB | MongoDB | https://www.mongodb.com/ |
mysql | base de datos mysql | https://www.mysql.com/ |
Búsqueda elástica | Buscador de texto completo | https://www.elastic.co |
Fragmentación-JDBC | Componentes de subbase de datos y subtabla | https://shardingsphere.apache.org |
Nube de primavera Alibaba | Componentes de la nube de Alibaba | https://github.com/alibaba/spring-cloud-alibaba |
apache dubbo | Marco de llamadas remotas del servicio RPC | https://github.com/apache/dubbo |
Puerta de enlace de la nube de primavera | Componente de puerta de enlace | https://spring.io/projects/spring-cloud-gateway |
asiento | Soluciones de transacciones distribuidas | http://seata.io/zh-cn/index.html |
Seguridad de primaveraOAuth2.0 | Componente de autorización OAuth2.0 | https://spring.io/projects/spring-security-oauth |
GrafoQL | Un lenguaje de consulta para API | https://docs.spring.io/spring-graphql/docs/current/reference/html |
Máquina de estados de primavera | máquina de estados de primavera | https://spring.io/projects/spring-statemachine |
Sa-Token | Marco de autenticación de autoridad ligero | https://sa-token.cc/ |
Ruta migratoria | Herramienta de control de versiones de bases de datos | https://flywaydb.org/ |
MiniIO | Servicio de almacenamiento de objetos. | https://min.io/ |
IA de primavera | Componentes de IA | https://spring.io/projects/spring-ai |
bienesmatar |--goodskill-admin ||Servidor de monitoreo SpringBoot Admin, compatible con el descubrimiento de microservicios Spring Cloud|--goodskill-ai ||Servicio de chat de robot AI|--goodskill-gateway ||Puerta de enlace API de microservicio, autenticación de servicio unificado, admite carga de ruta dinámica |--goodskill-order-provider ||Proveedor de servicios de pedidos|--goodskill-seckill-provider ||Proveedor de servicios Seckill|--goodskill-spring-boot-starter ||Configuración del proyecto montaje automático|--goodskill-common ||Servicios públicos (actualmente incluye funciones de carga y descarga de minio) |--goodskill-web ||Proporcionar acceso a la interfaz de simulación flash kill|--goodskill-job ||tarea programada de trabajo elástico|--goodskill-seata ||Ejemplo de solución de transacciones distribuidas que integra nacos+dubbo+shardingjdbc+seata| -goodskill-auth ||módulo de autorización e inicio de sesión de autenticación |--auth-service| ||Servicio de autorización de inicio de sesión de usuario basado en el marco Sa-Token |--oauth2-auth-server ||servidor de autorización de inicio de sesión oauth2.0, servicio de autorización de inicio de sesión personalizado |--oauth2-resource-server ||recurso oauth2.0 Lado del servidor, servicio de autorización de inicio de sesión personalizado
Actualmente, se han implementado varias soluciones de eliminación de flash y la interfaz de prueba se proporciona a través de SeckillMockController
Dirección del documento Openapi de la puerta de enlace de agregación: http://localhost/doc.html#/home
(es necesario habilitar el servicio de puerta de enlace)
Dirección de monitoreo de la aplicación Spring Boot Admin: http://www.goodskill.com:19031
, nombre de usuario y contraseña de inicio de sesión: usuario/123456
Escenario 1: implementación del bloqueo de sincronización sincronizado
Escenario 2: implementación de bloqueo distribuido de Redisson
Escenario 3: implementación de ActiveMQ (obsoleto)
Escenario 4: implementación de la cola de mensajes de Kafka
Escenario 5: actualización atómica de la base de datos
Escenario 6: Esperando resultados del procesamiento de venta flash en tiempo real (obsoleto)
Escenario 7: bloqueo distribuido de ZooKeeper
Escenario 8: use Redis para reducir el inventario de productos de venta flash, envíe MQ de forma asincrónica después de que finalice la venta flash y use MongoDB para completar el aterrizaje de datos.
Escenario 9: implementación de Spring Cloud Stream
Escenario 10: limitación actual de Sentinel + actualización atómica de la base de datos (debe configurarse con la consola Sentinel para configurar las reglas de control de flujo del limit
de nombres de recursos)
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: AbiertoJDK21
Fragmentación-JDBC: 5.5.0
SpringCloud: 2023.xx
Arranque de primavera: 3.3.x
SpringCloud Alibaba: 2023.xx
Apache Dubbo: 3.3.x
Imagen de Docker utilizada
espejo | Versión | puerto | Nombre de usuario y contraseña |
---|---|---|---|
Nacos | 2.3.2-delgado | 8848 | nacos:nacos (consola) |
Redis | el último | 6379 | Contraseña: 123456 |
kafka | 3.1.1 | 9092 | ninguno |
KafkaManager | el último | 9001:9000 | ninguno |
mongo | 6.0.7 | 27017 | ninguno |
mysql | 8.0.29 | 3306 | raíz: Contraseña123 |
cuidador del zoológico | 3.6.2 | 2181 | ninguno |
Búsqueda elástica | 7.17.3 | 9200 9300 | ninguno |
kibana | 7.17.3 | 5601 | ninguno |
ConejoMQ | el último | 5672 15672 | ninguno |
MiniIO | el último | 9000 | raíz:contraseña |
asiento | 2.0.0 | 7091 8091 | asiento: asiento (consola) |
Ejecutar en el directorio raíz del proyecto goodsKill
instalación limpia de mvn O #skip pruebas unitarias mvn instalación limpia -DskipTests
El puerto predeterminado inicia nacos, redis, mysql, Rabbitmq, Kafka, zookeeper, elasticsearch, seataServer o use el comando docker-compose [2] :
docker-compose -f goodskill-simple.yml up -d
Ingrese al directorio goodskill-web/src/main/sql
, busque el archivo seckill.sql
, establezca el almacén seckill
en la base de datos mysql local y realice operaciones de inicialización de datos.
Cuando docker-compose inicie la imagen de MySQL, ejecutará automáticamente el script de inicialización. Si ya realizó el paso anterior, puede omitir este paso. |
Configurar host
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
En el centro de configuración de Nacos, agregue configuraciones públicas con DataId de goodskill-common-connection.yml
(configuración goodskill-common-connection.yml
de middleware) y goodskill-common.yml
(el grupo de configuración pública es DEFAULT_GROUP
). directorio raíz. goodskill-common-connection.yml
, archivos goodskill-common.yml
El método principal ejecuta la clase OrderApplication
(servicio de pedidos)
El método principal ejecuta la clase SeckillApplication
(proveedor de servicios de administración de Seckill)
El método principal ejecuta la clase SampleWebApplication
(simulando el servicio web de venta flash)
Envíe una solicitud de simulación de venta flash: ID de actividad de venta flash 1000, cantidad de producto 10, realice 20 operaciones de compra, use el bloqueo de sincronización sincronizado para ejecutar, por ejemplo:
Puede utilizar directamente el siguiente comando para enviar una solicitud de venta flash simulada. Cada actividad de venta flash seckillId corresponde a una ID de producto única. Cada vez que se ejecuta la interfaz, habrá una acción de inicialización del inventario. ser llamado repetidamente.
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
} '
La solicitud se ejecuta de forma asíncrona de forma predeterminada. Puede ver el registro de ejecución en la consola. Si el número de transacciones finales exitosas es igual al número de artículos 10, significa que no hay problema de sobreventa o subventa.
Un servicio de robot de venta flash simple creado en base a Spring AI Alibaba Las llamadas de servicio se pueden completar a través del servicio de robot. Actualmente, solo admite la apertura de actividades de venta flash y la generación del consumo de tiempo de la actividad.
Ingrese al módulo goodskill-ai
y reemplace la configuración spring.ai.dashscope.api-key
, que se puede obtener a través de la plataforma Alibaba Cloud Bailian
El método principal ejecuta la clase AiBotApplication
y accede a la página de chat http://127.0.0.1:18077
Aquí hay una conversación de ejemplo.
我: 帮我执行秒杀
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%希望这些信息对您有帮助!如果还有其他问题或需要进一步的帮助,请随时告诉我哦!?
Agregue los siguientes pasos a la sección de inicio rápido para iniciar un proyecto completo
Ingrese al módulo goodskill-gateway
, inicie la puerta de enlace de servicio a través del método principal de GatewayBootApplication
y acceda uniformemente a varios servicios a través de la puerta de enlace.
http://www.goodskill.com/api/order/**
corresponde al acceso al servicio goodskill-order
http://www.goodskill.com/api/seata/**
corresponde al acceso al servicio goodskill-seata
http://www.goodskill.com/api/seckill/**
corresponde al acceso al servicio goodskill-seckill
http://www.goodskill.com/api/auth/**
corresponde al acceso al servicio goodskill-auth
http://www.goodskill.com/api/web/**
corresponde al acceso al servicio goodskill-web
El componente de limitación actual Sentinel
se ha integrado y admite la implementación de reglas de limitación actuales a través nacos
. Para usarlo, debe iniciar la consola Sentinel
e iniciarla con el puerto 18088
El entorno acoplable aún no es compatible.
Para conocer el método de prueba de transacciones distribuidas de Seata, consulte las instrucciones de ejecución del ejemplo de prueba de transacciones distribuidas de Seata.
El método principal ejecuta la clase GoodskillAdminApplication
(supervisión del indicador de estado de salud del microservicio)
Error al iniciar la imagen de Docker ES
Este problema suele ocurrir en un entorno Linux. Ejecute el siguiente comando sysctl -w vm.max_map_count=262144
o modifique el archivo /etc/sysctl.conf y agregue la siguiente configuración:
grep vm.max_map_count /etc/sysctl.conf
vm.max_map_count=262144
¿Cómo utilizar el servidor de autorización OAuth2.0 personalizado en este proyecto para la autorización de inicio de sesión?
Para mejorar. .
¿Cuál es la compatibilidad actual entre los distintos frameworks integrados en el proyecto?
Las versiones de cada marco principal en el que se basa actualmente este proyecto son relativamente nuevas y no se han probado completamente [3] .
¿Cómo resolver el error " no available service found in cluster 'default', please make sure registry config correct and keep your seata server running
informado en la consola de inicio del servicio?
Simplemente inicie el servicio seata-server
(proporcionado en el archivo docker-compose.yml). Puede consultar el sitio web oficial de Seata para agregar configuraciones relacionadas con nacos. Si no se utilizan transacciones distribuidas, puede ignorar este error y no afectará el funcionamiento normal del servicio.
docker-compose no puede extraer la imagen
hub.docker está bloqueado. Alibaba Cloud Image Accelerator se puede utilizar en China. Para operaciones específicas, consulte Alibaba Cloud Image Accelerator.
No se pudo iniciar el proyecto usando JDK17 o superior
Agregue los siguientes parámetros de jvm al iniciar, por ejemplo:
--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
Actualmente, el control del estado de la actividad de venta flash se basa en la máquina de estado Spring Statemachine. Las ventajas de utilizar la máquina de estado son:
El control unificado del estado de la actividad facilita el mantenimiento centralizado del estado;
Evite que el estado del negocio cambie a voluntad y garantice actualizaciones controlables del estado;
superficie | base de datos | Si dividir la biblioteca | Campo de subbiblioteca | Ya sea para dividir la mesa | Campos de subtabla |
---|---|---|---|---|---|
éxito_matado | mysql | Sí (en el mismo servidor, se divide en dos bibliotecas: seckill y seckill_01) | seckill_id | Sí (dividido en dos tablas: Success_killed_0 y Success_kill_1) | teléfono_usuario |
? | Ninguna de las otras tablas está dividida en bases de datos o tablas. De forma predeterminada, seckill se utiliza como base de datos principal. |
Resuelva el problema de la falla de conexión del contenedor Docker a Kafka: https://www.cnblogs.com/hellxz/p/why_cnnect_to_kafka_always_failure.html