微服务课程笔记 | 青训营

105 阅读1分钟

系统设计

如何做系统设计

  1. 场景分析 ( Scenario ) 什么系统,需要哪些功能,多大的并发量
  2. 存储设计 ( Storage ) 数据如何组织,Sql存储,NoSql存储
  3. 服务设计 ( Service ) 业务功能实现和逻辑整合
  4. 可扩展性( Scale ) 解决设计缺陷,提高鲁棒性、扩展性

如何发现系统瓶颈

火焰图分析,链路追踪,性能测试

存储设计(三级存储)

MysQL -> Redis -> Localcache

  1. MySQL
  • 安装MySQL,推荐使用MySQL8及以上版本
  • 熟悉ddl,dml等基础语法
  • 了解sql优化
  1. Redis
  • 安装Redis,推荐最新版本
  • 了解Redis的基本数据类型和使用场景
  • 熟悉常用命令
  • 了解Lua脚本的使用
  • 了解Redis分布式锁

服务

子服务:用户服务,风控服务,活动服务,订单服务 基础组件:ID生成器,缓存组件,MQ组件,限流组件

代码实践

  1. 流程图 image.png
  2. 基本概念
  • Spu
  • Sku
  • 秒杀业务的特点
  1. 秒杀的挑战
  • 资源有限性
  • 反欺诈
  • 高性能
  • 防止超卖
  • 流量管控
  • 扩展性
  • 鲁棒性
  1. 代码分析
    PromotionController.java 创建活动业务
java
复制代码
@PostMapping("/activity")
@RateLimit(rate = RateEnum.RATE_100_PER_SECONDS)
public ResponseData<?> createPromoActivity(@RequestBody CreateActivityRequest createActivityRequest) {

    Long start = createActivityRequest.getStartTime();
    Long end = createActivityRequest.getEndTime();
    if (start > end || System.currentTimeMillis() > start) {
        throw new BizException(ResponseEnum.ILLEGAL_ARGUMENT);
    }
    if (CollectionUtils.isEmpty(createActivityRequest.getPromoProducts())) {
        throw new BizException(ResponseEnum.ILLEGAL_ARGUMENT);
    }

    CreateActivityModel model = createActivityRequest.convert(PromoConverter::convertCreateActivityModel);
    List<CreatePromoProductModel> promoProductModels = hPromotionService.CreatePromoActivity(model);

    return ResponseData.Success(promoProductModels);
}

首先获得活动的起始时间和结束时间,如果开始时间大于结束时间或者当下时间大于开始时间,就返回非法信息,如果活动的折扣商品信息为空,也返回非法信息。
用PromoConverter的convertCreateActivityModel方法将活动CreateActivityRequest类型整合成CreateActivityModel类型,传入HPromotionService的CreatePromoActivity方法,最后返回是否成功开启活动的信息。