O nome do projeto, GoodSill, por um lado, significa uma venda relâmpago de mercadorias (parece um pouco chinglish) e, por outro lado, também pode ser entendido como uma boa habilidade . Este projeto espera construir uma habilidade completa. estrutura do projeto e integrar algumas boas tecnologias e habilidades de desenvolvimento (favorecendo a tecnologia de back-end) para fácil aprendizado e revisão.
Este projeto é um projeto de venda flash simulado que fornece uma interface unificada de solicitação de simulação de venda flash. Tecnicamente, ele adota a estrutura da camada de persistência SpringMVC + Mybatis, usa Dubbo3.x [1] + Feign para concluir chamadas de interface entre serviços e usa Nacos para. centro de descoberta e configuração de registro de serviço O banco de dados é dividido em bancos de dados e tabelas, transações distribuídas e máquinas de estado são usadas para completar a conversão entre estados de dados (implementado com base no Spring Statemachine).
Integradas ao serviço Spring AI, as vendas flash simuladas podem ser concluídas por meio de robôs de IA.
O branch master
é construído com base no sistema Spring Cloud 2023.x + Spring Boot 3.x + JDK21. Atualmente, apenas a interface API de venda flash de simulação principal é mantida se você precisar usar o Spring Boot 2.7.x + JDK11. versão, você pode mudar para a tag v2.7.4 (login compatível, registro e funções simples de gerenciamento de plano de fundo). O branch master está sendo atualizado e suas funções não são estáveis o suficiente. Se você encontrar erros de código, é recomendado usar a versão mais antiga.
As funções deste projeto são atualmente relativamente rudimentares e apresentam muitas imperfeições. O cenário real da Venda Flash é muito mais complexo do que o método de implementação neste projeto. Este projeto omite alguns detalhes técnicos de implementação no cenário real. referência. Se você acha que este projeto é útil para você, dê uma estrela e apoie- o ?
Anexo: link do projeto Code Cloud
https://gitee.com/techa/goodsKill
. Se a velocidade do clone for lenta, use o armazém do Code Cloud para sincronizá-lo com o Code Cloud de vez em quando ~.
Ferramenta ou estrutura usada | nome | Site oficial |
---|---|---|
Bota Primavera | Estrutura de inicialização Spring | https://spring.io/projects/spring-boot |
MyBatis-Plus | Ferramenta de aprimoramento MyBatis | https://mp.baomidou.com/ |
Guardião do Zoológico | Serviço de coordenação distribuída | http://zookeeper.apache.org/ |
Redis | Banco de dados de cache distribuído | https://redis.io/ |
Kafka | fila de mensagens | http://kafka.apache.org/ |
CoelhoMQ | fila de mensagens | https://www.rabbitmq.com/ |
MongoDB | MongoDB | https://www.mongodb.com/ |
MySQL | Banco de dados MySQL | https://www.mysql.com/ |
Elasticsearch | Mecanismo de pesquisa de texto completo | https://www.elastic.co |
Fragmentação-JDBC | Componentes de subbanco de dados e subtabela | https://shardingsphere.apache.org |
Primavera Nuvem Alibaba | Componentes do Cloud Alibaba | https://github.com/alibaba/spring-cloud-alibaba |
Apache Dubo | Estrutura de chamada remota de serviço RPC | https://github.com/apache/dubbo |
Spring Cloud Gateway | Componente de gateway | https://spring.io/projects/spring-cloud-gateway |
Seata | Soluções de transações distribuídas | http://seata.io/zh-cn/index.html |
Spring SecurityOAuth2.0 | Componente de autorização OAuth2.0 | https://spring.io/projects/spring-security-oauth |
GráficoQL | Uma linguagem de consulta para APIs | https://docs.spring.io/spring-graphql/docs/current/reference/html |
Máquina de Estado da Primavera | Máquina de estado de primavera | https://spring.io/projects/spring-statemachine |
Sa-Token | Estrutura leve de autenticação de autoridade | https://sa-token.cc/ |
Rota de voo | Ferramenta de controle de versão de banco de dados | https://flywaydb.org/ |
MinIO | Serviço de armazenamento de objetos | https://min.io/ |
Primavera IA | Componentes de IA | https://spring.io/projects/spring-ai |
bensMatar |--goodskill-admin ||Servidor de monitoramento SpringBoot Admin, suporta descoberta de microsserviços Spring Cloud|--goodskill-ai ||Serviço de chat de robô AI|--goodskill-gateway ||Gateway de API de microsserviço, autenticação de serviço unificada, suporte para carregamento de rota dinâmica |--goodskill-order-provider ||Provedor de serviços de pedido|--goodskill-seckill-provider ||Provedor de serviços Seckill|--goodskill-spring-boot-starter ||Montagem automática de configuração do projeto|--goodskill-common ||Serviços públicos (atualmente incluindo funções de upload e download de minio) |--goodskill-web ||Fornece acesso à interface de simulação de flash kill|--goodskill-job ||tarefa agendada de trabalho elástico|--goodskill-seata ||Exemplo de solução de transação distribuída integrando nacos+dubbo+shardingjdbc+seata| -goodskill-auth ||módulo de login e autorização de autenticação |--auth-service ||Serviço de autorização de login do usuário baseado na estrutura Sa-Token |--oauth2-auth-server ||servidor de autorização de login oauth2.0, serviço de autorização de login personalizado |--oauth2-resource-server ||recurso oauth2.0 Lado do servidor, serviço de autorização de login personalizado
Atualmente, várias soluções flash kill foram implementadas e a interface de teste é fornecida por meio do SeckillMockController
Endereço do documento Openapi do gateway de agregação: http://localhost/doc.html#/home
(é necessário ativar o serviço de gateway)
Endereço de monitoramento do aplicativo Spring Boot Admin: http://www.goodskill.com:19031
, nome de usuário e senha de login: user/123456
Cenário 1: Implementação de bloqueio de sincronização sincronizada
Cenário 2: Implementação de bloqueio distribuído Redisson
Cenário 3: implementação do ActiveMQ (obsoleto)
Cenário 4: implementação da fila de mensagens Kafka
Cenário 5: atualização atômica do banco de dados
Cenário 6: Aguardando os resultados do processamento da venda relâmpago em tempo real (obsoleto)
Cenário 7: bloqueio distribuído do ZooKeeper
Cenário 8: Use o Redis para reduzir o estoque de produtos de venda flash, envie MQ de forma assíncrona após o término da venda flash e use o MongoDB para concluir o desembarque de dados.
Cenário 9: implementação do Spring Cloud Stream
Cenário 10: Limitação atual do Sentinel + atualização atômica do banco de dados (precisa ser configurado com o console do Sentinel para configurar as regras de controle de fluxo do limit
de nome de recurso)
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
Fragmentação-JDBC: 5.5.0
SpringCloud: 2023.xx
SpringBoot: 3.3.x
SpringCloudAlibaba: 2023.xx
Apache Dubo: 3.3.x
Imagem Docker usada
espelho | Versão | porta | Nome de usuário e senha |
---|---|---|---|
Nacos | 2.3.2-fino | 8848 | nacos:nacos (console) |
Redis | mais recente | 6379 | Senha:123456 |
Kafka | 3.1.1 | 9092 | nenhum |
KafkaManager | mais recente | 9001:9000 | nenhum |
Mongo | 6.0.7 | 27017 | nenhum |
MySQL | 8.0.29 | 3306 | raiz: senha123 |
Zelador do zoológico | 3.6.2 | 2181 | nenhum |
Elasticsearch | 7.17.3 | 9200 9300 | nenhum |
Kibana | 7.17.3 | 5601 | nenhum |
CoelhoMQ | mais recente | 5672 15672 | nenhum |
MinIO | mais recente | 9.000 | raiz: senha |
Seata | 2.0.0 | 7091 8091 | seata:seata (console) |
Execute no diretório raiz do projeto goodsKill
instalação limpa mvn Ou #skip testes de unidade mvn clean install -DskipTests
A porta padrão inicia nacos, redis, mysql, coelhomq, kafka, zookeeper, elasticsearch, seataServer ou use o comando docker-compose [2] :
docker-compose -f goodskill-simple.yml up -d
Entre no diretório goodskill-web/src/main/sql
, encontre o arquivo seckill.sql
, estabeleça o armazém seckill
no banco de dados mysql local e execute operações de inicialização de dados.
Quando o docker-compose inicia a imagem MySQL, ele executa automaticamente o script de inicialização. Se você já executou a etapa anterior, pode pular esta etapa. |
Configurar anfitrião
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
No centro de configuração do Nacos, adicione configurações públicas com DataId de goodskill-common-connection.yml
(configuração goodskill-common-connection.yml
de middleware) e goodskill-common.yml
(o grupo de configuração pública de serviço é DEFAULT_GROUP
). diretório raiz. goodskill-common-connection.yml
, arquivos goodskill-common.yml
O método principal executa a classe OrderApplication
(serviço de pedido)
O método principal executa a classe SeckillApplication
(provedor de serviços de gerenciamento seckill)
O método principal executa a classe SampleWebApplication
(simulando o serviço web de venda flash)
Envie uma solicitação de simulação de venda flash: ID de atividade de venda flash 1000, quantidade de produto 10, execute 20 operações de compra, use o bloqueio de sincronização sincronizado para executar, por exemplo:
Você pode usar diretamente o seguinte comando para enviar uma solicitação de venda flash simulada. Cada atividade de venda flash seckillId corresponde a um ID de produto exclusivo. Cada vez que a interface for executada, haverá uma ação de inicialização de inventário. ser chamado 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
} '
A solicitação é executada de forma assíncrona por padrão. Você pode visualizar o log de execução no console. Se o número de transações finais bem-sucedidas for igual ao número de itens 10, significa que não há problema de sobrevenda ou subvenda.
Um serviço de robô de venda flash simples construído com base nas chamadas de serviço Spring AI Alibaba pode ser concluído por meio do serviço de robô. Atualmente, ele suporta apenas a abertura de atividades de venda flash e a saída do consumo de tempo da atividade.
Entre no módulo goodskill-ai
e substitua a configuração spring.ai.dashscope.api-key
, que pode ser obtida através da plataforma Alibaba Cloud Bailian
O método principal executa a classe AiBotApplication
e acessa a página de chat http://127.0.0.1:18077
Aqui está um exemplo de conversa
我: 帮我执行秒杀
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%希望这些信息对您有帮助!如果还有其他问题或需要进一步的帮助,请随时告诉我哦!?
Adicione as etapas a seguir à seção de início rápido para iniciar um projeto completo
Entre no módulo goodskill-gateway
, inicie o gateway de serviço por meio do método principal da classe GatewayBootApplication
e acesse uniformemente vários serviços por meio do gateway.
http://www.goodskill.com/api/order/**
corresponde ao acesso ao serviço goodskill-order
http://www.goodskill.com/api/seata/**
corresponde ao acesso ao serviço goodskill-seata
http://www.goodskill.com/api/seckill/**
corresponde ao acesso ao serviço goodskill-seckill
http://www.goodskill.com/api/auth/**
corresponde ao acesso ao serviço goodskill-auth
http://www.goodskill.com/api/web/**
corresponde ao acesso ao serviço goodskill-web
O componente de limitação de corrente Sentinel
foi integrado e suporta o envio de regras de limitação de corrente por meio nacos
. Para usá-lo, você precisa iniciar o console Sentinel
e iniciá-lo com a porta 18088
O ambiente docker ainda não é compatível.
Para o método de teste de transação distribuída Seata, consulte as instruções de execução do exemplo de teste de transação distribuída Seata.
O método principal executa a classe GoodskillAdminApplication
(monitoramento do indicador de status de integridade do microsserviço)
falha na inicialização da imagem do docker es
Esse problema geralmente ocorre no ambiente Linux. Execute o seguinte comando sysctl -w vm.max_map_count=262144
ou modifique o arquivo /etc/sysctl.conf e adicione a seguinte configuração:
grep vm.max_map_count /etc/sysctl.conf
vm.max_map_count=262144
Como usar o servidor de autorização OAuth2.0 customizado neste projeto para autorização de login?
Para ser melhorado. .
Qual é a compatibilidade atual entre os vários frameworks integrados no projeto?
As versões de cada estrutura principal nas quais este projeto se baseia atualmente são relativamente novas e não foram totalmente testadas [3] .
Como resolver o erro " no available service found in cluster 'default', please make sure registry config correct and keep your seata server running
relatado no console de inicialização do serviço?
Basta iniciar o serviço seata-server
(fornecido no arquivo docker-compose.yml. Você pode consultar o site oficial do Seata para adicionar configurações relacionadas ao nacos). Se as transações distribuídas não forem utilizadas, você pode ignorar este erro e isso não afetará o funcionamento normal do serviço.
docker-compose não pode extrair a imagem
hub.docker está bloqueado. O Alibaba Cloud Image Accelerator pode ser usado na China. Para operações específicas, consulte Alibaba Cloud Image Accelerator.
Falha ao iniciar o projeto usando JDK17 ou superior
Adicione os seguintes parâmetros jvm ao iniciar, por exemplo:
--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
Atualmente, o controle do status da atividade de venda flash é baseado na máquina de estado Spring Statemachine. As vantagens de usar a máquina de estado são:
O controle unificado do status da atividade facilita a manutenção centralizada do status;
Impedir que o status do negócio seja alterado à vontade e garantir atualizações controláveis de status;
superfície | banco de dados | Se deve dividir a biblioteca | Campo de subbiblioteca | Se deve dividir a mesa | Campos de subtabela |
---|---|---|---|---|---|
sucesso_morto | MySQL | Sim (no mesmo servidor está dividido em duas bibliotecas: seckill e seckill_01) | seckill_id | Sim (dividido em duas tabelas: sucesso_killed_0 e sucesso_kill_1) | usuário_telefone |
? | Nenhuma das outras tabelas é dividida em bancos de dados ou tabelas. Por padrão, seckill é usado como banco de dados principal. |
Resolva o problema de falha na conexão do contêiner Docker com Kafka: https://www.cnblogs.com/hellxz/p/why_cnnect_to_kafka_always_failure.html