宝典
Spring的bean的生命周期什么是AOP,你们项目中有没有使用AOP
AOP是面向切面编程,用于那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取公共模块复用,降低耦合。
记录操作日志
使用AOP中的环绕增强+切点表达式(找到记录日志的方法),通过环绕增强的参数获取请求方法的参数(类、方法、注解、请求方式),获取到这些参数后,保存到数据库。
SpringBoot自动装配的原理
@SpringBootApplication:
1.@SpringBootConfiguration:声明这是一个配置类,与@Configuration作用相同
2.@ComponentScan:组件扫描,扫面当前引导类所在包及其子包
3.@EnableAutoConfiguration:实现自动化配置的核心注解。
-3.1 @Import({AutoConfigurationImportSelector.class}) 导入自动配置选择器到spring容器中。
-导入AutoConfigurationImportSelector.class,会将META-INF下面的spring.f ...
RabbitMQ
RabbitMQ什么是RabbitMQ?
高性能的异步通信组件
时效性差,并发性能高
同步异步调用同步调用
同步调用的优势:
时效性强,等待到结果后才返回
问题:
拓展性差
性能下降
级联失败问题
异步调用
异步调用的三个角色
消息发送者:投递消息的人,调用方
消息代理:管理、暂存、转发消息
消息接收者: 接受消息的人,服务提供方
优势:
解除耦合,拓展性强
无需等待,性能好
故障隔离
缓存消息,流量削峰填谷
问题:
不能及时得到调用结果,时效性差
不能确定下游业务是否成功
业务安全完全依赖于消息代理(Broker)的可靠性
RabbitMQ开始RabbitMQ的安装Docker镜像拉取
docker pull rabbitmq
部署
docker run -d –name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq
创建用户
rabbitmqctl add_user admin your_password
如果拉取镜像部署完,并且端口已开放,还是无法访问,这说明RabbitMQ管理插件未启用,进入容器后,输入rabb ...
Redis-分布式锁
分布式锁使用场景
抢券流程
在该场景下,线程1对数据库数据进行查询,之后线程2也对数据库的库存进行查询,查询结果都是1,但是线程1先执行了扣除库存的操作,库存这时为0,紧接着线程2也执行的删减库存的操作,这时出现的超买超卖的情况。
本地锁
多线程synchronized(/ˈsɪŋkrənaɪzd/)同步锁,通过加锁保证线程1的减库存操作执行完成后,再执行线程2,确保不会出现超买超卖的情况。
分布式锁
由于现在大部分公司的项目面对大部分的群体,为了保证服务能应对这种并发场景,服务采用集群式,同一个服务部署在多台Tomcat服务器上,此时出现的问题是集群中一个实例的锁并不能共享到另一个实例里面,故这种业务场景只能使用分布式锁。
setnx命令
Redis实现分布式锁主要利用Redis的setnx命令。setnx是set if not exists(如果不存在,则set)的简写
获取锁
12#添加锁,NX是互斥,EX是设置超时时间SET lock value NX EX 10
设置失效时间是因为如果在加锁过后服务超时或者服务宕机,获取的锁没有被释放 ...
WebSocket
WebSocketWebSocket
WebSocket Protocol一种新的HTML5协议,实现了浏览器与服务器(B/S架构)全双工通信,一开始的握手(建立连接,长连接)需要借助HTTP请求完成。
全双工通信: 同时双向传输数据(A->B,B->A),瞬时同步
WebSocket: 真正实现全双工通信的服务器向客户端推的互联网技术。原理类似广播播音
WebSocket协议使用较少的开销来维持连接,相对于传统的Socket,它不需要频繁地建立和关闭连接,减少了服务器的负担
@OnOpen 成功建立连接调用
GateWay-网关
GateWay什么是GateWay
基于Spring 5.0 、SpringBoot 2.0和Project Reactor开发的高性能API网关组件
API网关
API网关是一个中间层,集中管理、保护和优化API请求与响的通信。
API 网关提供了安全、流控、过滤、缓存、计费以及监控等 API 管理功能,使得系统更易于管理、更安全、更高效,并提供了更好的可视化和分析能力。
GateWay的主要概念
Route(路由) : 由一个 ID、一个目标 URI、一组断言(Predicate)和一组过滤器(Filter)组成
1.地址映射转发:
http://网关ip:网关端口/服务名映射/xxxx?xxx=x
2.服务名映射/xxxx?xxx=x 转换成对应的微服务的请求地址,再把请求发出
Predicate(断言): 对 HTTP 请求进行匹配 -> 判读用哪一条路由
Filter(过滤器): 对请求进行拦截和修改 -> 插件机制 ,责任链模式组装,aop增强机制
GateWay开始GateWay的搭建 ...
服务哨兵-sentinel
服务雪崩什么是服务雪崩?
服务雪崩是一种因”服务提供者的不可用”导致”服务调用者不可用”,并将不可用逐渐放大的现象
雪崩的原因及三个阶段
阶段一: 服务不可用
– 硬件故障
– 程序BUG
– 缓存击穿 -> 例如一个程序是通过id号查询其详细信息,我们利用redis缓存保存一些热点信息,当一个查询的id不在缓存内时,会转向数据库查询这些数据,每次访问这些数据都会直接去查询数据库里面的信息
– 用户的大量请求
阶段二: 调用端的重试加大流量(例: openfeign的底层使用了重试器,当用户发送请求时,发生了网络抖动,导致请求无法在规定的时间的时间内拿到数据,这时重试器会再次发送这个请求,再次对数据进行拉去)
– 用户重试
– 代码逻辑重试
阶段三: 服务调用者不可用 ->同步等待造成的资源耗尽
解决方案:
流控限流
缓存预加载
服务降级(保留重要的服务关闭不重要的服务;降低一致性)
服务熔断
舱壁模式 规定每个业务的最大线程数
服务熔断-断路器模式
最开始处于closed状态, ...
配置中心-nacos
配置中心nacos配置文件在项目中出现的问题
我们一般把配置文件以yml或properties的形式放在项目中,修改了配置文件之后,只有重启服务后,配置文件才能生效
配置中心优点
1.动态更新配置文件
2.统一配置管理
配置文件分级管理
与服务器状态保持一致
文件管理
问题(配置中心>命令行>配置文件)
发布配置文件到配置中心1.新建命名空间
2.在配置列表中新建配置
DataId配置规范
${prefix}-${spring.profiles.active}.${file-extension}
${prefix}: 前缀 - 服务名
${spring.profiles.active}: 环境名
${file-extension}: 文件后缀名
将配置格式改为yaml,然后将将本地的项目的application配置文件复制到配置中,并注释掉本地配置(避免启动项目时两者发生冲突)
3.导入依赖
因为要在微服务启动时就要访问到nacos配置中心,所以需要导入依赖开启nacos配置中心支持
因为本地application.yml文件放入nacos中后无法访问到配置中心的 ...
设计模式
builder构造器设计模式。。。
观察者模式
Observer Observable
reactor
webflux.
。。。