【闲聊】-后端框架发展史
框架,是为了解决系统复杂性,提升开发效率而产生的工具,主要服务于研发人员。
当然,框架还有更深层的作用,框架的沉淀是一种高级的抽象,会将人类的业务逐步抽象为统一标准又灵活可变的结构,为各行各业的数字化铺平一条大路坦途。
发展历程
1.初始阶段
在这一阶段,互联网的应用相对简单,服务端主要处理静态资源,如HTML页面。后端框架的概念尚未形成,主要依赖于服务器软件(如Apache)来提供静态资源。
实际例子:早期的个人网站或小型论坛,通过FTP将HTML文件上传到服务器,然后通过浏览器访问这些静态页面。

2.交互需求出现
随着Web 2.0的兴起,用户交互成为网站的重要特征。这时,后端开始涉及数据处理和动态内容生成。CGI(Common Gateway Interface)和PHP等技术开始流行,用于处理表单提交、用户登录等交互操作。
实际例子:早期的博客系统或CMS(内容管理系统),如WordPress,使用PHP处理用户提交的文章、评论等,并动态生成页面内容。

3.MVC框架的兴起
随着Web应用的复杂性增加,MVC框架开始流行。MVC将业务逻辑、数据模型和用户界面分离,提高了代码的可读性和可维护性。Java的Struts、Spring MVC,以及Ruby on Rails等框架在这一时期广受欢迎。
实际例子:Spring MVC是一个广泛使用的Java Web框架,它基于MVC设计模式,简化了Web应用的开发过程。通过Spring MVC,开发者可以清晰地划分业务逻辑、数据访问和视图展示,提高代码的可读性和可维护性。

4.分布式和微服务架构
随着应用规模的扩大和用户量的增长,分布式和微服务架构成为后端架构的主流。这种架构将应用拆分成多个独立的服务或组件,每个服务都运行在独立的进程中,并通过轻量级通信协议进行通信。例如,Dubbo、Spring Cloud等都是这一时期兴起的微服务框架。
实际例子:Netflix是微服务架构的先驱之一。它将整个应用拆分成多个独立的服务,每个服务都负责特定的业务功能。这种架构使得Netflix能够灵活地扩展和维护其庞大的应用集群。

5.云原生和容器化
随着云计算的发展,云原生和容器化技术成为后端领域的热点。Docker和Kubernetes等技术使得应用的部署、扩展和管理变得更加简单和高效。
实际例子:许多大型互联网公司都采用了云原生和容器化技术来构建其后端系统。例如,阿里巴巴的“双十一”活动就是通过Kubernetes管理的大规模容器集群来支撑高并发、低延迟的业务需求。

6.API驱动的开发
随着RESTful API和GraphQL等技术的普及,API驱动的开发成为后端开发的重要趋势。这种开发方式强调通过定义清晰的API接口来实现前后端分离和跨平台开发。
实际例子:许多现代应用都采用了API驱动的开发方式。例如,一个移动应用可以通过调用后端提供的RESTful API来获取数据和执行操作,而无需关心后端的具体实现。

这些阶段并非孤立存在,而是随着技术的不断进步相互交织、共同演进。每个阶段都推动了后端框架的发展和完善,使得开发者能够更高效地构建稳定、可扩展和可维护的Web应用。
应用场景
这些框架在实际开发场景中的应用非常广泛,它们为开发者提供了高效、稳定且可扩展的解决方案。以下是这些框架在不同开发场景中的应用:
1. MVC框架:
- Spring MVC:在Java Web开发中,Spring MVC是常用的框架之一。它帮助开发者清晰地划分业务逻辑、数据访问和视图展示。例如,在构建一个电商网站时,Spring MVC可以处理用户浏览商品、添加到购物车、下单等业务流程,同时管理数据库访问和页面渲染。
Spring MVC 是一个基于 Java 的实现 MVC 设计模式的请求驱动类型的轻量级 Web 框架,它使用了请求-响应模型,将 web 层进行职责解耦。在 Spring MVC 中,控制器(Controller)负责处理用户请求并返回模型(Model)数据给视图(View)进行展示。
以下是一个 Spring MVC 最小单元的核心代码示例:
首先,我们需要一个 Spring MVC 的配置类,通常使用 @Configuration 注解和 @EnableWebMvc 注解来标识:
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {// 你可以在这里覆盖 WebMvcConfigurer 的方法来定制 Spring MVC 的行为
}
接着,我们需要一个控制器类,使用 @Controller 注解来标识,并定义处理请求的方法:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
public class HelloWorldController {@GetMapping("/hello")@ResponseBodypublic String helloWorld() {return "Hello, World!";}
}
在这个例子中,HelloWorldController 控制器有一个处理 GET 请求到 /hello 路径的方法 helloWorld。该方法使用 @ResponseBody 注解,这意味着返回的字符串将直接写入 HTTP 响应体,而不是解析为一个视图名称。
为了运行这个简单的 Spring MVC 应用,你还需要一个 Spring Boot 的启动类,以及一个 pom.xml 或 build.gradle 文件来管理依赖。以下是一个简单的 Spring Boot 启动类:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
最后,确保你的 pom.xml 文件中包含了 Spring Boot Starter Web 的依赖:
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
</dependencies>
或者,如果你使用 Gradle,在 build.gradle 文件中添加依赖:
dependencies {implementation 'org.springframework.boot:spring-boot-starter-web'
}
这个简单的 Spring MVC 应用现在应该可以运行了。当你启动应用并访问 /hello 路径时,它应该返回 “Hello, World!”。
2. 微服务框架:
- Spring Cloud:对于大型、复杂的分布式系统,Spring Cloud提供了一种微服务架构的解决方案。通过将应用拆分成多个独立的服务,Spring Cloud帮助开发者构建高内聚、低耦合的系统。例如,在一个金融系统中,用户认证、账户管理、交易处理等都可以作为独立的服务进行开发和部署。
Spring Cloud 是一系列框架的有序集合,用于构建微服务架构的 Spring 应用。构建 Spring Cloud 的最小单元通常涉及一个或多个微服务,每个微服务都是一个独立的 Spring Boot 应用。以下是一个简单的 Spring Cloud 微服务的核心代码示例,该微服务使用了 Spring Cloud 的服务发现功能(Eureka)和客户端负载均衡(Ribbon)。
首先,添加 Maven 依赖到你的 pom.xml 文件中:
<dependencies><!-- Spring Boot Starter Web 用于构建 RESTful Web 服务 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Spring Cloud Starter Netflix Eureka Client 用于服务发现 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!-- Spring Cloud Starter OpenFeign(可选)用于声明式服务调用 --><!-- <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency> -->
</dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Hoxton.SR3</version> <!-- 使用合适的 Spring Cloud 版本 --><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
接下来,创建一个 Spring Boot 应用作为 Eureka 客户端,并实现一个简单的 RESTful 端点:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@SpringBootApplication
@EnableEurekaClient // 启用 Eureka 客户端,将应用注册到 Eureka 服务发现中心
public class MyMicroserviceApplication {public static void main(String[] args) {SpringApplication.run(MyMicroserviceApplication.class, args);}@RestControllerpublic static class MyController {@GetMapping("/hello")public String hello() {return "Hello from My Microservice!";}}
}
在 application.properties 或 application.yml 文件中配置 Eureka 服务器的地址:
# application.properties
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
或者如果你使用 YAML 格式的配置文件:
# application.yml
eureka:client:serviceUrl:defaultZone: http://localhost:8761/eureka/
确保 Eureka 服务器正在运行,并监听在 localhost:8761。启动这个微服务应用,它应该会自动注册到 Eureka 服务器。
请注意,为了简化示例,我们没有包含任何负载均衡或容错逻辑。在实际的微服务架构中,你可能还需要使用其他 Spring Cloud 组件,如 Spring Cloud Config 用于集中配置管理,Spring Cloud Gateway 或 Zuul 用于 API 网关,Spring Cloud Sleuth 用于分布式追踪等。
3. 云原生和容器化:
- Docker和Kubernetes:在云原生环境中,Docker用于构建和打包应用,而Kubernetes则用于管理和调度这些容器化的应用。例如,在构建一个基于微服务架构的在线视频平台时,Docker可以将每个微服务打包成独立的容器,然后通过Kubernetes进行集群管理和自动伸缩,以应对高并发的访问需求。
4. API驱动的开发:
- RESTful API:在现代Web应用中,前后端分离成为一种常见的开发模式。后端通过提供RESTful API来暴露业务功能,前端则通过调用这些API来获取数据和执行操作。例如,在开发一个移动应用时,后端可以提供用户管理、订单处理等API,前端则通过这些API与后端进行交互。
下面是一个RESTful API 定义的例子
1. 定义资源
首先,我们需要确定 API 中的资源。在这个例子中,我们的主要资源是“用户”(User)。
2. 定义路由
接下来,我们为每个资源定义路由。路由应该使用 HTTP 动词来表示对资源的操作。
获取所有用户
GET /users
获取特定用户
GET /users/{userId}
创建新用户
POST /users
更新用户信息
PUT /users/{userId}
删除用户
DELETE /users/{userId}
3. 定义请求和响应体
对于创建和更新操作,我们需要定义请求体的结构。对于获取操作,我们需要定义响应体的结构。
创建新用户的请求体
{"username": "john_doe","email": "john.doe@example.com","password": "secure_password"
}
获取特定用户的响应体
{"id": 1,"username": "john_doe","email": "john.doe@example.com","created_at": "2023-04-01T12:00:00Z"
}
4. 定义状态码和错误处理
对于每个操作,我们需要定义适当的 HTTP 状态码来表示成功或失败,以及如何处理错误。
- 成功创建用户:
201 Created - 成功获取用户:
200 OK - 用户不存在:
404 Not Found - 请求体无效:
400 Bad Request - 认证失败:
401 Unauthorized - 无权访问资源:
403 Forbidden - 服务器内部错误:
500 Internal Server Error
5. 设计 API 版本控制
为了支持未来的 API 变更,你可能还需要设计 API 版本控制策略。这可以通过在 URL 中添加版本号或使用特定的 HTTP 头来实现。
例如,使用 URL 中的版本号:
GET /v1/users
或者,使用 HTTP 头:
GET /users
Accept: application/vnd.myapi.v1+json
很多同学可能不理解加入版本的意义,那么我举个例子:
假设我们有一个名为“APIv1”的接口,它用于获取用户的个人信息,包括姓名和年龄。随着业务的发展,我们决定添加一个新的功能,即允许用户上传头像。如果我们没有使用API版本控制,直接在“APIv1”上添加这个功能,那么所有使用此接口的应用程序都需要更新以适应这个变化,这可能导致一些应用程序出现错误或不稳定。
但是,如果我们使用了API版本控制,我们可以创建一个新的版本“APIv2”,并在其中添加上传头像的功能。这样,旧版本的应用程序可以继续使用“APIv1”来获取用户的姓名和年龄,而不需要关心新添加的功能。同时,那些希望使用上传头像功能的新应用程序或已更新的应用程序可以使用“APIv2”。
5. 后端框架的特定应用:
- Flask:对于小型到中型Web应用,Flask是一个轻量级的Python Web框架。它简单、灵活且易于扩展。例如,在开发一个简单的博客系统或小型Web应用时,Flask可以帮助开发者快速搭建起后端服务。
- MyBatis:MyBatis是一个专注于SQL的持久层框架。它解除了SQL与程序代码的耦合,使得开发者可以更加灵活地编写SQL语句。在需要处理大量数据库操作的应用中,如电商平台的订单管理、数据分析等场景,MyBatis可以帮助开发者高效地进行数据库访问和操作。
相关文章:
【闲聊】-后端框架发展史
框架,是为了解决系统复杂性,提升开发效率而产生的工具,主要服务于研发人员。 当然,框架还有更深层的作用,框架的沉淀是一种高级的抽象,会将人类的业务逐步抽象为统一标准又灵活可变的结构,为各行…...
界面控件DevExpress ASP.NET Scheduler - 助力快速交付个人信息管理系统(下)
DevExpress ASP. NET Scheduler组件能完全复制Microsoft Outlook Scheduler的样式和功能,具有日、周、月和时间轴视图,并包括内置的打印支持,因此用户可以在尽可能短的时间内交付全功能的个人信息管理系统。在上文中(点击这里回顾…...
机器学习-04-分类算法-01决策树
总结 本系列是机器学习课程的系列课程,主要介绍机器学习中分类算法,本篇为分类算法开篇与决策树部分。 参考 决策树——ID3和C4.5(理论图解公式推导) 策略产品经理必读系列—第七讲ID3、C4.5和CART算法详解 决策树(…...
探索大数据时代的决策利器:如何有效应对海量数据?
随着信息技术的快速发展,大数据时代已经到来,海量数据成为了我们生活和工作中不可忽视的一部分。这些数据来自各个方面:社交媒体、传感器、网络交易、移动设备等,每天都在以惊人的速度增长。但是,面对如此庞大的数据量,我们该如何有效地应对呢?本文将探索大数据时代的决…...
Linux 学习笔记(16)
十六、 计划任务 在很多时候为了自动化管理系统,我们都会用到计划任务,比如关机,管理,备份之类的操作,我 们都可以使用计划任务来完成,这样可以是管理员的工作量大大降低,而且可靠度更好。 l…...
【C语言】打印闰年
输⼊⼀个年份year,判断year是否是闰年 闰年判断的规则: 1, 能被4整除并且不能被100整除是闰年 2,能被400整除是闰年 结合起来如下: if ((year % 4 0 && year % 100 ! 0) || (year % 400 0)) 代码如下&…...
外贸入门,很残忍但很真实的外贸真相
如果你是小白入行外贸,第一家选择的公司大概率会决定你以后的客户开发模式。 外贸老鸟们可以留言讨论下自己是不是被说中了。 如果新人选择的第一家公司是靠B2B网站,展会或者官网询盘分发,公司每年会花大量的广告费用获客,你会很快…...
【Linux网络编程七】网络序列化和反序列化(网络版本计算器)
【Linux网络编程七】网络序列化和反序列化(网络版本计算器) 一.网络读取问题【解决方案】1.定制协议2.序列化和反序列化3.添加报头①封包②解包 4.框架总结 二.自定义协议:网络计算器协议Ⅰ.客户端发送请求,服务器端接收请求1.构建请求(结构化…...
算法打卡day17|二叉树篇06|Leetcode 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
算法题 Leetcode 654.最大二叉树 题目链接:654.最大二叉树 大佬视频讲解:最大二叉树视频讲解 个人思路 大概思路就是在数组中 找最大值的节点作为当前节点,用最大值的index切割左右子树的区间,往复循环到数组元素为0; 解法 递…...
C语言之数据在计算机内部的存储
文章目录 一、前言二、类型的基本归类1、整型家族2、浮点数家族3、构造类型4、指针类型 三、整型在内存中的存储1、原码、反码、补码1.1 概念1.2 原码与补码的转换形式1.3 计算机内部的存储编码 2、大小端介绍~~2.1 为什么要有大端和小端之分?2.2 大(小&…...
程序人生——Java中基本类型使用建议
目录 引出Java中基本类型使用建议建议21:用偶判断,不用奇判断建议22:用整数类型处理货币建议23:不要让类型默默转换建议24:边界、边界、还是边界建议25:不要让四舍五入亏了一方 建议26:提防包装…...
Pikachu 靶场搭建
文章目录 环境说明1 Pikachu 简介2 Pikachu 安装 环境说明 操作系统:Windows 10PHPStudy 版本: 8.1.1.3Apache 版本:2.4.39MySQL 版本 5.7.26 1 Pikachu 简介 Pikachu是一个使用“PHP MySQL” 开发、包含常见的Web安全漏洞、适合Web渗透测试学习人员练…...
机器学习-绪论
机器学习致力于研究如何通过计算的手段、利用经验来改善系统自身的性能。在计算机系统中,“经验”通常以“数据”的形式存在,因此,机器学习所研究的主要内容,是关于在计算机上从数据中产生“模型”的算法,即“学习算法…...
mysql 索引(为什么选择B+ Tree?)
索引实现原理 索引:排好序的数据结构 优点:降低I/O成本,CPU的资源消耗(数据持久化在磁盘中,每次查询都得与磁盘交互) 缺点:更新表效率变慢,(更新表数据,还要…...
蓝桥杯-带分数
法一 /* 再每一个a里去找c,他们共用一个st数组,可以解决重复出现数字 通过ac确定b,b不能出现<0 b出现的数不能和ac重复*/import java.util.Scanner;public class Main {static int n,res;static boolean[] st new boolean[15];static boolean[] backup new boolean[15];…...
消息队列面试题
目录 1. 为什么使用消息队列 2. 消息队列的缺点 3. 消息队列如何选型? 4. 如何保证消息队列是高可用的 5. 如何保证消息不被重复消费(见第二条) 6. 如何保证消息的可靠性传输? 7. 如何保证消息的顺序性(即消息幂…...
Android和IOS应用开发-Flutter 应用中实现记录和使用全局状态的几种方法
文章目录 在Flutter中记录和使用全局状态使用 Provider步骤1步骤2步骤3 使用 BLoC步骤1步骤2步骤3 使用 GetX:步骤1步骤2步骤3 在Flutter中记录和使用全局状态 在 Flutter 应用中,您可以使用以下几种方法来实现记录和使用全局状态,并在整个应…...
若依 ruoyi-cloud [网关异常处理]请求路径:/system/user/getInfo,异常信息:404
这里遇到的情况是因为nacos中的配置文件与项目启动时的编码不一样,若配置文件中有中文注释,那么用idea启动项目的时候,在参数中加上 -Dfile.encodingutf-8 ,保持编码一致,(用中文注释的配置文件,…...
自然语言处理里预训练模型——BERT
BERT,全称Bidirectional Encoder Representation from Transformers,是google在2018年提出的一个预训练语言模型,它的推出,一举刷新了当年多项NLP任务值的新高。前期我在零、自然语言处理开篇-CSDN博客 的符号向量化一文中简单介绍…...
2024年信息技术与计算机工程国际学术会议(ICITCEI 2024)
2024年信息技术与计算机工程国际学术会议(ICITCEI 2024) 2024 International Conference on Information Technology and Computer Engineering ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 大会主题: 信息系统和技术…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
