组件总结:微服务、注册中心、配置中心、远程调用、网关
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