大家好,我是数行天下。数字化的世界由各类软件支撑了人类的社交、娱乐、学习和商业等需求功能,阿里集团CEO蔡崇信曾强力推荐当今必须要了解的技术原理,其中之一就是软件的运行原理。身处信息化和智能化时代,软件已经是我们精神不可分割的一部分,上到70岁的老叟,下到几岁的孩童,都离不开软件给我们提供的各项功能。对于各行各业专业技术人员而言,软件构成了日常赖以工作的平台。
继上一篇The Digital Principles of the Natural World 自然世界的数字原理后,怎样从整体视角去理解软件的构成和运行原理,建立系统化思维,对于专业的计算机从业人员来说非常重要,并且大有裨益,所谓知其所以然才能更好的掌控一个复杂的系统。
文章导读
一、软件世界的构成和技术框架
二、软件的启动和运行
三、底层框架的启动和运行原理
01
软件世界的构成和技术框架
软件系统由前端和后端构成整个应用程序的技术架构。前端(Frontend)就是用户界面,用户从这个界面开始与系统交互,比如搜索、登记和支付等各类活动的操作。一个系统的雏形就是从前端的界面设计开始,包括页面布局、颜色、字体等方面的设计,以提供用户友好的界面体验,还有更重要的是用户需求的功能,比如点击按钮、搜索框等。
前端开发主要使用HTML(标记语言)、CSS(样式表)和JavaScript(脚本语言)来构建网页界面,实现页面结构、样式和交互功能。常用的前端框架包括Vue.js、React.js、Angular等,用于简化前端开发、提高效率和可维护性。前端应用还可能使用状态管理工具(如Redux、Vuex)来管理应用状态,实现数据的统一管理和响应式更新。前端开发通常使用构建工具(如Webpack、Babel)来打包、压缩、转译代码,以提高性能和开发效率。
后端开发负责实现应用程序的业务逻辑,处理数据、逻辑运算和与数据库的交互,数据库的交互一方面是持久化即数据存储在数据库中,另一方面是数据的查询,即提供数据给前端界面使用。常用的后端框架包括Spring Boot(Java)、Express.js(Node.js)、Django(Python)等,用于快速搭建后端服务和提供RESTful API。后端应用通常需要与数据库交互,常见的数据库包括MySQL、PostgreSQL、MongoDB等,用于存储和管理数据。后端开发设计和实现API(Application Programming Interface),定义前后端之间的数据交换格式和通信规范,并根据前端界面的功能实现数据查询并返回。
02
软件的启动和运行
那软件是怎么启动和实现运行的呢?
从客户端到服务器端,以Vue前端框架、Spring Boot后端框架和数据端为例,一个软件从启动到运行的原理如下:
目前软件部署运行的模式都是前后端分离的模式,各自启动和运行服务,前端去调用后端服务。
客户端启动和运行:
前端项目通常会包含源代码文件(如JavaScript、CSS、HTML文件)以及配置文件。在启动过程中,前端服务会对这些源文件进行编译、打包和构建,以生成可在浏览器中运行的静态资源文件。前端服务通常会启动一个开发服务器,用于提供静态资源文件,并监听来自浏览器的HTTP请求。开发服务器会将前端应用程序提供给浏览器,使用户可以在浏览器中访问和交互。例如用户在浏览器中输入网址,前端Vue应用被加载。Vue应用启动,发送HTTP请求到后端服务器。
服务器端启动和运行:
后端Spring Boot应用启动主类,通过内嵌的Tomcat容器监听HTTP请求。Spring Boot应用初始化,加载配置文件、依赖注入等,同时数据库连接池初始化,准备与数据库的连接。当后端收到Vue应用发送的HTTP请求时,Tomcat将请求转发给Spring Boot应用。Spring Boot根据请求路径找到对应的Controller,处理请求并调用相应的Service。Service层处理业务逻辑,可能会涉及数据库操作。
数据端处理:数据库接收到请求,执行相应的SQL语句进行数据操作。数据库返回结果给后端应用,后端应用将结果封装成JSON格式返回给前端Vue应用。
用户接收响应:前端Vue应用接收到后端返回的数据,进行数据展示和页面渲染,使得用户在浏览器中看到最终的页面效果和自己想要的结果。
在整个过程中,涉及到多个线程的协作:比如Tomcat容器线程负责接收和处理HTTP请求,Spring Boot应用的主线程负责初始化和请求处理,数据库连接池线程负责管理数据库连接等。整个软件系统从启动到运行的过程是一个复杂的流程,需要各个组件之间协同工作,才能确保系统能够正常运行并提供所需的功能。
03
底层框架的启动和运行原理
对于专业从业者而言,更应该深入理解软件底层框架的启动和运行原理,这样才能有效的分析和解决问题。当使用Spring Boot框架启动Java应用程序时,在框架的较低级别发生了几个关键步骤,以确保应用程序顺利运行。以下是使用Spring Boot启动Java应用程序时在较低级别发生的详细过程。
1、类加载:Java虚拟机(JVM)加载应用程序所需的必要类和资源。这包括加载应用程序代码中定义的类以及来自外部库和框架(如Spring Boot)的类。
2、Bean初始化:Spring Boot使用依赖注入的概念来管理应用程序上下文中的对象(bean)。在启动过程中,Spring Boot扫描应用程序以查找组件、服务、存储库和其他bean,并对其进行初始化。这涉及创建这些bean的实例并设置它们的依赖关系。
3、自动配置:Spring Boot利用自动配置来根据类路径中存在的依赖项自动配置应用程序。这包括设置默认配置、为常见组件创建bean以及配置应用程序的各个方面,如数据源、Web服务器和安全性。
4、应用程序上下文创建:Spring Boot创建和管理应用程序上下文,作为管理bean和处理依赖关系的中央枢纽。应用程序上下文包含有关bean、它们的配置和关系的信息,使Spring能够将它们连接在一起。
5、组件扫描:Spring Boot扫描应用程序包,以查找使用 @Controller 、 @Service`、 @Repository 等注解标记的组件。这些组件由Spring容器识别、实例化和管理。
6、初始化和启动:Spring Boot根据应用程序的配置初始化各种组件,例如基于应用程序配置的嵌入式Web服务器(例如Tomcat、Jetty)。它启动嵌入式Web服务器,注册必要的servlet、过滤器和监听器,并准备处理传入的HTTP请求。
7、数据库连接:如果应用程序与数据库交互,Spring Boot使用配置的数据源建立与数据库的连接。这包括设置连接池、创建数据库连接,并为数据库操作准备应用程序。
在软件系统启动过程中都会经历以上这些详细步骤,Spring Boot确保Java应用程序被正确配置,依赖关系得到解决,并初始化了应用程序运行所需的必要组件。因此有必要从整体的视角去建立软件世界的构成和启动运行的精细图像,知道经历了哪些步骤,做了哪些操作,这样才能举一反三,在遇到问题时知道如何去分析和调试,增强掌控复杂系统的能力。
日拱一卒无有尽,功不唐捐终入海
觉得不错,点个“在看”然后转发出去
【往期精选】