【闲聊】-后端框架发展史

news2024/10/6 18:33:39

框架,是为了解决系统复杂性,提升开发效率而产生的工具,主要服务于研发人员。
当然,框架还有更深层的作用,框架的沉淀是一种高级的抽象,会将人类的业务逐步抽象为统一标准又灵活可变的结构,为各行各业的数字化铺平一条大路坦途。

发展历程

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")
    @ResponseBody
    public String helloWorld() {
        return "Hello, World!";
    }
}

在这个例子中,HelloWorldController 控制器有一个处理 GET 请求到 /hello 路径的方法 helloWorld。该方法使用 @ResponseBody 注解,这意味着返回的字符串将直接写入 HTTP 响应体,而不是解析为一个视图名称。

为了运行这个简单的 Spring MVC 应用,你还需要一个 Spring Boot 的启动类,以及一个 pom.xmlbuild.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);
    }

    @RestController
    public static class MyController {

        @GetMapping("/hello")
        public String hello() {
            return "Hello from My Microservice!";
        }
    }
}

application.propertiesapplication.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可以帮助开发者高效地进行数据库访问和操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1526559.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java-CAS 原理与 JUC 原子类

由于 JVM 的 synchronized 重量级锁涉及到操作系统&#xff08;如 Linux&#xff09; 内核态下的互斥锁&#xff08;Mutex&#xff09;的使用&#xff0c; 其线程阻塞和唤醒都涉及到进程在用户态和到内核态频繁切换&#xff0c; 导致重量级锁开销大、性能低。 而 JVM 的 synchr…

影响汇率的因素?fpmarkets澳福总结几个

汇率对于刚刚开始外汇交易的新手来说非常重要&#xff0c;这不是没有道理的&#xff0c;了解汇率如何变化以及怎么变化有助于在外汇交易中获得稳定的利润。那么影响汇率的因素有哪些&#xff1f;fpmarkets澳福总结几个。 任何国家货币的汇率都是由市场决定的。主要的市场因素是…

汽车网络基础知识 要点

在以太网开发中&#xff0c;常常会听到一些专业名词&#xff0c;例如PHY&#xff0c;MAC&#xff0c;MII&#xff0c;switch&#xff0c;下面是解释 PHY PHY 是物理接口收发器&#xff0c;它实现物理层。包括 MII/GMII (介质独立接口) 子层、PCS (物理编码子层) 、PMA (物理介…

高颜值HMI触控界面一出,价值感飙升,瞬间感觉消费不起了。

千万不要觉得用户很理性&#xff0c;其实用户都是“好色之徒”&#xff0c;判断产品价值基本上靠眼睛&#xff0c;颜值高的价格高&#xff0c;质量高&#xff0c;反之质量低&#xff0c;价格低。如果通过精心的高颜值设计&#xff0c;能让你的产品价值感拉满&#xff0c;你不心…

html密码访问单页自定义跳转页面源码

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 密码访问单页自定义跳转页面&#xff0c;修改了的密码访问单页&#xff0c;添加了js自定义密码跳转页面。需要正确输入密码才能跳转目标网址。 二、效果展示 1.部分代码 代码如下&…

等保测评的知识

结合自己所学的知识和网络上的一些知识做个小总结。 目录 一、概念&#xff1a; 二、等级划分&#xff1a; 三、技术要求&#xff1a; 四、管理要求&#xff1a; 五、等保测评实施过程&#xff1a; 六、典型的网络架构&#xff1a; 一、概念&#xff1a; 全称为信息安全等级保…

Vue2(五):收集表单数据、过滤器、自定义指令、Vue的生命周期

一、收集表单数据 爱好&#xff1a;学习<input type"checkbox" value"study" v-model"hobby">打游戏<input type"checkbox" value"games" v-model"hobby">吃饭<input type"checkbox" v…

创建局域网分享图片及html页面服务(简单讲下)

目录 1. 使用Python的SimpleHTTPServer&#xff08;适用于Windows&#xff09; 打开其中的.html文件&#xff1a; 打开其中的.png文件&#xff1a; 推荐第2种&#xff1a; 2. 使用Node.js和http-server&#xff08;适用于所有平台&#xff09; 安装http-server&#xff08;…

PSCA复位控制集成之复位信号

组件可能支持两种基本的复位类型。 • 冷复位&#xff1a;重置组件中的所有逻辑。用作上电复位。 • 热复位&#xff1a;重置组件中的大部分逻辑。通常&#xff0c;复位的范围是所有功能逻辑。不包括在热复位中的逻辑会随组件类型而变化&#xff0c;但通常会排除诸如调试和 R…

【论文阅读】Scalable Diffusion Models with Transformers

DiT&#xff1a;基于transformer架构的扩散模型。 paper&#xff1a;[2212.09748] Scalable Diffusion Models with Transformers (arxiv.org) code&#xff1a;facebookresearch/DiT: Official PyTorch Implementation of "Scalable Diffusion Models with Transformer…

13 秒插入 30 万条数据,这才是 Java 批量插入正确的姿势!

本文主要讲述通过MyBatis、JDBC等做大数据量数据插入的案例和结果。 30万条数据插入插入数据库验证 实体类、mapper和配置文件定义 User实体 mapper接口 mapper.xml文件 jdbc.properties sqlMapConfig.xml 不分批次直接梭哈 循环逐条插入 MyBatis实现插入30万条数据 J…

python 深度学习 记录遇到的报错问题12

本篇继python 深度学习 记录遇到的报错问题11_undefined symbol: __nvjitlinkadddata_12_1, version-CSDN博客 目录 一、AttributeError: module ‘tensorflow‘ has no attribute ‘app‘ 二、AttributeError: module tensorflow has no attribute placeholder 三、Attribu…

基于51单片机火灾报警器设计

一、系统方案 1、本设计采用51单片机作为主控器。 2、液晶1602显示。 3、采集温度值&#xff0c;烟雾值。 4、按键设置温度、烟雾报警值&#xff0c;测量值超过设置值蜂鸣器报警。 5、按键布防&#xff0c;有人闯入&#xff0c;声光报警。 二、硬件设计 原理图如下&#xff1a…

牛客DP34 前缀和

解题思路 题目解析如图 思路 算出每个位置的到第一个位置的总和 比如 第一个位置 1 总和 1 第二个位置 2 总和 3 第三个位置 4 总和 7 要算 2到3 位置的前缀和 用3位置的总和减去1位置的总和即可 还要处理一个边界情况 如果1到1位置的前缀和那么就是 …

【React】Vite创建React+TS项目

前提条件 有node环境&#xff0c;且node版本>18.0.0 创建项目 npm create vitelatest1.起项目名 2.选择框架 3.选择语言 TypeScript SWC 是指 Vite 使用 SWC&#xff08;Speedy Web Compiler&#xff09;作为 TypeScript 的编译器。 SWC 是一个针对 JavaScript 和 Ty…

HarmonyOS NEXT应用开发之SideBarContainer侧边栏淡入淡出动效实现案例

介绍 在2in1或平板上&#xff0c;群聊侧边栏是一种较为常用的功能&#xff0c;虽然HarmonyOS已经具备了基本的动效&#xff0c;但是部分情况下开发者可能有定制侧边栏动效的需求&#xff0c;本例主要介绍了如何基于显式动画实现侧边栏的淡入淡出动效。 效果图预览 使用说明&a…

力扣模板题:检测字符串中数字是否递增

bool areNumbersAscending(char * s){//双指针操作&#xff0c;前指针保存前面一个数字字符int p0,q0;for(int i0;s[i];i){if(s[i]>0&&s[i]<9){pp*10s[i]-0;if(s[i1] ||s[i1]\0){//进行比较, 比较过后将p赋值q&#xff0c;q记录前面一个数字,因为数字均为小于100…

Git 仓库瘦身与 LFS 大文件存储

熟悉 Git 的小伙伴应该都知道随着 Git 仓库维护的时间越来越久&#xff0c;追踪的文件越来越多&#xff0c;git 存储的 objects 数量会极其庞大&#xff0c;每次从远程仓库 git clone 的时候都会墨迹很久。如果我们不小心 git add 了一个体积很大的文件&#xff0c;且 git push…

通俗易懂的精度Precision和召回率Recall解释,看这篇就行,5分钟记住。

一、背景 因为我是做机器人方向的&#xff0c;不可避免的涉及到视觉方向的内容&#xff0c;还有审稿的时候也会看到识别相关的内容&#xff0c;其中衡量识别效果的指标包括精度Precision和召回率Recall&#xff0c;虽然很好理解&#xff0c;但每次都记不住&#xff0c;趁这次机…

【递归专题】【蓝桥杯备考训练】:有序分数、正则问题、带分数、约数之和、分形之城【已更新完成】

目录 1、有序分数&#xff08;usaco training 2.1&#xff09; 2、正则问题&#xff08;第八届蓝桥杯省赛C A组 & Java A组&#xff09; 3、带分数&#xff08;第四届蓝桥杯省赛Java A组/B组 & C B组/C组&#xff09; 4、约数之和&#xff08;《算法竞赛进阶指南》…