商场项目中抢单程序分离

149 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 4 天,点击查看活动详情

每日英语:

Honesty is the first chapter in the book of wisdom.

诚实是智慧之书的第一章。 -托马斯·杰斐逊

抢单程序分离

抢单程序隔离分为热门商品抢单和非热门商品抢单,我们先对抢单流程进行分析,再对抢单流程做出实现。

1 抢单流程分析

1610721829448.png

如上图,我们对抢单流程做一个分析:

1:抢单经过Gateway,在Gateway中判断商品是否是热门商品
2:如果是热门商品,就排队,同时记录用户排队标识,防止重复排队
3:如果是冷门商品,则直接执行抢单操作
4:热门商品需要在抢单程序中订阅消费排队信息,并执行下单

排队的作用是防止服务器同时间处理所有并发请求,我们将并发请求放到队列中,这种操作就是知名的队列削峰模式。

2 热门商品抢单

热门商品抢单,我们需要执行4个操作:

1:搭建微服务网关
2:在微服务网关中判断商品是否是热门商品
3:如果是热门商品,则执行排队
4:在秒杀工程中执行监听

2.1 Gateway搭建

创建mall-api-gateway微服务网关工程,在该工程中实现路由功能和热门商品抢购排队功能。

引入pom.xml依赖:(mall-api-gateway或者mall-gateway中引入依赖)

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
        <version>2.2.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
        <version>2.2.1.RELEASE</version>
    </dependency>
    <!--alibaba-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
</dependencies>

bootstrap.yml

server:
  port: 9001
spring:
  application:
    name: mall-gateway
  cloud:
    nacos:
      config:
        file-extension: yaml
        server-addr: 192.168.xxx.xxx:8848
      discovery:
        #Nacos的注册地址
        server-addr: 192.168.xxx.xxx:8848
    gateway:
      routes:
        #秒杀
        - id: seckill_route
          uri: lb://mall-seckill
          predicates:
            - Path=/mall/**
          filters:
            - StripPrefix=1
logging:
  pattern:
    console: "%msg%n"

创建第1个过滤器:com.xz.mall.api.filter.RequestFilter,代码如下:

@Configuration
public class RequestFilter implements GlobalFilter, Ordered {
​
    /***
     * 拦截所有请求
     * @param exchange
     * @param chain
     * @return
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        return chain.filter(exchange);
    }
​
    @Override
    public int getOrder() {
        return 0;
    }
}

创建启动类com.xz.mall.api.ApiGatewayApplication

@SpringBootApplication
public class ApiGatewayApplication {
​
    public static void main(String[] args) {
        SpringApplication.run(ApiGatewayApplication.class,args);
    }
}

总结

本篇主要讲述了一下商场项目中抢单程序流程分析和抢单程序分离的网关部分过滤器实现,下一篇会介绍一下具体的热门商品抢单实现。