谷粒商城学习笔记

本文围绕SpringCloud相关技术展开,介绍了微服务、注册中心、配置中心、网关等组件,还涉及图片上传云服务器、数据校验、ElasticSearch+Kibana、缓存Redis、分布式锁、Spring Cache、SEATA等内容,涵盖各技术的作用、概念、使用方法及注意点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

SpringCloud Nacos Discover

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

SpringCloud Nacos Config

作用:配置参数

一些概念:

        命名空间:分组

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

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

注意点:

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

SpringCloud GetWay

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

图片上传云服务器

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

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

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

数据校验

依赖引入:注解和校验器

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

        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>2.0.1.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>6.0.1.Final</version>
        </dependency>

使用方法:

1,字段上加@Max注解等

2,controller里加@Valid注解


        @RequestMapping("/save")
        public R save(@Valid @RequestBody CategoryEntity category){
            categoryService.save(category);

            return R.ok();
        }

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

/**
 * 统一处理异常,以json形式返回,加ResponseBody
 */
@Slf4j
@RestControllerAdvice(basePackages = "com.miaojiang.gulimall.product.controller")
public class GulimallExceptionControllerAdvice {
    @ExceptionHandler(value = Throwable.class)
    public R handleException(Throwable e){
        return R.error(UNKNOW_EXCEPTION.getCode(), UNKNOW_EXCEPTION.getMsg());
    }

    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public R handleException(MethodArgumentNotValidException e){
        // 打日志
        log.error("数据校验出现问题:{}, 异常类型:{}", e.getMessage(), e.getClass());
        
        // 遍历具体错误信息
        BindingResult bindingResult = e.getBindingResult();
        Map<String, String> errMap = new HashMap<>();
        bindingResult.getFieldErrors().forEach(fieldError ->
                errMap.put(fieldError.getField(),fieldError.getDefaultMessage()));
        return R.error(VALIDATE_EXCEPTION.getCode(), VALIDATE_EXCEPTION.getMsg()).put("data", errMap);
    }
}

其他:

分组校验

自定义校验

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值