初识SDN(二)
初识SDN(二)
SDN部分实现
REST API 是什么?
REST API(Representational State Transfer Application Programming Interface,表述性状态传递应用程序接口)是一种基于HTTP协议的接口,广泛用于Web服务和应用程序之间的通信。REST API 通过标准的HTTP方法(如GET、POST、PUT、DELETE)来执行操作,具有以下特点:
特点
-
无状态性:
- 每个请求都是独立的,服务器不保存客户端的上下文状态。这意味着每个请求必须包含所有必要的信息。
-
资源导向:
- REST API 将系统中的所有内容视为资源(如用户、订单、产品等),每个资源都有唯一的URI(统一资源标识符)。
-
标准化操作:
- 使用HTTP方法来执行操作:
- GET:获取资源
- POST:创建资源
- PUT:更新资源
- DELETE:删除资源
- 使用HTTP方法来执行操作:
-
表现层状态转移:
- 客户端与服务器之间的交互通过表述(representation)来进行,这些表述可以是JSON、XML、HTML等格式。
优点
- 简单易用:基于HTTP协议,容易理解和使用。
- 灵活性强:可以处理各种数据格式,如JSON、XML。
- 可扩展性好:通过标准化的URI和HTTP方法,可以轻松扩展和维护API。
在 REST API 中,HTTP 方法用于定义对资源执行的操作。以下是主要的 HTTP 方法及其区别:
1. GET
- 功能:用于从服务器获取资源。
- 幂等性:是(多次相同请求的效果与一次请求相同)。
- 安全性:是(不会改变服务器状态,只是获取数据)。
- 示例:
GET /users GET /users/{userId}
2. POST
- 功能:用于向服务器创建新资源。
- 幂等性:否(多次相同请求会创建多个资源)。
- 安全性:否(会改变服务器状态)。
- 示例:
POST /users Content-Type: application/json{"name": "John Doe","email": "john.doe@example.com" }
3. PUT
- 功能:用于更新或替换服务器上的资源。如果资源不存在,则可以创建新资源(视实现而定)。
- 幂等性:是(多次相同请求的效果与一次请求相同)。
- 安全性:否(会改变服务器状态)。
- 示例:
PUT /users/{userId} Content-Type: application/json{"name": "Jane Doe","email": "jane.doe@example.com" }
4. DELETE
- 功能:用于删除服务器上的资源。
- 幂等性:是(多次相同请求的效果与一次请求相同,即使资源已经被删除)。
- 安全性:否(会改变服务器状态)。
- 示例:
DELETE /users/{userId}
5. PATCH
- 功能:用于部分更新服务器上的资源。
- 幂等性:视实现而定(通常认为是,但不一定总是)。
- 安全性:否(会改变服务器状态)。
- 示例:
PATCH /users/{userId} Content-Type: application/json{"email": "new.email@example.com" }
总结
- GET:获取资源,不会改变服务器状态,幂等且安全。
- POST:创建新资源,可能改变服务器状态,非幂等且不安全。
- PUT:更新或替换资源,可能改变服务器状态,幂等但不安全。
- DELETE:删除资源,可能改变服务器状态,幂等但不安全。
- PATCH:部分更新资源,可能改变服务器状态,通常幂等但不安全。
示例
假设有一个管理用户的REST API,以下是一些示例请求:
-
获取所有用户:
GET /users -
获取特定用户:
GET /users/{userId} -
创建新用户:
POST /users Content-Type: application/json{"name": "John Doe","email": "john.doe@example.com" } -
更新用户信息:
PUT /users/{userId} Content-Type: application/json{"name": "John Doe","email": "john.doe@newdomain.com" } -
删除用户:
DELETE /users/{userId}
gRPC 接口
gRPC(gRPC Remote Procedure Calls)是一种高性能、开源的远程过程调用(RPC)框架,由 Google 开发。它使用 HTTP/2 作为传输协议,并采用 Protocol Buffers(protobuf)作为接口描述语言。以下是 gRPC 的一些关键特点和优点:
特点
-
高性能:
- 使用 HTTP/2 协议,支持多路复用、头部压缩和服务器推送,提供更高的性能和效率。
-
多语言支持:
- gRPC 支持多种编程语言,包括 C++、Java、Python、Go、Ruby、C# 等,便于跨语言应用开发。
-
强类型接口:
- 使用 Protocol Buffers 定义服务和消息格式,提供强类型检查和高效的序列化/反序列化。
-
双向流:
- 支持客户端流、服务器流和双向流,适用于复杂的通信模式。
优点
- 高效通信:基于 HTTP/2 和 Protocol Buffers,提供低延迟、高吞吐量的通信。
- 简洁的接口定义:通过 .proto 文件定义服务和消息,生成代码可以直接使用。
- 自动生成代码:gRPC 工具可以自动生成客户端和服务器端代码,减少手动编写代码的工作量。
- 跨平台:支持多种操作系统和编程语言,便于跨平台开发。
示例
假设我们有一个简单的用户管理服务,定义在一个 .proto 文件中:
syntax = "proto3";package user;service UserService {rpc GetUser (GetUserRequest) returns (GetUserResponse);rpc CreateUser (CreateUserRequest) returns (CreateUserResponse);
}message GetUserRequest {string user_id = 1;
}message GetUserResponse {string user_id = 1;string name = 2;string email = 3;
}message CreateUserRequest {string name = 1;string email = 2;
}message CreateUserResponse {string user_id = 1;
}
使用步骤
-
定义 .proto 文件:
- 使用 Protocol Buffers 定义服务和消息格式,如上面的示例。
-
生成代码:
- 使用
protoc工具生成客户端和服务器端代码。例如:protoc --go_out=. --go-grpc_out=. user.proto
- 使用
-
实现服务:
- 在服务器端实现定义的服务接口。在客户端调用生成的客户端代码。
gRPC 的应用场景
- 微服务架构:适用于需要高效、可靠通信的微服务架构。
- 实时通信:如实时聊天、视频流等需要低延迟的应用。
- 跨平台通信:需要在不同语言和平台之间进行通信的应用。
核心服务层的主要功能
-
拓扑发现:
- 功能:动态发现和维护网络拓扑结构。
- 作用:通过与网络设备的交互,SDN 控制器可以实时获取和更新网络拓扑信息。这包括设备之间的连接关系、链路状态等。
- 实现方式:通常通过 LLDP(链路层发现协议)等协议实现。
-
路径计算:
- 功能:根据网络状态和策略计算最优的流量路径。
- 作用:SDN 控制器根据当前的网络拓扑和预定义的策略(如最短路径、负载均衡等),计算出数据包应通过的最佳路径。
- 实现方式:使用各种算法(如 Dijkstra 算法)来计算路径,并动态调整以优化网络性能。
-
流量管理:
- 功能:管理和控制网络流量,实施流量工程策略。
- 作用:通过控制数据包的转发路径,SDN 控制器可以实现流量的优化和管理,如流量分流、带宽控制、优先级管理等。
- 实现方式:使用 OpenFlow 等南向接口协议下发流表项,控制数据包的转发行为。
-
设备管理:
- 功能:管理网络设备的配置和状态。
- 作用:SDN 控制器可以集中管理网络设备的配置,监控设备状态,进行故障检测和恢复,确保网络的稳定运行。
- 实现方式:通过 NETCONF、SNMP 等协议与设备进行交互,获取和修改设备配置。
扩展
步骤 1:安装 Protocol Buffers 编译器
首先,你需要安装 Protocol Buffers 编译器 protoc。你可以从 Protocol Buffers 的 GitHub 页面 下载适合你操作系统的版本并进行安装。
步骤 2:安装 gRPC 插件
根据你使用的编程语言,安装相应的 gRPC 插件。例如,对于 Python,你可以使用 pip 安装:
pip install grpcio grpcio-tools
对于其他语言,你可以参考 gRPC 官方文档 获取详细的安装指南。
步骤 3:定义 .proto 文件
创建一个 .proto 文件,定义你的服务和消息。例如,创建一个 user.proto 文件:
syntax = "proto3";package user;service UserService {rpc GetUser (GetUserRequest) returns (GetUserResponse);rpc CreateUser (CreateUserRequest) returns (CreateUserResponse);
}message GetUserRequest {string user_id = 1;
}message GetUserResponse {string user_id = 1;string name = 2;string email = 3;
}message CreateUserRequest {string name = 1;string email = 2;
}message CreateUserResponse {string user_id = 1;
}
步骤 4:生成代码
使用 protoc 编译器和 gRPC 插件生成客户端和服务器端代码。例如,对于 Python:
python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. user.proto
这将生成两个文件:
user_pb2.py:包含消息类。user_pb2_grpc.py:包含服务类和客户端存根。
对于其他语言,如 Java、Go 或 C#,生成代码的命令会有所不同。你可以参考 gRPC 官方文档 获取详细的命令。
步骤 5:实现服务器和客户端
生成代码后,你需要实现服务器和客户端逻辑。以下是一个简单的 Python 示例:
服务器实现(server.py):
from concurrent import futures
import grpc
import user_pb2
import user_pb2_grpcclass UserService(user_pb2_grpc.UserServiceServicer):def GetUser(self, request, context):return user_pb2.GetUserResponse(user_id=request.user_id, name="John Doe", email="john.doe@example.com")def CreateUser(self, request, context):return user_pb2.CreateUserResponse(user_id="12345")def serve():server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))user_pb2_grpc.add_UserServiceServicer_to_server(UserService(), server)server.add_insecure_port('[::]:50051')server.start()server.wait_for_termination()if __name__ == '__main__':serve()
客户端实现(client.py):
import grpc
import user_pb2
import user_pb2_grpcdef run():with grpc.insecure_channel('localhost:50051') as channel:stub = user_pb2_grpc.UserServiceStub(channel)response = stub.GetUser(user_pb2.GetUserRequest(user_id="12345"))print("GetUser response: ", response)response = stub.CreateUser(user_pb2.CreateUserRequest(name="Jane Doe", email="jane.doe@example.com"))print("CreateUser response: ", response)if __name__ == '__main__':run()
PROTO文件编辑
通过一个更详细的实际项目示例来说明如何定义
.proto文件。假设我们要开发一个简单的博客系统,包含以下功能:
- 获取博客文章
- 创建博客文章
- 更新博客文章
- 删除博客文章
步骤 1:明确服务和方法
我们需要一个 BlogService 服务,包含以下方法:
GetBlog:获取博客文章CreateBlog:创建博客文章UpdateBlog:更新博客文章DeleteBlog:删除博客文章
步骤 2:定义消息类型
每个方法需要请求和响应消息。例如:
GetBlog方法需要一个包含博客ID的请求消息,并返回包含博客详细信息的响应消息。CreateBlog方法需要一个包含博客标题和内容的请求消息,并返回新创建的博客ID。
步骤 3:编写 .proto 文件
根据上述需求,编写你的 .proto 文件。以下是一个示例:
syntax = "proto3"; // 使用 Protocol Buffers 的版本package blog; // 定义包名// 定义 BlogService 服务
service BlogService {// 定义 GetBlog 方法rpc GetBlog (GetBlogRequest) returns (GetBlogResponse);// 定义 CreateBlog 方法rpc CreateBlog (CreateBlogRequest) returns (CreateBlogResponse);// 定义 UpdateBlog 方法rpc UpdateBlog (UpdateBlogRequest) returns (UpdateBlogResponse);// 定义 DeleteBlog 方法rpc DeleteBlog (DeleteBlogRequest) returns (DeleteBlogResponse);
}// 定义 GetBlog 请求消息
message GetBlogRequest {string blog_id = 1; // 博客ID
}// 定义 GetBlog 响应消息
message GetBlogResponse {string blog_id = 1; // 博客IDstring title = 2; // 博客标题string content = 3; // 博客内容
}// 定义 CreateBlog 请求消息
message CreateBlogRequest {string title = 1; // 博客标题string content = 2; // 博客内容
}// 定义 CreateBlog 响应消息
message CreateBlogResponse {string blog_id = 1; // 新创建的博客ID
}// 定义 UpdateBlog 请求消息
message UpdateBlogRequest {string blog_id = 1; // 博客IDstring title = 2; // 博客标题string content = 3; // 博客内容
}// 定义 UpdateBlog 响应消息
message UpdateBlogResponse {bool success = 1; // 更新是否成功
}// 定义 DeleteBlog 请求消息
message DeleteBlogRequest {string blog_id = 1; // 博客ID
}// 定义 DeleteBlog 响应消息
message DeleteBlogResponse {bool success = 1; // 删除是否成功
}
步骤 4:生成代码
使用 protoc 编译器生成客户端和服务器端代码。例如,对于 Python:
python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. blog.proto
这将生成两个文件:
blog_pb2.py:包含消息类。blog_pb2_grpc.py:包含服务类和客户端存根。
实际项目中的使用
在实际项目中,你可以使用生成的代码来实现服务端逻辑和客户端调用。例如,在 Python 中:
服务端实现(server.py)
import grpc
from concurrent import futures
import blog_pb2_grpc as pb2_grpc
import blog_pb2 as pb2class BlogService(pb2_grpc.BlogServiceServicer):def GetBlog(self, request, context):# 实现获取博客文章的逻辑return pb2.GetBlogResponse(blog_id=request.blog_id, title="Sample Title", content="Sample Content")def CreateBlog(self, request, context):# 实现创建博客文章的逻辑return pb2.CreateBlogResponse(blog_id="new_blog_id")def UpdateBlog(self, request, context):# 实现更新博客文章的逻辑return pb2.UpdateBlogResponse(success=True)def DeleteBlog(self, request, context):# 实现删除博客文章的逻辑return pb2.DeleteBlogResponse(success=True)def serve():server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))pb2_grpc.add_BlogServiceServicer_to_server(BlogService(), server)server.add_insecure_port('[::]:50051')server.start()server.wait_for_termination()if __name__ == '__main__':serve()
客户端调用(client.py)
import grpc
import blog_pb2_grpc as pb2_grpc
import blog_pb2 as pb2def run():with grpc.insecure_channel('localhost:50051') as channel:stub = pb2_grpc.BlogServiceStub(channel)response = stub.GetBlog(pb2.GetBlogRequest(blog_id="sample_blog_id"))print("GetBlog Response:", response)if __name__ == '__main__':run()
相关文章:
初识SDN(二)
初识SDN(二) SDN部分实现 REST API 是什么? REST API(Representational State Transfer Application Programming Interface,表述性状态传递应用程序接口)是一种基于HTTP协议的接口,广泛用于…...
某红书旋转滑块验证码分析与协议算法实现(高通过率)
文章目录 1. 写在前面2. 接口分析3. 验证轨迹4. 算法还原 【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致…...
Gin的快速入门和搭建
文章目录 Go的工程工程架构技术选型 Gin入门 Go的工程 基于Go生态,构建一个支持内容管理,内容加工、内容分发的内容库系统。 内容管理:增删改查内容加工:例如内容审核、推荐等内容分发:将内容可以推到不同的业务线 …...
react-native运行程序 出现 Application XXX is waiting for the debugger
1.重启adb: adb kill-server、 adb start-server. 2、确定USB调试模式是否开启,如果已经开启了,关闭了重新打开一下 3.选择调试模式并关闭等待调试程序...
什么文档加密软件好用?迅软DSE加密软件你不会还不知道吧?
一、什么文档加密软件好用? 其中有迅软DSE文档加密软件等。 迅软DSE加密软件:让企业的创意成果、招投标文件、生产工艺、流程配方、研发成果、公司计划、员工信息等核心数据更安全。 多方面加密模式,有效防止数据泄密 透明无感知加密&…...
【kubernetes】关于k8s集群的污点、容忍、驱逐以及k8s集群故障排查思路
目录 一、污点(Taint) 1.1污点介绍 1.2污点的组成格式 1.3当前 taint effect 支持如下三个选项: 1.4污点的增删改查 1.4.1验证污点的作用——NoExecute 1.4.2验证污点的作用——NoSchedule 1.4.3 验证污点的作用——PreferNoSchedule 1.5污点的配置与管理…...
linux进程加载和启动过程分析
我们的源代码通过预处理,编译,汇编,链接后形成可执行文件,那么当我们在终端敲下指令$ ./a.out argv1 argv2 后,操作系统是怎么将我们的可执行文件加载并运行的呢? 首先知道,计算机的操作系统的启动程序是写死在硬件上的,每次计算机上电时,都将自动加载启动程序,之后…...
WLAN组网模型探究
目录 一、WLAN基本概念二、WLAN组网方式三、WLAN转发模型 随着信息技术的飞速发展,无线局域网(WLAN)已逐渐成为企业网络架构中不可或缺的一部分。不同的企业组织因其业务特性、规模大小及安全需求的不同,对WLAN的要求也各有侧重。…...
操作系统基础知识
一. 进程 进程是正在运行中的程序,是动态的 进程是资源分配的最小单位 进程的基本特征:动态性,并发性,独立性,异步性 二. 线程 线程在执行过程中的每一个任务就是一个线程 进程是由一个或多个线程组成࿰…...
Kompas AI:智能生活的开启者
引言 在现代社会,**人工智能(AI)**已经深刻地影响了我们的生活和工作。无论是智能家居、自动驾驶,还是医疗诊断,AI的应用无处不在。而在众多AI平台中,Kompas AI 作为一个先进的对话式AI平台,通过…...
Java——二进制原码、反码和补码
一、简要介绍 原码、反码和补码只是三种二进制不同的表示形式,每个二进制数都有这三个形式。 1、原码 原码是将一个数的符号位和数值位分别表示的方法。 最高位为符号位,0表示正,1表示负,其余位表示数值的绝对值。 例如&…...
git使用流程
1.下载git 搜索下载 2.注册github账号(打开爬墙工具) 创建一个仓库 3.配置邮箱和密码 4.所以找一个文件夹 鼠标右键 选择 open Git Bash here(当前文件夹下打开命令行) 输入命令 配置用户名和邮箱 5.将建的仓库克隆下来 …...
C++设计模式|结构型 代理模式
1.什么是代理模式? 代理模式Proxy Pattern是一种结构型设计模式,用于控制对其他对象的访问。 在代理模式中,允许一个对象(代理)充当另一个对象(真实对象)的接口,以控制对这个对象的…...
C语言 带头双向循环链表的基本操作
带头双向循环链表的基本操作 结构体定义初始化创建新节点头插头删尾插尾删查找在指定位置之后插入删除指定位置的值打印 结构体定义 typedef int DataType; typedef struct LinkNode {DataType data;struct LinkNode* prev;struct LinkNode* next; }LNode;初始化 有两种初始化…...
MATLAB中扩展卡尔曼滤波误差估计的关键点
在MATLAB中,对于扩展卡尔曼滤波(EKF)的误差估计,主要涉及对系统状态估计的准确性和精度的评估。EKF是一种适用于非线性系统的状态估计方法,它通过递归的方式,结合系统的动态模型和观测模型,来预…...
SpringBoot温习
1.1 Spring Boot Spring Boot是一个开源的Java框架,由Pivotal团队(现在是VMware的一部分)开发,它是Spring框架的一个模块,旨在简化Spring应用程序的初始搭建以及开发过程。 Spring Boot的核心目标是让开发者尽可能…...
Spring Cloud:构建高可用分布式系统的利器
摘要:本文将介绍Spring Cloud,一个基于Spring Boot的开源微服务架构工具集。我们将探讨Spring Cloud的核心组件、特性以及如何使用Spring Cloud构建高可用、分布式系统。通过本文,读者将了解到Spring Cloud在实现微服务架构中的应用和优势。 …...
IT技术 | 电脑蓝屏修复记录DRIVER_IRQL_NOT_LESS_OR_EQUAL
我的台式机是iMac 2015年的,硬盘是机械的,时间久了运行越来越慢。后来对苹果系统失去了兴趣,想换回windows,且想换固态硬盘,就使用winToGo 搞了双系统,在USB外接移动固态硬盘上安装了win10系统。 最近&…...
windows 下编译 TessRact+leptonica 识别图片文字
目录 1、下载 2. 编译基础依赖库 1.1 zlib 1.2 jpegsr9f 1.3 lpng1643 1.4 libgif 3. 编译tifflib 4. 配置nasm到系统环境中 5. 编译 libjpeg-turbo 6 编译leptonica 7. 编译tesseract 8. 测试验证 1、下载 下载tesseract5.3.2 下载leptonica1.83.1 下载l…...
如何把docker里的内容拷贝出来
如何把docker里的内容拷贝出来 要从Docker容器中复制文件或目录出来,可以使用docker cp命令。以下是基本的命令格式和示例: 命令格式: docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH示例: 假设你有一个名为my_container的…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...
消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...
算术操作符与类型转换:从基础到精通
目录 前言:从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符:、-、*、/、% 赋值操作符:和复合赋值 单⽬操作符:、--、、- 前言:从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...
未授权访问事件频发,我们应当如何应对?
在当下,数据已成为企业和组织的核心资产,是推动业务发展、决策制定以及创新的关键驱动力。然而,未授权访问这一隐匿的安全威胁,正如同高悬的达摩克利斯之剑,时刻威胁着数据的安全,一旦触发,便可…...
免费批量Markdown转Word工具
免费批量Markdown转Word工具 一款简单易用的批量Markdown文档转换工具,支持将多个Markdown文件一键转换为Word文档。完全免费,无需安装,解压即用! 官方网站 访问官方展示页面了解更多信息:http://mutou888.com/pro…...
mcts蒙特卡洛模拟树思想
您这个观察非常敏锐,而且在很大程度上是正确的!您已经洞察到了MCTS算法在不同阶段的两种不同行为模式。我们来把这个关系理得更清楚一些,您的理解其实离真相只有一步之遥。 您说的“select是在二次选择的时候起作用”,这个观察非…...
短视频时长预估算法调研
weighted LR o d d s T p 1 − p ( 1 − p ) o d d s T p ( T p o d d s ∗ p ) o d d s p o d d s T o d d s odds \frac{Tp}{1-p} \newline (1-p)odds Tp \newline (Tp odds * p) odds \newline p \frac{odds}{T odds} \newline odds1−pTp(1−p)oddsTp(Tpodds…...
