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

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

发展历程

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.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);}@RestControllerpublic 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.rhkb.cn/news/278540.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙 Harmony 初体验

前言 看现在网上传得沸沸扬扬的鸿蒙&#xff0c;打算弄个 hello world 玩一下, 不然就跟不上时代的发展了 环境安装 我的环境 Windows 11 家庭中文版HarmonyOS SDK (API 9)DevEco Studio (3.1.1 Release)Node.js (16.19.1) 开发IDE下载 官方下载链接 配置 nodejs 这里帮…

IT系统可观测性

什么是可观测性 可观测性&#xff08;Observability&#xff09;是指能够从系统的外部输出推断出系统内部状态的能力。在IT和云计算领域&#xff0c;它涉及使用软件工具和实践来收集、关联和分析分布式应用程序以及运行这些应用程序的硬件和网络产生的性能数据流。这样做可以更…

k8s helm 删除 tiller

kuberneter 上面装了 helm 想卸载还并不是那么简单, 参考 stackoverflow 回复 kubectl get -n kube-system secrets,sa,clusterrolebinding -o name|grep tiller|xargs kubectl -n kube-system delete kubectl get all -n kube-system -l apphelm -o name|xargs kubectl dele…

Morris法解决二叉树问题,展开链表及中序遍历

问题一&#xff1a;二叉树展开成单链表 问题二&#xff1a;二叉树中序遍历 咋一看非常简单的两道题&#xff0c;但是如果我们加以一些限制&#xff0c;这两题就不简单了。对于这两道题&#xff0c;我们的空间复杂度都必须控制在O(1)。也就是说&#xff0c;迭代和递归全部失效…

【OpenGL手册19】几何着色器

目录 一、说明 二、渲染管线的逻辑 三、几何着色器 四、使用几何着色器 五、造几个房子 六、几何着色器渲染爆破物体 一、说明 如果说用顶点和片段着色器干了什么&#xff0c;其实不多。加入几何着色器&#xff0c;能够加大渲染能力&#xff0c;简化数据结构&#xff0c;…

网络管理基础

Linux网络管理 1.网络管理概念 网络接口和名称 &#xff1a;网卡 ip地址 网关 主机名称 路由2.管理工具 net-tools: #安装包 ifconfig netstat 准备要废掉了。iproute: #安装包 ip #提供ip命令3.认识网卡 lo网卡 :本地回环网卡&#xff0c;本机上的服务自己访问自…

JAVA八股day1

遇到的问题 相比于包装类型&#xff08;对象类型&#xff09;&#xff0c; 基本数据类型占用的空间往往非常小为什么说是几乎所有对象实例都存在于堆中呢&#xff1f;静态变量和成员变量、成员变量和局部变量的区别为什么浮点数运算的时候会有精度丢失的风险&#xff1f;如何解…

IIS上部署.netcore WebApi项目及swagger

.netcore项目一般是直接双击exe文件&#xff0c;运行服务&#xff0c;今天有个需求&#xff0c;需要把.netcore项目运行在IIS上&#xff0c;遇到了一个小坑&#xff0c;在这里记录一下。 安装IIS&#xff0c;怎么部署站点&#xff0c;这些过于简单就不细说了&#xff0c;不知道…

2024-3-18-C++day6作业

1>思维导图 2>试编程 要求: 封装一个动物的基类&#xff0c;类中有私有成员&#xff1a;姓名&#xff0c;颜色&#xff0c;指针成员年纪 再封装一个狗这样类&#xff0c;共有继承于动物类&#xff0c;自己拓展的私有成员有&#xff1a;指针成员&#xff1a;腿的个数&a…

无人咖啡机品质之选,D 咖助力差异化竞争

在当今竞争激烈的商业环境中&#xff0c;如何脱颖而出成为众多企业关注的焦点。而无人咖啡机的出现&#xff0c;为商家提供了一个全新的思路。D 咖无人咖啡机&#xff0c;以其卓越的品质和独特的功能&#xff0c;成为了商家们实现差异化竞争的得力助手。 1. 卓越品质&#xff1…

el-form 的表单校验,如何验证某一项或者多项;validateField 的使用

通常对form表单的校验都是整体校验&#xff1a; this.$refs.form.validate( valid > {if (valid) {// 校验通过&#xff0c;业务逻辑代码...} }); 如果需要对表单里的特定一项或几项进行校验&#xff0c;应该如何实现&#xff1f; 业务场景&#xff1a;下图点探测按钮时…

高效使用git流程分享

准备 假设你已经 clone 了当前仓库&#xff0c;并且你的终端位置已经位于仓库目录中。 查询状态 查询状态常用的命令有 git status 和 git branch。 前者用于查询更改文件情况&#xff0c;后者用于展示所有分支。 chatbot-system$ git status On branch develop Your bran…

PostgreSQL中vacuum 物理文件truncate发生的条件

与我联系&#xff1a; 微信公众号&#xff1a;数据库杂记 个人微信: iiihero 我是iihero. 也可以叫我Sean. iiheroCSDN(https://blog.csdn.net/iihero) Sean墨天轮 (https://www.modb.pro/u/16258) 数据库领域的资深爱好者一枚。 水木早期数据库论坛发起人 db2smth就是俺&am…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的障碍物检测系统(深度学习代码+UI界面+训练数据集)

摘要&#xff1a;开发障碍物检测系统对于道路安全性具有关键作用。本篇博客详细介绍了如何运用深度学习构建一个障碍物检测系统&#xff0c;并提供了完整的实现代码。该系统基于强大的YOLOv8算法&#xff0c;并对比了YOLOv7、YOLOv6、YOLOv5&#xff0c;展示了不同模型间的性能…

Flink源码解析(1)TM启动

网络传输模型 首先在看之前,回顾一下akka模型: Flink通讯模型—Akka与Actor模型-CSDN博客 注:ActorRef就是actor的引用,封装好了actor 下面是jm和tm在通讯上的概念图: RpcGateway 不理解网关的作用,可以先移步看这里:网关_百度百科 (baidu.com) 用于定义RPC协议,是…

Centos strema 9 环境部署Glusterfs9

本文档只是创建复制卷&#xff0c;分布式卷&#xff0c;分布式复制卷&#xff0c;纠删卷 操作系统 内核 角色 Ip地址 说明 CentOS Stream 9 x86_64 5.14.0-427.el9.x86_64 客户端 client 192.168.80.119 挂载存储业务机器 CentOS Stream 9 x86_64 5.14.0-427.el9.x8…

YOLOv9改进策略:注意力机制 | 用于微小目标检测的上下文增强和特征细化网络ContextAggregation,助力小目标检测,暴力涨点

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a;用于微小目标检测的上下文增强和特征细化网络ContextAggregation&#xff0c;助力小目标检测 yolov9-c-ContextAggregation summary: 971 layers, 51002153 parameters, 51002121 gradients, 238.9 GFLOPs 改…

Hive SQL必刷练习题:连续问题 间断连续(*****)

问题描述&#xff1a; 1&#xff09; 连续问题&#xff1a;找出连续三天&#xff08;或者连续几天的啥啥啥&#xff09;。 2&#xff09; 间断连续&#xff1a;统计各用户连续登录最长天数&#xff0c;间断一天也算连续&#xff0c;比如1、3、4、6也算登陆了6天 问题分析&am…

手撕算法-二叉树的镜像

题目描述 操作给定的二叉树&#xff0c;将其变换为源二叉树的镜像。数据范围&#xff1a;二叉树的节点数 0≤_n_≤1000 &#xff0c; 二叉树每个节点的值 0≤_val_≤1000要求&#xff1a; 空间复杂度 O(n) 。本题也有原地操作&#xff0c;即空间复杂度 O(1) 的解法&#xff0c…

要将镜像推送到GitLab的Registry中的步骤

1、通过cli 模式登录gitlab &#xff08;命令行模式&#xff09; docker login git.asc-dede.de Username: haiyang Password: Login Succeeded 2、查看我的本地镜像&#xff1a; 3&#xff0c;推送镜像apollo_core到对应的gitlab项目的Registry 中 docker push registry.gi…