杂杂碎知识
最近在阅读 spring 源码,学到很多原来没用过的 java api,如果未来自己要实现某些框架,将非常有用。
2020年的五一有五天假,但因为疫情原因,北京不能随意进入,一律需要十四天隔离,直至五一前两天终于下调响应等级,能自由出入,于是约了兄弟一起骑行青海湖。
其实已经看了很多攻略,五一的不是青海湖最美的时候,最美在7月,遍地的油菜花都会开放,美不胜收。奈何七月实在没有那么长的假期,不如就先去罢。
在新闻发布会通知低风险地区返京人员无需隔离时,我就搜索了去西宁的机票,大约一千块往返,但那时其余几人还没有确定时间,于是拖了一拖,到晚上时,机票已经到达1600了…一口老血喷出。最终定在了2号飞机出发,3-6号骑行,7号飞机票回京。
先放视频,最后随意放些原图照片。
之前的文章中分析了springboot启动的大概流程,那些只是冰山一角,最关键的refresh()
只是一笔带过。这篇文章中将会提到refreh
的部分过程。另外之前的文章也写过springboot如何自定义starter
,这篇文章将简单分析一下其原理。
在使用springboot的时候,只需要添加一些starter依赖,就能极大地简化开发操作,那么如何自定义一个starter?
本系列springboot源码都基于 2.2.5.RELEASE
1 | @SpringBootApplication |
一直跟进方法,这里将入口类当做参数,创建了一个SpringApplication
实例,并调用run(args)
方法。
1 | public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) { |
TCP是面向连接的。在一个应用进程可以开始向另外一个应用进程发送数据之前,这两个进程必须先相互“握手”,即他们必须相互发送某些预备报文段,以建立确保数据传输的参数。
TCP连接提供的是全双工服务,允许数据在两个方向上同时传输。
一旦建立起一条TCP连接,两个应用进程之间就可以相互发送数据了。客户进程通过套接字传递数据流。数据一旦通过该门,它就由客户中的TCP控制了。TCP将这些数据引导到该连接的发送缓存中,发送缓存是三次握手初期设置的缓存之一。接下来TCP会时不时从发送缓存里取出一块数据。TCP可以从缓存中取出并放入报文段中的数据数量受限于最大报文段长度(Maximum Segment Size,MSS)。MSS通常根据最初确定的由本地发送主机发送的最大链路层帧长度,即所谓的最大传输单元(Maximum Transmission Unit,MTU)来设置。该设置MSS要保证一个TCP报文段加上TCP/IP首部长度(通常40字节)将适合单个链路层帧。以太网和PPP链路层的协议都具有1500字节的MTU,因此MSS的典型值为1460字节。
在讨论TCP协议之前,要先谈一谈可靠数据传输的原理。因为可靠数据传输的实现问题不仅在运输层出现,也会在链路层、应用层出现。TCP所采用的,正是即将描述的内容。
当访问的uri最后不带斜杠时,例如 http://localhost/product ,会先查找 product 文件,存在就返回;若存在 product 文件夹,会在末尾加上一个斜杠并产生 301 跳转。
当访问的uri最后带斜杠时,例如 http://localhost/product/,查找 product 下的 index 页面,存在就返回;不存在且未开启自动索引目录选项(autoindex on)则报 403 错误。
在第一种情况,访问带目录的url时,如果末尾不加斜杠(“/“),nginx默认会加上斜杠,发生一次301跳转,但这个默认行为在nginx前端有LB负载均衡器、且LB监听的端口与nginx server监听的端口不同时会导致访问出错。
但这个默认行为在nginx前端有LB负载均衡器、且LB监听的端口与nginx server监听的端口不同时会导致访问出错。