# org.os.framework **Repository Path**: weizuxiao911/org.os.framework ## Basic Information - **Project Name**: org.os.framework - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-04-01 - **Last Updated**: 2024-09-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README --- id: 1 title: Spring Boot框架 describe: SpringBoot入门教程 author: 727897965@qq.com --- # Spring Boot入门(一) ## 0x01. 简介 `Spring Boot`是一款能够用于便捷创建[独立的、可直接运行的、基于Spring框架构建的应用](https://spring.io/projects/spring-boot "spring.io")的`脚手架`。 ## 0x02. 特性 1. 创建独立的`Spring`应用; 2. 内嵌支持`Tomcat`、`Jetty`和`Undertow`等web容器,无需部署War包; 3. 提供`starter`依赖,以便简化构建配置; 4. 尽可能自动配置Spring和第三方库; 5. 提供可用于生产的功能,如度量、运行状况检查和外部化配置; 6. 绝对不需要生成代码,也不需要`XML`配置。 ## 0x03. 体验 [官方指导](https://spring.io/quickstart) --- # Spring Boot入门(二) ## 0x01. 网络编程 - [参考资料](https://www.cnblogs.com/jiujuan/p/16586900.html) ### 0x01.1 通信角色 在大多数网络编程开发中,客户端(Client)和服务器(Server)是两个主要角色。客户端向服务器发送请求,服务器根据请求返回响应(HTTP/HTTPS协议)。 客户端与服务器间通信模型如下: ```graph svg: - id: client type: box text: 客户端 style: width: 80 height: 32 left: 100 top: 100 fill: rgb(255, 255, 255) stroke: rgb(0, 0, 0) listeners: - on: click handler: () => { } flows: - start: end: link: ``` ### 0x01.2 TCP/IP通信模型 在网络通信中,数据的传输采用网络协议实现。主流的网络通信模型是TCP/IP通信模型(TCP/IP协议簇),它由四层组成:应用层、传输层、网络层和数据链路层。 - 应用层:应用层是网络通信的入口,负责提供网络通信的API,例如HTTP、FTP、SMTP等。 - 传输层:传输层负责数据传输,包括TCP和UDP协议。TCP协议是面向连接的,而UDP协议是无连接的。 - 网络层:网络层负责数据传输的转发,包括IP协议。 - 数据链路层:数据链路层负责数据传输的物理层,包括MAC地址、ARP协议等。 TCP/IP通信模型如下: ```graph ``` ### 0x01.3 套接字 Socket - [参考资料1](https://blog.csdn.net/fightsyj/article/details/86251421) - [参考资料2](https://www.zhihu.com/question/29637351) 实现网络通信开发是依靠套接字`Socket` API来实现的。它封装了一组TCP/IP协议的实现,以便应用程序开发者能够快速接入,实现网络通信。 Socket通信流程如下: ```graph ``` ### 0x01.4. 套接字 与 TCP/IP协议 的关系 - [参考资料](https://wenfh2020.com/2021/07/13/kernel-sys-socket/) 对于长期做业务开发的同学可能很难一下子搞清楚套接字与TCP/IP协议之间的关系。甚至很多同学只是使用了套接字,但是不知道套接字到底是什么。知道使用了何种协议,但不知道协议是如何通信的。 有时候,我们单独理解Socket或TCP/IP协议时又感觉都很简单,貌似风马牛不相及。但是,当我们认真思考时,又发现除了使用`HttpClient`、`HttpServer`这种第三方库才能实现网络通信,别无它法了。当然,做服务端的同学可能还了解`Netty`框架之类的可以做出服务器,但服务器底层又是如何实现的呢,又绕不开Socket了。 其实,会造成这样的认知割裂,是因为网络通信是一个很复杂的过程,而我们进行Socket编程和学习理解TCP/IP协议时,是分开来看的。而这个过程中,还有一个很重要的过程就是Socket到底是做了什么,怎么做的,这个才是关键。但很多人是很难有机会接触到这个层次开发实现的,才会造成认知割裂。 Socket API一般是操作系统提供的,它封装了TCP/IP协议的实现,提供了网络通信的API。八股文一般都是这么描述的,但是,到底啥意思呢? 以下是个人大白话的解释,如果有错误,欢迎指出。 在现实生活中,如果我们寄出一封信,这个过程会是怎么样的呢? 一般,我们会先找纸笔写封信,然后找个信封写上收寄件人地址,再把信件拿到邮局备注是什么类型的信件寄出,然后信件会在邮政体系内不断的盖戳然后流转,最后到达收件人地址进行投递,如果收件人地址不存在,最后信件又流转回到了寄件人手上。 其实,TCP/IP协议要描述的就是跟上述过程是差不多的规则。应用层部分就好比信件内容,传输层部分就好比信件类型,网络层部分就好比是信封上收寄件人地址,链路层部分就好比是邮局的收发信件的盖戳。 那Socket API是做什么用的呢?不就好比是一个地方邮局嘛。使用Socket API,就可以像寄出一封信一样,把信件放到Socket,然后等待信件到达,然后收信。 ## 0x02. 服务端网络通信 ### 0x02.1. 用户态/内核态间通信 - [参考资料](https://www.cnblogs.com/bakari/p/10966303.html) ### 0x02.2. 网络I/0模型 - [参考资料1](https://zhuanlan.zhihu.com/p/426107668) - [参考资料2](https://zhuanlan.zhihu.com/p/354446864) - [参考资料3](https://zhuanlan.zhihu.com/p/635816272) 1. 阻塞式I/O模型(Blocking I/O),即在请求到来时,服务器端会阻塞在accept()函数上,直到有客户端请求到来。当有客户端请求到来时,服务器端会创建一个新线程来处理该请求,然后继续阻塞在accept()函数上,等待新的客户端请求的到来。这种方式的缺点是,当服务器端处理请求时,客户端请求会被阻塞,导致服务器端无法处理其他客户端的请求。 2. 非阻塞I/O模型(Non-Blocking I/O), 3. IO多路复用模型(IO multiplexing), 4. 信号驱动I/O模型(Signal-driven I/O), 5. 异步I/O模型(Asynchronous I/O), ## 0x03. Spring Boot中的网络I/O模型 [参考资料](http://blog.gxitsky.com/2022/02/12/SpringBoot-60-tomcat-nio/)