从0到1构建高并发电商返利APP:基于Spring Cloud Alibaba的分布式架构设计与核心模块拆解
从0到1构建高并发电商返利APP:基于Spring Cloud Alibaba的分布式架构设计与核心模块拆解
大家好,我是阿可,微赚淘客系统及省赚客APP创始人,是个冬天不穿秋裤,天冷也要风度的程序猿!
电商返利APP核心诉求是高并发、高可用,尤其在大促期间需承载百万级用户访问,基于Spring Cloud Alibaba的分布式架构能有效解决这一需求。下面从架构设计到核心模块代码实现,拆解完整构建流程。
一、整体分布式架构设计
基于Spring Cloud Alibaba,架构分为五层,各层职责明确且解耦,支撑高并发场景:
- 接入层:Nginx+Gateway,负责请求转发、负载均衡与限流
- 应用层:微服务集群,包含用户、返利、订单等核心服务
- 中间件层:Sentinel(限流)、Nacos(注册配置)、Redis(缓存)、RocketMQ(消息队列)
- 数据层:MySQL(主从)+Elasticsearch(商品检索)
- 监控层:Prometheus+Grafana,实时监控服务状态
二、核心组件配置实现
2.1 Nacos注册与配置中心集成
微服务需接入Nacos实现服务注册与配置管理,以用户服务为例:
1. 依赖引入(pom.xml)
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2. 服务启动类(UserApplication.java)
package cn.juwatech.user;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@SpringBootApplication
@EnableDiscoveryClient // 开启Nacos服务注册
public class UserApplication {public static void main(String[] args) {SpringApplication.run(UserApplication.class, args);}
}
3. 配置文件(bootstrap.yml)
spring:application:name: juwatech-user-servicecloud:nacos:discovery:server-addr: 127.0.0.1:8848config:server-addr: 127.0.0.1:8848file-extension: yamlgroup: DEFAULT_GROUP
2.2 Sentinel限流配置
大促期间需防止流量击穿服务,通过Sentinel实现接口限流:
package cn.juwatech.user.config;import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@Configuration
public class SentinelConfig {// 用户登录接口限流配置,QPS阈值1000@GetMapping("/api/user/login")@SentinelResource(value = "userLogin", blockHandler = "loginBlockHandler")public String userLogin(String username, String password) {// 登录业务逻辑return "login_success";}// 限流降级处理方法public String loginBlockHandler(String username, String password, BlockException e) {return "当前登录人数过多,请稍后重试";}
}
三、核心业务模块代码实现
3.1 返利计算模块(RebateService.java)
返利计算是核心逻辑,需支持多规则(比例、固定金额)且保证线程安全:
package cn.juwatech.rebate.service;import cn.juwatech.rebate.entity.OrderRebate;
import cn.juwatech.rebate.mapper.OrderRebateMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import java.math.BigDecimal;@Service
public class RebateService {@Autowiredprivate OrderRebateMapper orderRebateMapper;/*** 计算订单返利* @param orderId 订单ID* @param orderAmount 订单金额* @param rebateRate 返利比例(如0.05表示5%)* @return 返利结果*/@Transactional(rollbackFor = Exception.class)public OrderRebate calculateRebate(Long orderId, BigDecimal orderAmount, BigDecimal rebateRate) {// 1. 计算返利金额(订单金额 * 返利比例,保留2位小数)BigDecimal rebateAmount = orderAmount.multiply(rebateRate).setScale(2, BigDecimal.ROUND_HALF_UP);// 2. 构建返利记录OrderRebate rebate = new OrderRebate();rebate.setOrderId(orderId);rebate.setOrderAmount(orderAmount);rebate.setRebateRate(rebateRate);rebate.setRebateAmount(rebateAmount);rebate.setRebateStatus(0); // 0-待发放,1-已发放// 3. 保存返利记录orderRebateMapper.insert(rebate);return rebate;}
}
3.2 分布式缓存实现(RedisConfig.java)
用户信息、商品返利规则需缓存,减少DB压力:
package cn.juwatech.common.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(factory);// 序列化配置StringRedisSerializer stringSerializer = new StringRedisSerializer();GenericJackson2JsonRedisSerializer jsonSerializer = new GenericJackson2JsonRedisSerializer();// key序列化template.setKeySerializer(stringSerializer);// value序列化template.setValueSerializer(jsonSerializer);// hash key序列化template.setHashKeySerializer(stringSerializer);// hash value序列化template.setHashValueSerializer(jsonSerializer);template.afterPropertiesSet();return template;}
}
3.3 订单异步处理(RocketMQ配置)
订单创建后异步处理返利发放,避免同步阻塞:
package cn.juwatech.order.producer;import com.alibaba.fastjson.JSON;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.common.message.Message;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RocketMQProducerConfig {@Value("${rocketmq.producer.group}")private String producerGroup;@Value("${rocketmq.name-server}")private String nameServer;@Beanpublic DefaultMQProducer defaultMQProducer() throws Exception {DefaultMQProducer producer = new DefaultMQProducer(producerGroup);producer.setNamesrvAddr(nameServer);producer.start();return producer;}// 发送订单消息到返利队列public void sendOrderRebateMsg(Long orderId) throws Exception {DefaultMQProducer producer = defaultMQProducer();String msgBody = JSON.toJSONString(orderId);Message message = new Message("order_rebate_topic", "rebate_tag", msgBody.getBytes());producer.send(message);}
}
四、高并发优化要点
- 数据库分库分表:使用Sharding-JDBC对订单、用户表分库,按用户ID哈希分片
- 缓存预热:大促前通过脚本将热门商品返利规则加载到Redis
- 接口异步化:非核心流程(如消息通知)通过RocketMQ异步处理
- 服务降级:通过Sentinel配置,当DB压力过大时,临时走缓存默认返利规则
本文著作权归聚娃科技省赚客app开发者团队,转载请注明出处!