获得徽章 7
- #青训营 x 字节后端训练营#
#C8
详解三次握手:
第一次握手,建立连接时,客户端发送SYN包到服务器,并进入SYN_SENT状态,等待服务器确认,其中SYN就是同步序列编号。
第二次握手,服务器收到SYN包,必须确认客户的SYN,同时自己也发送一个SYN包,即是SYN+ACK包,此时服务器进入SYN_RECV状态。
第三次握手,客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK,此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据。
http状态码以及含义:
对于1xx的状态码,为信息状态码,100 为继续,表示确认,成功返回具体参数信息。
对于2xx的状态码,200 表示正常返回信息,201表示请求成功并且服务器创建了新的资源,202表示服务器已接受请求,但尚未处理。
对于3xx,重定向,301表示,请求的网页已永久移动到新位置,302表示,临时性重定向,303表示临时性重定向,且总是使用 GET 请求新的 URI。304表示,自从上次请求后,请求的网页未修改过。
对于4xx,客户端错误,404,服务器无法理解请求的格式,客户端不应当尝试再次使用相同的内容发起请求,401,请求未授权,403,禁止访问,404,找不到如何与 URI 相匹配的资源。
对于5xx,服务器错误,500,最常见的服务器端错误,503,服务器端暂时无法处理请求,可能是过载或维护。展开评论点赞 - #青训营 x 字节后端训练营#
2023/05/23
#C8
说说ThreadLocal原理?
ThreadLocal可以理解为线程本地变量,他会在每个线程都创建一个副本,那么在线程之间访问内部副本变量就行了,做到了线程之间互相隔离,相比于synchronized的做法是用空间来换时间。
ThreadLocal有一个静态内部类ThreadLocalMap,ThreadLocalMap又包含了一个Entry数组,Entry本身是一个弱引用,他的key是指向ThreadLocal的弱引用,Entry具备了保存key value键值对的能力。
弱引用的目的是为了防止内存泄露,如果是强引用那么ThreadLocal对象除非线程结束否则始终无法被回收,弱引用则会在下一次GC的时候被回收。
但是这样还是会存在内存泄露的问题,假如key和ThreadLocal对象被回收之后,entry中就存在key为null,但是value有值的entry对象,但是永远没办法被访问到,同样除非线程结束运行。
但是只要ThreadLocal使用恰当,在使用完之后调用remove方法删除Entry对象,实际上是不会出现这个问题的。展开评论点赞 - #青训营 x 字节后端训练营#
2023/05/22
#C8
分布式事务的解决方案有如下几种:
全局事务
基于可靠消息服务的分布式事务
TCC
最大努力通知
1.全局事务基于DTP模型实现。DTP是由X/Open组织提出的一种分布式事务模型——X/Open Distributed Transaction Processing Reference Model
2.基于可靠消息服务的分布式事务,这种实现分布式事务的方式需要通过消息中间件来实现。假设有A和B两个系统,分别可以处理任务A和任务B。此时系统A中存在一个业务流程,需要将任务A和任务B在同一个事务中处理。
3.TCC即为Try Confirm Cancel,它属于补偿型分布式事务。顾名思义,TCC实现分布式事务一共有三个步骤:
Try:尝试待执行的业务
这个过程并未执行业务,只是完成所有业务的一致性检查,并预留好执行所需的全部资源
Confirm:执行业务
这个过程真正开始执行业务,由于Try阶段已经完成了一致性检查,因此本过程直接执行,而不做任何检查。并且在执行的过程中,会使用到Try阶段预留的业务资源。
Cancel:取消执行的业务
若业务执行失败,则进入Cancel阶段,它会释放所有占用的业务资源,并回滚Confirm阶段执行的操作。
4.最大努力通知也被称为定期校对,其实在方案二中已经包含,这里再单独介绍,主要是为了知识体系的完整性。
ps:理论向,需根据实际业务落地。juejin.cn
展开评论点赞 - #青训营 x 字节后端训练营#
2023/05/21
#C8
说一说cookies,sessionStorage 和 localStorage 的区别?
cookie是网站用来标识用户身份而存储在用户本地终端上的数据
cookie数据始终在同源的http请求中携带,即使是不需要的情况,so,会在浏览器和服务器间来回传递
sessionStorage和localStorage不会自动把数据发送给服务器,仅仅在本地保存
存储的大小:
cookie的数据大小不能超过4k;sessionStorage和localStorage虽然也有存储大小的限制,但比cookie大得多,可以达到5M或者更大。
有限期时间:
localStorage存储持久数据,浏览器关闭后数据不会丢失,除了主动删除数据
sessionStorage数据在当前浏览器窗口关闭后自动删除
设置得cookie过期时间之前都有效,就算窗口或者是浏览器关闭
展开评论点赞 - #青训营 x 字节后端训练营# 2023/05/19
#C8 计算机实际应用
从浏览器地址栏输入url到显示页面的步骤
1.简单说说,浏览器根据请求的url交给dns域名解析,查找真正的ip地址,向服务器发起请求;
2.服务器交给后台处理后,返回数据,浏览器会接收到文件数据,比如,html,js,css,图像等;
3.然后浏览器会对加载到的资源进行语法解析,建立相应的内部数据结构;
4.载入解析到的资源文件,渲染页面,完成显示页面效果。
再次详细解释一下,从浏览器接收url,开始进行网络请求线程,发出一个完整的HTTP请求,从服务器端接收请求到对应的后台接收到请求,然后是后台和前台的http交互;其中的缓存问题(http的缓存),浏览器接收到http数据包后的解析流程,css的可视化格式模型,js引擎解析过程等;其他呈现页面效果。
这里就需要你对浏览器内核的理解:
其中主要的渲染引擎和JS引擎,这里了解一下你对浏览器内核的理解。
渲染引擎,是负责取得网页的内容,整理信息,以及计算网页的显示方式,然后输出到显示器上。
JS引擎是用于解析和执行javascript来实现网页的动态效果。
浏览器的内核的不同对于网页的语法解释会有不同,所以渲染的效果也不相同。其实最开始渲染引擎和JS引擎是没有区分明确的,不过后来JS引擎越来越独立,so,内核就倾向于渲染引擎。
对于资源请求/获取,资源响应/页面渲染,会给网络带宽和设备资源带来压力,这个时候就会考虑到web的性能优化。展开评论点赞 - #青训营 x 字节后端训练营#
2023/05/18
#C7
Spring IoC循环依赖问题
循环依赖其实就是循环引⽤,也就是两个或者两个以上的 Bean 互相持有对⽅,最终形成闭环。⽐如A依赖于B,B依赖于C,C⼜依赖于A。
注意,这⾥不是函数的循环调⽤,是对象的相互依赖关系。循环调⽤其实就是⼀个死循环,除⾮有终结条件。
Spring中循环依赖场景有:构造器的循环依赖(构造器注⼊);Field 属性的循环依赖(set注⼊)。
其中,构造器的循环依赖问题⽆法解决,只能拋出 BeanCurrentlyInCreationException 异常,在解决属性循环依赖时,spring采⽤的是提前暴露对象的⽅法。
Spring 不⽀持原型 bean 的循环依赖。
单例bean通过setXxx或者@Autowired进⾏循环依赖
Spring 的循环依赖的理论依据基于 Java 的引⽤传递,当获得对象的引⽤时,对象的属性是可以延后设置的,但是构造器必须是在获取引⽤之前
Spring通过setXxx或者@Autowired⽅法解决循环依赖其实是通过提前暴露⼀个ObjectFactory对象来完成的,简单来说ClassA在调⽤构造器完成对象初始化之后,在调⽤ClassA的setClassB⽅法之前就把ClassA实例化的对象通过ObjectFactory提前暴露到Spring容器中。
1.Spring容器初始化ClassA通过构造器初始化对象后提前暴露到Spring容器。
2.ClassA调⽤setClassB⽅法,Spring⾸先尝试从容器中获取ClassB,此时ClassB不存在Spring容器中。
3.Spring容器初始化ClassB,同时也会将ClassB提前暴露到Spring容器中
4.ClassB调⽤setClassA⽅法,Spring从容器中获取ClassA ,因为第⼀步中已经提前暴露了ClassA,因此可以获取到ClassA实例
ClassA通过spring容器获取到ClassB,完成了对象初始化操作。
5.这样ClassA和ClassB都完成了对象初始化操作,解决了循环依赖问题。展开评论点赞 - #青训营 x 字节后端训练营#
2023/05/17
#C7
FactoryBean 和 BeanFactory
BeanFactory接⼝是容器的顶级接⼝,定义了容器的⼀些基础⾏为,负责⽣产和管理Bean的⼀个⼯⼚,具体使⽤它下⾯的⼦接⼝类型,⽐如ApplicationContext;此处我们重点分析FactoryBean
Spring中Bean有两种,⼀种是普通Bean,⼀种是⼯⼚Bean(FactoryBean),FactoryBean可以⽣成某⼀个类型的Bean实例(返回给我们),也就是说我们可以借助于它⾃定义Bean的创建过程。
Bean创建的三种⽅式中的静态⽅法和实例化⽅法和FactoryBean作⽤类似,FactoryBean使⽤较多,尤其在Spring框架⼀些组件中会使⽤,还有其他框架和Spring框架整合时使⽤。展开评论点赞 - #青训营 x 字节后端训练营#
2023/05/16
#C7
AOP: Aspect oriented Programming ⾯向切⾯编程/⾯向⽅⾯编程;
AOP是OOP的延续,从OOP说起;OOP三⼤特征:封装、继承和多态;OOP是⼀种垂直继承体系;
OOP编程思想可以解决⼤多数的代码重复问题,但是有⼀些情况是处理不了的,⽐如在顶级⽗类Animal中的多个⽅法中相同位置出现了重复代码,OOP就解决不了。
横切逻辑代码存在什么问题:
1.横切代码重复问题
2.横切逻辑代码和业务代码混杂在⼀起,代码臃肿,维护不⽅便;
AOP出场,AOP独辟蹊径提出横向抽取机制,将横切逻辑代码和业务逻辑代码分析;
AOP在解决什么问题:在不改变原有业务逻辑情况下,增强横切逻辑代码,根本上解耦合,避免横切逻辑代码重复
为什么叫做⾯向切⾯编程:
「切」:指的是横切逻辑,原有业务逻辑代码我们不能动,只能操作横切逻辑代码,所以⾯向横切逻辑;
「⾯」:横切逻辑代码往往要影响的是很多个⽅法,每⼀个⽅法都如同⼀个点,多个点构成⾯,有⼀个⾯的概念在⾥⾯。展开评论点赞 - #青训营 x 字节后端训练营#
2023/05/15
#C7
核⼼思想:IOC和AOP,不是Spring提出的,在Spring之前就已经存在,只不过更偏向于理论化,Spring在技术层次把这两个思想做了⾮常好的实现(Java)
IoC Inversion of Control (控制反转/反转控制),注意它是⼀个技术思想,不是⼀个技术实现;
描述的事情:Java开发领域对象的创建,管理的问题;
传统开发⽅式:⽐如类A依赖于类B,往往会在类A中new⼀个B的对象;
IoC思想下开发⽅式:我们不⽤⾃⼰去new对象了,⽽是由IoC容器(Spring框架)去帮助我们实例化对象并且管理它,我们需要使⽤哪个对象,去问IoC容器要即可;
我们丧失了⼀个权利(创建、管理对象的权利),得到了⼀个福利(不⽤考虑对象的创建、管理等⼀系列事情);
为什么叫做控制反转?
控制:指的是对象创建(实例化、管理)的权利
反转:控制权交给外部环境了(spring框架、IoC容器)
IOC和DI描述的是同⼀件事情,只不过⻆度不⼀样罢了:IOC是站在对象的角度,对象实例化及其管理的权利交给了(反转)容器,DI是站在容器的角度,容器会把对象依赖的其他对象注入。展开评论点赞