作用:服务注册,服务发现
作用:配置参数
一些概念:
命名空间:分组
配置组:作用也是分组,颗粒度小于命名空间
本项目中使用命名空间来区分微服务间的配置,配置组来区间环境(开发、测试、生产),这些在bootstrap.properties(读取优先于application.yml)中都要配置。
注意点:
@RefreshScope + @Value 动态获取配置
作用:网关,路由服务机器;鉴权;限流
背景:用户需要上传图片。阿里云,下面都称OSS。
第一种策略是先将图片上传至服务端然后服务端再存储至OSS,当流量大时显然拥塞。
第二种策略是,用户去请求服务端的令牌,服务端发送令牌后,用户拿着令牌上传至OSS
依赖引入:注解和校验器
(过程中由于第二个校验器没引入,导致校验一直不生效)
- <dependency>
- <groupId>javax.validationgroupId>
- <artifactId>validation-apiartifactId>
- <version>2.0.1.Finalversion>
- dependency>
- <dependency>
- <groupId>org.hibernate.validatorgroupId>
- <artifactId>hibernate-validatorartifactId>
- <version>6.0.1.Finalversion>
- 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
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 Platform — Find real-time answers at scale | Elastic
作用:利用倒排索引,搜索引擎,海量数据检索,日志的存储可以采用;mysql更注重持久化
数据分析和聚合
一些概念:
Index索引<=> mysql中的DataBase
Type类型<=>mysql中的Table
Document文档<=>mysql中的数据
场景:即时性、数据一致性 要求不高的(商品分类);读多写少
spring2.0后默认使用lettuce作为操作redis的客户端或者jedis,spring对它们再做了封装成RedisTemplate。
其他:缓存雪崩、击穿、穿透
特点:配置了看门狗机制,为锁自动续时间;默认配置了30s过期时间,当线程挂了,其他线程仍能拿到锁
关键字:信号量,分布式锁(互斥、可重复锁、读写锁等)
作用:方便的注解,封装了Redis操作
支持双写和失效两种模式
源码中只对读操作进行了加本地锁操作synorize,并没有实现分布式锁。而写操作并没有管。适用于读多写少的、对数据一致性要求不高的场景
作用:控制分布式事务
一些概念:
使用场景:
对于非高并发场景,比如后台管理系统,可以用AT模式
对于高并发场景,比如秒杀,可以用可靠消息+最终一致性
RABBITMQ
死信路由/队列:超时未消费(超过TTL);消息被consumer拒收;队列满了后被丢弃的消息
延时队列:利用消息超时未消费会进入死信队列的机制,本质就是死信队列;下单时,虽然未支付,但是会锁库存,并保存订单信息,此时用到延迟队列,一段时间后校验订单是否支付,支付后则更新DB