1. 微服务搭建
本地安装虚拟机,静态IP划分和docker的使用
微服务功能模块介绍以及业务模块划分与抽取
2. 前端搭建
3. 后端业务代码完善
云储存OSS的整合与使用
JSR303校验以及自定义分组校验
统一异常拦截处理和返回json格式
4. Elasticsearch学习
Elasticsearch的基础使用
Elasticsearch字段match、嵌套聚合,字段类型mapping
分词器使用,结合nginx
Java代码整合Elasticsearch,完成业务数据封装后上传ElasticSearch建立索引
5. Nginx反向代理
域名先通过本地host文件映射到Nginx,Nginx将请求负载到业务网关,业务网关根据网关断言将请求分发到具体服务
6. 压力测试与JVM调优
QPS(Query ),TPS (Transport)概念了解
JMeter的使用,指定时间指定线程数对接口进行测试,以及测试结果观察
JVM了解,堆区gc流程:
- 老年代
- 新生代
- 伊甸园区
- 大GC,小GC
7. 缓存-Redis
缓存穿透(一直查不存在的数据)–null结果缓存,并加入短暂过期时间
缓存雪崩(相同时间大批key失效)–原有失效时间的基础上增加一个随机值,减少集体失效的事件
缓存击穿(热点数据失效)–加锁
本地锁–synchronized
本地Redis锁-- set key nx ex
- 设置过期时间,必须和加锁是同步的,原子的 (setIfAbsent)
- 获取值对比+对比成功删除=原子操作 (Lua脚本)
- 其他线程自旋锁
分布式Redis锁–Redisson
- 阻塞式等待,默认加锁都是30秒 Rlock.lock()
- 默认的lock方法会自动续期,使用看门狗机制,定时任务每1/3(10秒)的看门狗时间自动续期
- 如果lock中指定了过期时间,则看门狗机制失效
- 可重入锁:A方法拿到α锁,调用B方法,B方法也需要获取α锁,可重入锁允许B直接使用A的锁
- 公平锁
- 读写锁
- 修改数据期间,写锁是一个排他锁(互斥锁),只要写锁存在,读锁就必须存在
- 读锁是共享锁,在仅是读数据期间,好似无锁一样
- 信号量 redisson.getSemaphore
- 闭锁 countDownLartch
- RCountDownlatch.await 等待指定数量的线程countDown(数量-1)以后,才继续执行后续代码
- 缓存数据一致性
- 双写模式–可能导致数据脏读,多个线程对同一个数据进行修改时,写缓存的顺序和修改数据库数据的时序不一致
- 双写模式可以通过设置数据过期时间来达到最终一致性,当缓存里的错误数据过期后会重新从数据库缓存最新在正确的数据
8. SpringCache
@Cacheable: Triggers cache population. 触发将数据保存到缓存的操作
@CacheEvict: Triggers cache eviction. 触发将数据从缓存删除的操作
@CachePut: Updates the cache without interfering with the method execution. 不影响方法执行
@Caching: Regroups multiple cache operations to be applied on a method. 组合以上多个操作
@CacheConfig: Shares some common cache-related settings at class-level. 在类级别共享缓存的相同
SpringCache的不足
- 读模式
- 缓存穿透:查询一个null数据。解决: 缓存空数据 cache-null-values=true
- 缓存击穿:大量并发进来同时查询一个正好过期的数据。解决:加锁 默认是不加锁的,加锁需要在@Cacheable里的 sync=true
- 缓存雪崩: 大量的key同时过期。解决:加随机时间。
- 写模式 (缓存与数据库一致)
- 读写加锁 (适用于读多写少的情况,如果写也多,效率会有影响)
- 引入Cancal,感知mysql的更新去更新数据库
- 读多写多的直接去查询数据库
9. 异步
线程的创建方式
- 继承Thread
- 实现Runnable接口
- 实现Callable接口 + FutureTask
- 线程池
线程池 Executors
异步编排 CompletableFuture
10. 盐值加密
11. SpringSession
社交登录
- 社交登录流程
- 第3方社交登录开通、认证成功后的url
- 社交认证成功会跳转到自定义的url,并携带一个code参数
- 拿着这个code可以访问社交登录网站开放的api接口,获取用户的信息,进行注册
- 分布式session解决方案
- SpringSession配置
- Session的Domain设置解决session作用域的问题
- 每一个服务都引入SpringSession
- SpringSession会使用Filter拦截所有的请求
- 通过SpringSession设置请求的session作用域(一般设置为顶级域名)
单点登录
- 为了解决不同顶级域名之间的session共享,需要使用单点登录
- 需要一个单独的认证服务,用于多个顶级域名不同的系统之间认证
- 当访问其中一个系统时,会检查当前用户是否登录,如果未登录,会自动跳转到单独的认证服务进行登录认证,并携带认证完成需要重定向返回页面url
- 认证完成,会重定向到指定的页面,并将生成的token返回给业务系统
- 后续业务系统的任何请求,都会携带该token,从而跳过认证过程,直接获取资源
参考