拦截器、过滤器、AOP的区别和联系
一、什么是过滤器(Filter)过滤器,顾名思义就是起到过滤筛选作用的一种事物,只不过相较于现实生活中的过滤器,这里的过滤器过滤的对象是客户端访问的web资源,
也可以理解为一种预处理手段,对资源进行拦截后,将其中我们认为的杂质(用户自己定义的)过滤,符合条件的放行,不符合的则拦截下来
1.1、过滤器常见的使用场景
统一设置编码
过滤敏感字符
登录校验
URL级别的访问权限控制
数据压缩
1.2、Springboot 整合过滤器编写Filter
public class HeFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletExc ...
火车购票系统项目复盘
百万人抢一万张票如何保证其正常以及稳定性?前端1. 针对静态资源做CDN加速
2. 页面静态化
3. 倒计时&Loading
4. 使用验证码消峰
后端1. 微服务-服务拆分
2. 负载均衡
3. 限流降级
4. 缓存
5. 令牌
6. 异步处理-消息队列
数据库1. 分库:业务分库,读写分离
2. 分表:横向分表,纵向分表
3. 冗余设计:反范式,空间换时间
4. 分布式数据库
其他:1. 分时段秒杀
2. 弹性扩容
3. 候补+排队
Mysql的两阶段提交
MySQL 中的事务是两阶段提交,我们见到的很多分布式事务也都是两阶段提交的,例如 Seata,那么为什么要两阶段提交呢?
1.什么是两阶段提交1.1 bin log和redo logbin logbinlog 我们中文一般称作归档日志,如果大家看过松哥之前发的 MySQL 主从搭建,应该对这个日志有印象,当我们搭建 MySQL 主从的时候就离不开 binlogbinlog 是 MySQL Server 层的日志,而不是存储引擎自带的日志,它记录了所有的 DDL 和 DML(不包含数据查询语句)语句,而且是以事件形式记录,还包含语句所执行的消耗的时间等,需要注意的是:
binlog 是一种逻辑日志,他里边所记录的是一条 SQL 语句的原始逻辑,例如给某一个字段 +1,注意这个区别于 redo log 的物理日志(在某个数据页上做了什么修改)。
binlog 文件写满后,会自动切换到下一个日志文件继续写,而不会覆盖以前的日志,这个也区别于 redo log,redo log 是循环写入的,即后面写入的可能会覆盖前面写入的。
一般来说,我们在配置 binlog 的时候,可以指定 binl ...
JVM垃圾回收
1.GC 垃圾回收GC就是垃圾收集的意思(Gabage Collection)在开发中会创建很多对象,这些对象一股脑的都扔进了堆里,如果这些对象只增加不减少,那么堆空间很快就会被耗尽。所以我们需要把一些没用的对象清理掉。这个时候JVM就提供了垃圾回收机制
垃圾回收,就是要把那些不再使用的对象找出来然后清理掉,释放其占用的内存空间
2.判断是否为垃圾对象的两种方式
引用计数法
可达性分析法
2.1 引用计数法它的做法是给对象添加一个引用计数器,每当有一个地方引用该对象,这个计数器就加1。当引用失效时,计数器就减1。如果计数器为0了,说明该对象不再被引用,成为死亡对象。不过这种算法有一个致命缺点,就是无法处理对象相互引用的情况。假如有A、B两个对象,它们互相引用,那么对象中的引用计数器会始终大于0。
2.2 可达性分析法可达性分析法就是目前的主流算法,也是java正在使用的算法。
它的做法是,通过一系列被称为“GC Roots”的对象作为起点,从这些起点开始往下搜索,搜索所走过的路径称为引用链(Reference Chain)。当一个对象没有和任何引用链相连,即称为该对象不可达(图论的说 ...
探店系统的登录
登录功能实现流程基于session实现登录
@Override
public Result sendCode(String phone, HttpSession session) {
// 1.校验手机号
if (RegexUtils.isPhoneInvalid(phone)) {
// 2.如果不符合,返回错误信息
return Result.fail("手机号格式错误!");
}
// 3.符合,生成验证码
String code = RandomUtil.randomNumbers(6);
// 4.保存验证码到 session
stringRedisTemplate.opsForValue().set(LOGIN_CODE_KEY + phone, code, LOGIN_CODE_TTL, TimeUnit.MINUTES);
// 5.发送验证码
log.debug("发送短信验证码成功,验证码:{}", code);
// 返回ok
return ...
Spring如何解决循环依赖问题
AOP问题,提前AOP解决
二级缓存 earlySingletonObjects保证不完整的Bean是单例的解决循环依赖问题但无法解决AOP循环依赖问题
三级缓存 singletonFactories在Bean初始化一开始的时候就将lambda表达式存入三级缓存保存lamada表达式,可以根据lamada表达式判断,bean是否进行AOP如果进行AOP则将代理对象放入二级缓存如果没有进行AOP则将依赖注入过的普通对象放入二级缓存让解决循环依赖的问题变得更加方便
Spring中Bean的生命周期
1. Bean的生命周期Spring中Bean的生命周期分为两种
Bean创建的生命周期
Bean销毁的生命周期
1.1 Bean的创建生命周期要想搞清楚Bean的生命周期,我们首先需要对Bean对象有清晰的了解
1. Bean对象和普通对象UserService userService = (UserService)applicationContext.getBean("userService");
从中获取的就是Bean对象
UserService userService = new UserService();
使用new的方式,构建出来的就为普通对象
2. Bean的创建流程我们都知道对象的创建都是依靠构造方法进行创建的,Spring也不例外,所以我们能得出一下流程我们的UserService Bean对象是通过UserService类—->得到无参构造方法—->获取到普通对象—->经过一系列处理—->Bean对象那么要想知道在普通对象和Bean对象之间,进行了那些操作,我们可以再详细看一看
//先创建OrderService类
@Component ...
从输入URL到页面展示到底发生了什么?
从输入URL到页面渲染的过程从输入URL到页面渲染需要Chrome浏览器的多个进程配合,所以我们先来谈谈现阶段Chrome浏览器的多进程架构。
一.Chrome架构目前Chrome采用的是多进程的架构模式,可分为主要的五类进程,分别是:浏览器(Browser)主进程、 GPU 进程、网络(NetWork)进程、多个渲染进程和多个插件进程;
浏览器进程–主要负责界面显示、用户交互、子进程管理,同时提供存储等功能。
渲染进程–核心任务是将 HTML、CSS 和 JavaScript 转换为用户可以与之交互的网页,排版引擎Blink和JavaScript引擎V8都是运行在该进程中,默认情况下,Chrome会为每个Tab标签创建一个渲染进程。出于安全考虑,渲染进程都是运行在沙箱模式下。
GPU进程–其实,Chrome刚开始发布的时候是没有GPU进程的。而GPU的使用初衷是为了实现3D CSS的效果,只是随后网页、Chrome的UI界面都选择采用GPU来绘制,这使得GPU成为浏览器普遍的需求。最后,Chrome在其多进程架构上也引入了GPU进程。
网络进程–主要负责页面的网络资源加载,之前是作 ...
基于Java语言实现的RPC框架
1.理论篇概念RPC:Remote Procedure Call,即远程过程调用是分布式系统常见的一种通信方法,从跨进程到跨物理机已经有几十年历史跨进程交互形式:RESTful WebService HTTP 基于DB做数据交换 基于MQ做数据交换 以及RPC图解交互形式现有框架对比核心原理(整体架构)
Server: Provider,暴露服务,服务提供方
Client: Consumer,服务消费,调用远程服务
Registry: 服务注册与发现
技术栈:
基础知识:JavaCore,Maven,反射
动态代理(生成client存根实际调用对象)
Java的动态代理
序列化(Java对象与二进制数据互转)
fastjson
序列号:Java对象转为二进制数组
反序列化:二进制数组转为Java对象
网络通信(传输序列化后的数据)
jetty,URLConnection
2.实战篇1.类图
2.创建工程引入依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.a ...
消息队列
消息队列1.消息队列的介绍消息队列(Message Queue),字面意思是存放消息的队列,最简单的消息队列模型包括3个角色:
消息队列: 存储和管理信息,也被称为消息代理(Message Broker)
生产者: 发送消息到消息队列
消费者: 从消息队列获取信息并处理消息
消息队列的主要作用就是 解耦、消峰针对MQ的解耦功能,这里举一个生活的例子帮助理解:假设我们在网上购买了商品,在开会的时候,快递小哥打电话告知物品已经送到,需要现在立刻去取,只有我们取了快递小哥才会结束他的工作,我们才能收到物品(这个流程才能结束)这个时候,我们只能先和领导打个招呼请假,才能回去签收交接,快递小哥也只能站在原地等待我们回去,整个流程是很不灵活的、很死板,在一次交接完成之前,双方都不能灵活处理其他事情了例子类似于我们在业务流程中基于http/rpc发起的一次同步请求,上游(快递小哥)在发出请求后(打电话),会阻塞等待下游(作为签收方的我们)给到反馈(完成签收的操作),否则整个流程会一致阻塞住。然而在实际场景中,还有一个快递的驿站来帮我们作为中转,快递小哥可以先将我们的物品存放在驿站中,登记号接收方 ...
实习总结
新平台XCloud开发学习1.简单功能的实现1.1 配置系统host在虚拟机中配置好了Mysql,Redis的环境,现在需要在本地系统Host文件中加上虚拟机中的ip地址以及相应映射关系,同时也加上vsn-register、vsn-gateway相应的本地映射ip,方便后续调用。
查找虚拟机对应的ip地址文件配置使用的是SwitchHost工具进行配置
1.2 生成微服务cmd环境下运行运行结果该cd路径下生成了一个基本项目项目结构更改配置文件
server:
port: 6901
spring:
application:
name: @artifactId@
cloud:
nacos:
discovery:
server-addr: ${NACOS_HOST:vsn-register}:${NACOS_PORT:8848}
metadata: { "VERSION": "1.0" }
namespace: vsn-${spring.profiles.active}
config: ...