Spring boot 基础1.1

1、前言

Spring boot创建好后,可以选择自动内嵌Web服务器,并自动starter依赖,简化构建配置,从而简化程序员的工作,专注于业务逻辑本身;

微服务是一种架构风格,一个应用拆分为几组小型服务,各组服务都有自己的进程,也就是可以独立部署与升级,做到去中心化;

Spring boot正是基于微服务的基础上而建立的,我们尝试自己手敲一份与Spring boot类似的底层代码,去模拟实现它的网络服务端口的功能;

2、HTTP协议

在写Spring boot之前,我们首先要了解,浏览器(客户端)与服务端之间的传输是怎么实现的;

HTTP协议:浏览器与服务器通讯的应用层协议,它规定了浏览器与服务器之间的数据格式的交互规则,它有如下定义:

  • 要求浏览器与服务端之间必须遵循一问一答的规则,服务端永远不会主动给浏览器发送信息;
  • HTTP要求浏览器与服务端的传输协议必须是可靠的,也就是说他们的传输层协议是TCP协议;

TCP协议对于浏览器与服务端之间的传输格式也有要求:

  • 定义浏览器给服务端发送的信息称为请求,反之称为响应;
  • 请求与响应的内容都是字符串信息,这些字符的字符集是规定好的:ISO-8859-1,这是一个欧洲的字符集,它并不支持中文,也就是说响应与请求里的字符只能是英文、数字与符号;
  • 请求:一个请求由三部分组成:
  1. 请求行 :请求行由三部分组成:请求方式+空格+抽象路径+空格+版本协议+回车换行(CRLF),如:GET /myweb/index.html HTTP/1.1+回车换行,回车换行是不可见符;
  2. 消息头:消息头是浏览器可以给服务端发送的一些附加信息,有的用来说明浏览器自身内容,有的用来告知服务端交互细节,有的告知服务端消息正文详情等。消息头由若干行组成,每行结束也是以CRLF标志。每个消息头的格式为:消息头的名字+空格+消息的值(CRLF),消息头部分结束是以单独的(CRLF)标志;
  3. 消息正文:消息正文是2进制数据,通常是用户上传的信息,比如:在页面输入的注册信息,上传的附件等内容;消息正文部分可以没有;
  • 响应:一个响应也由三部分组成:
  1. 状态行:版本协议+空格+状态代码+空格+状态描述,例如:HTTP/1.1 200 OK;有关状态代码:1xx:保留;
    2xx:成功,表示处理成功,并正常响应;
    3xx:重定向,表示处理成功,但是需要浏览器进一步请求;
    4xx:客户端错误,表示客户端请求错误导致服务端无法处理;
    5xx:服务端错误,表示服务端处理请求过程出现了错误;
  2. 响应头:响应头与请求行的消息头的格式一致,表示的是服务端发送给客户端的附加信息;响应头有两个主要的内容:Content-Type: 文件类型;Content-Lengrh:文件大小;浏览器接受正文前会根据以上两个响应头来处理响应正文并显示;
  3. 响应正文:2进制数据部分,通常包含客户端实际请求的资源内容;

3、URL

每一个网页都有一个唯一的名称标识,称之为URL(统一资源定位器),就是我们平常称呼的网址;URL具有全球唯一性,它具有三部分:协议名称、主机地址信息、资源的抽象路径;

协议名称:最常用的是http,网银服务用的是https,用了加密技术,更加安全;

主机地址信息:是指存放资源的服务器的域名系统(DNS) 主机名与IP地址,与协议名称相隔符号“://”

资源的抽象路径:有时可以省略,主要看浏览器会不会发送,与主机地址相隔符号“/”;

 4、手写Spring boot

在上个文章中,我们学习了如何创建一个Spring boot项目,里面注入相关的依赖,可以直接往java目录下写业务;这次我们来尝试手写一份代码来实现spring boot 的部分底层功能;

打开idea,新建项目,选择Maven:

起好项目名字后,在目录下可以看到一个pom.xml的文件,在里面可以改变自己需要的依赖;这里我把idea的默认编码改为了UTF-8,在<properties></properties>标签内更改:

 <properties>
        <!-- 设置 JDK 版本为 1.8 -->
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.source>1.8</maven.compiler.source>
        <!-- 设置编码为 UTF-8 -->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
    </properties>

一、创建服务器雏形

浏览器链接服务端,并发送了请求,服务端接收了多个客户端的链接,采用多线程来处理各个客户端的请求:

服务端主类接收多个客户端:

public class WebServerApplication {
    private ServerSocket serverSocket;

    public WebServerApplication(){
        try {
            System.out.println("正在启动服务端...");
            serverSocket = new ServerSocket(8088);
            System.out.println("服务端启动完毕!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void start(){
        try {
            System.out.println("等待客户端链接...");
            Socket socket = serverSocket.accept();
            System.out.println("一个客户端链接了!");
            //启动一个线程处理与该客户端的交互
            ClientHandler handler = new ClientHandler(socket);
            Thread t = new Thread(handler);
            t.start();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        WebServerApplication application = new WebServerApplication();
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值