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

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

发展历程

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.mfbz.cn/a/459177.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

暴雨高性能分布式存储为AI提供坚实数据存力

随着两会的圆满落幕&#xff0c;新质生产力和人工智能的发展成为社会各界热议的焦点。总理在两会后的首次调研中&#xff0c;特别强调了新质生产力和人工智能的重要性&#xff0c;这无疑为人工智能产业的蓬勃发展注入了新的动力。 年初&#xff0c;Sora所引领的人工智能热潮更…

安卓百度地图API显示隐藏Marker

方法 BaiduMap.Marker.setVisible(boolean) 实现 List<Marker> list_marker new ArrayList<>(); boolean isShowMarker true;Override public boolean onCreateOptionsMenu(Menu menu) {String[] sm { "显隐信息", "显隐照片", "截…

YOLOv8_seg-Openvino和ONNXRuntime推理【CPU】

纯检测系列&#xff1a; YOLOv5-Openvino和ONNXRuntime推理【CPU】 YOLOv6-Openvino和ONNXRuntime推理【CPU】 YOLOv8-Openvino和ONNXRuntime推理【CPU】 YOLOv7-Openvino和ONNXRuntime推理【CPU】 YOLOv9-Openvino和ONNXRuntime推理【CPU】 跟踪系列&#xff1a; YOLOv5/6/7-O…

(二十五)Flask之MTVMVC架构模式Demo【重点:原生session使用及易错点!】

目录&#xff1a; 每篇前言&#xff1a;MTV&MVC构建一个基于MTV模式的Demo项目&#xff1a;蹦出一个问题&#xff1a; 每篇前言&#xff1a; &#x1f3c6;&#x1f3c6;作者介绍&#xff1a;【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领…

VScode 关闭鼠标悬停提示

设置-文本编辑&#xff0c;然后搜索&#xff1a;Hover:Enanbled,出现如下图&#xff0c;取消勾选即可&#xff1b;

2024常见性能测试工具!

一&#xff1a;如何选择性能工具 选择性能测试工具时&#xff0c;可以从以下几个方面进行考虑&#xff1a; 1. 需求匹配&#xff1a;首先要明确项目的具体需求&#xff0c;比如需要测试的应用类型、协议、负载规模等。确保所选工具能够满足这些需求。 2. 技术兼容性&#xf…

Vue3--数据和方法

data 组件的 data 选项是一个函数。Vue 在创建新组件实例的过程中会自动调用此函数。   data选项通常返回一个对象&#xff0c;然后 Vue 会通过响应性系统将其包裹起来&#xff0c;并以 $data 的形式存储在组件实例中。 <!DOCTYPE html> <html lang"en"&g…

已解决:android SDK安装时点击SDK Manager出现闪退

1、首先确保电脑里边安装了JDK&#xff0c;并且要把安装路径配置在环境变量里边&#xff0c;避免使用绝对路径 推荐%JAVA_HOME%\bin 2、在C:\Users\huanhuan\Desktop\android-sdk-windows\tools路径下找到android.bat文件打开&#xff0c;把set java_exe后改为jdk中java.exe的路…

孪生网络(Siamese Network)和数字孪生的区别?

1. 孪生网络 孪生网络是一种特殊的网络框架&#xff0c;基于两个人工神经网络建立的耦合构架&#xff0c;通过比较两个样本在高维度空间的表征来判断它们的相似程度。它包含两个相同结构的神经网络&#xff0c;一个用于学习&#xff0c;一个用于验证学习效果。在训练过程中&am…

【火猫TV】欧联:8强无弱队,意甲英超球队扎堆,利物浦和药厂优势很大!

2023-2024欧联杯八强正式出炉&#xff0c;马赛、本菲卡、勒沃库森、利物浦、西汉姆联、罗马、亚特兰大和AC米兰成功拿到了晋级名额&#xff0c;于是球迷们即将看到近20年竞争最激烈的欧联杯八强对决。虽然这些队伍实力有强有弱&#xff0c;但是能够拼到现在的球队没有弱旅&…

20240304 json可以包含复杂数组(数组里面套数组)

欣赏一下我的思维&#xff0c;它会以漫画&#xff0c;表格&#xff0c;文字。。。各种各样的形式呈现 对于问题1问题2 JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式&#xff0c;易于人阅读和编写&#xff0c;同时也易于机器解析和生成。JSON本质上是一种文本…

鸿蒙实战开发:【分布式软总线组件】

简介 现实中多设备间通信方式多种多样(WIFI、蓝牙等)&#xff0c;不同的通信方式使用差异大&#xff0c;导致通信问题多&#xff1b;同时还面临设备间通信链路的融合共享和冲突无法处理等挑战。分布式软总线实现近场设备间统一的分布式通信管理能力&#xff0c;提供不区分链路…

鸿蒙开发面试真题分享~

1. 在鸿蒙应用开发中&#xff0c;有哪些常用的性能优化策略和技术手段&#xff0c;如启动速度优化、内存管理优化、功耗控制等&#xff1f; 参考答案&#xff1a; 2. 鸿蒙系统强调跨平台特性&#xff0c;你会如何利用这一特性来优化多端部署和适配&#xff1f; 参考答案&…

Android 音频系统

导入 早期Linux版本采用的是OSS框架&#xff0c;它也是Unix及类Unix系统中广泛使用的一种音频体系。 ALSA是Linux社区为了取代OSS而提出的一种框架&#xff0c;是一个源代码完全开放的系统(遵循GNU GPL和GNU LGPL)。ALSA在Kernel 2.5版本中被正式引入后&#xff0c;OSS就逐步…

力扣111---二叉树的最小深度(简单题,Java,递归+非递归)

目录 题目描述&#xff1a; &#xff08;递归&#xff09;代码&#xff1a; &#xff08;非递归、层次遍历&#xff09;代码&#xff1a; 题目描述&#xff1a; 给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:Panel)

可滑动面板&#xff0c;提供一种轻量的内容展示窗口&#xff0c;方便在不同尺寸中切换。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 可以包含子组件。 说明&#xff1a; 子组件类型&a…

phpcms上传漏洞

原始漏洞 漏洞原理&#xff1a;我们上传一个zip的压缩包&#xff0c;它会解压然后删除其中不是.jpg .gig .png的文件 function check_dir($dir)&#xff1a;这是一个PHP函数的定义&#xff0c;它接受一个参数 $dir&#xff0c;代表要检查的目录路径。 $handle opendir($dir)…

抖音电商新店品牌孵化运营打造规划方案

【干货资料持续更新&#xff0c;以防走丢】 抖音电商新店品牌孵化运营打造规划方案 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 PDF共130页&#xff08;完整资料包含以下内容&#xff09; 目录 抖音电商运营计划 1. 筹备期 货-人-场匹配 - 确定优质货品…

ANOMALY: meaningless REX prefix used汇总

原因1 未使用指定的python环境 解决方案 使用activate激活指定的python环境 原因2 系统更新然后命令行爆出的错误/电脑中的杀毒软件和系统兼容有问题。 解决方案2 1.将杀毒软件卸载。 2.使用360、电脑管家等对系统进行修复。 原因3 某些软件使用的开源库&#xff0c;比…

苹果Find My App用处多多,产品认准伦茨科技ST17H6x芯片

苹果发布AirTag发布以来&#xff0c;大家都更加注重物品的防丢&#xff0c;苹果的 Find My 就可以查找 iPhone、Mac、AirPods、Apple Watch&#xff0c;如今的Find My已经不单单可以查找苹果的设备&#xff0c;随着第三方设备的加入&#xff0c;将丰富Find My Network的版图。产…
最新文章