• 谷粒商城学习笔记


    组件总结:微服务、注册中心、配置中心、远程调用、网关

    SpringCloud Nacos Discover

    作用:服务注册,服务发现

    SpringCloud Nacos Config

    作用:配置参数

    一些概念:

            命名空间:分组

            配置组:作用也是分组,颗粒度小于命名空间

    本项目中使用命名空间来区分微服务间的配置,配置组来区间环境(开发、测试、生产),这些在bootstrap.properties(读取优先于application.yml)中都要配置。

    注意点:

    • 参数配置的文件除了nacos上要配,本地也要配application.properties文件,否则服务启不来。当nacos上读不到属性时,会用本地文件兜底
    • 配置名默认为:服务名.properties
    • @RefreshScope + @Value 动态获取配置

    SpringCloud GetWay

    作用:网关,路由服务机器;鉴权;限流

    图片上传云服务器

    背景:用户需要上传图片。阿里云,下面都称OSS

    第一种策略是先将图片上传至服务端然后服务端再存储至OSS,当流量大时显然拥塞。

    第二种策略是,用户去请求服务端的令牌,服务端发送令牌后,用户拿着令牌上传至OSS

    数据校验

    依赖引入:注解和校验器

    (过程中由于第二个校验器没引入,导致校验一直不生效)

    1. <dependency>
    2. <groupId>javax.validationgroupId>
    3. <artifactId>validation-apiartifactId>
    4. <version>2.0.1.Finalversion>
    5. dependency>
    6. <dependency>
    7. <groupId>org.hibernate.validatorgroupId>
    8. <artifactId>hibernate-validatorartifactId>
    9. <version>6.0.1.Finalversion>
    10. dependency>

    使用方法:

    1,字段上加@Max注解等

    2,controller里加@Valid注解

    1. @RequestMapping("/save")
    2. public R save(@Valid @RequestBody CategoryEntity category){
    3. categoryService.save(category);
    4. return R.ok();
    5. }

    3,全局加校验器,处理异常

    1. /**
    2. * 统一处理异常,以json形式返回,加ResponseBody
    3. */
    4. @Slf4j
    5. @RestControllerAdvice(basePackages = "com.miaojiang.gulimall.product.controller")
    6. public class GulimallExceptionControllerAdvice {
    7. @ExceptionHandler(value = Throwable.class)
    8. public R handleException(Throwable e){
    9. return R.error(UNKNOW_EXCEPTION.getCode(), UNKNOW_EXCEPTION.getMsg());
    10. }
    11. @ExceptionHandler(value = MethodArgumentNotValidException.class)
    12. public R handleException(MethodArgumentNotValidException e){
    13. // 打日志
    14. log.error("数据校验出现问题:{}, 异常类型:{}", e.getMessage(), e.getClass());
    15. // 遍历具体错误信息
    16. BindingResult bindingResult = e.getBindingResult();
    17. Map errMap = new HashMap<>();
    18. bindingResult.getFieldErrors().forEach(fieldError ->
    19. errMap.put(fieldError.getField(),fieldError.getDefaultMessage()));
    20. return R.error(VALIDATE_EXCEPTION.getCode(), VALIDATE_EXCEPTION.getMsg()).put("data", errMap);
    21. }
    22. }

    其他:

    分组校验

    自定义校验

    ElasticSearch+Kibana(查询可视化)

    Elasticsearch Platform — Find real-time answers at scale | Elastic

    作用:利用倒排索引,搜索引擎,海量数据检索,日志的存储可以采用;mysql更注重持久化

    数据分析和聚合

    一些概念:

    Index索引<=> mysql中的DataBase

    Type类型<=>mysql中的Table

    Document文档<=>mysql中的数据

    缓存Redis

    场景:即时性、数据一致性 要求不高的(商品分类);读多写少

    spring2.0后默认使用lettuce作为操作redis的客户端或者jedis,spring对它们再做了封装成RedisTemplate。

    其他:缓存雪崩、击穿、穿透

    分布式锁Redlock,Redission框架

    特点配置了看门狗机制,为锁自动续时间;默认配置了30s过期时间,当线程挂了,其他线程仍能拿到锁 

    关键字:信号量,分布式锁(互斥、可重复锁、读写锁等)

    Spring Cache

    作用:方便的注解,封装了Redis操作

    支持双写和失效两种模式

    源码中只对读操作进行了加本地锁操作synorize,并没有实现分布式锁。而写操作并没有管。适用于读多写少的、对数据一致性要求不高的场景

    SEATA

    作用:控制分布式事务

    一些概念:

    •      TC:全局的事务管理器
    •      TM:大事务管理,TM可能包含若干RM
    •      RM:某个微服务的事务管理

    使用场景:

    对于非高并发场景,比如后台管理系统,可以用AT模式

    对于高并发场景,比如秒杀,可以用可靠消息+最终一致性

    RABBITMQ

    死信路由/队列:超时未消费(超过TTL);消息被consumer拒收;队列满了后被丢弃的消息

    延时队列:利用消息超时未消费会进入死信队列的机制,本质就是死信队列;下单时,虽然未支付,但是会锁库存,并保存订单信息,此时用到延迟队列,一段时间后校验订单是否支付,支付后则更新DB

  • 相关阅读:
    栈的基本操作
    海康Visionmaster-环境配置:VB.Net 二次开发环境配 置方法
    6.jvm中对象创建流程与内存分配
    白话讲解UML的4大关系:关联关系、泛化关系、依赖关系、实现关系
    使用Postman进行压力测试
    vue+minio实现文件上传操作
    SprringCloud Gateway动态添加路由不重启
    day14 - 提取图像信息
    Centos7 linux 中 防火墙操作命令及SSH远程连接
    不用rustup,Windows下gnu版Rust安装与开发环境配置
  • 原文地址:https://blog.csdn.net/m0_53688600/article/details/133465310