认识RPC框架,HTTP框架 | 青训营

44 阅读4分钟

概述

RPC(远程过程调用)框架是一种用于不同计算机或进程之间进行通信的技术。它允许一个程序调用另一个程序(通常在不同的计算机或进程中)的过程或方法,就像调用本地的过程或方法一样。

RPC框架的主要目标是隐藏底层通信细节,使得远程过程调用的过程对于开发者来说是透明的。它提供了一组协议和工具,用于定义和调用远程接口。下面是一些关于RPC框架的常见问题和概念:

  1. 通信协议:RPC框架可以使用不同的通信协议,如HTTP、TCP、UDP等。常见的RPC框架包括gRPC、Apache Thrift、JSON-RPC等。

  2. 接口定义语言(IDL):IDL是一种用于定义远程接口的语言。它定义了接口的方法、参数和返回值等信息,以便客户端和服务器端可以按照相同的规范进行通信。

  3. 序列化:在RPC框架中,数据在客户端和服务器端之间传输时需要进行序列化和反序列化操作。这是因为数据以二进制或其他格式在网络中传输,需要将数据对象转换为字节流进行传输,并在接收端重新构造对象。

  4. 远程调用过程:客户端通过RPC框架调用远程接口的方法,传递参数并等待结果。RPC框架负责将调用请求发送给服务器端,并将结果返回给客户端。

  5. 服务注册与发现:RPC框架通常提供服务注册与发现的机制,用于管理服务的地址和可用性。客户端可以通过注册中心获取服务的地址,并进行负载均衡和故障恢复。

基本概念

本地函数调用

import "fmt"

func main() {
	var a = 2
	var b = 3
	result := calculate(a, b)
	fmt.Println(result)
	
}

func calculate(x, y int) {
	z := x * y
	return z
}

在本地调用中,函数体是直接通过函数指针来指定的,我们调用哪个方法,编译器就自动帮我们调用它相应的函数指针。

对于远程函数调用

在本地调用中,我们只需要把参数压到栈里,然后让函救自己去栈里读就行,但是在远程过程调用时,客户端跟服务找是不同的进程,不能通过内存来传送参数,这时就需要客户端把参数转成一个字节流。传给服务器端后,再把字节流转成自己能读取的格式。

RPC需要解决的问题

  1. 函数映射

  2. 数据转换成字节流。

  3. 网络传输。

HTTP

HTTP是啥

一种用于在网络上传输超文本数据的协议。它是一种无状态的、应用层的协议,通常基于TCP/IP协议栈进行通信。

HTTP协议包含以下主要部分:

  1. 请求(Request):客户端发送给服务器的请求消息。它包含请求行、请求头和请求体。请求行指定请求的方法(如GET、POST)、URL路径和协议版本。请求头包含一些额外的信息,如请求的主机、用户代理(浏览器信息)等。请求体可选,用于在POST请求中发送数据。

  2. 响应(Response):服务器发送给客户端的响应消息。它包含状态行、响应头和响应体。状态行指定响应的状态码(如200表示成功,404表示未找到)和协议版本。响应头包含一些附加信息,如服务器类型、响应的时间、内容类型等。响应体包含返回的实际数据。

  3. 方法(Methods):HTTP定义了一些常见的方法,用于指定请求的操作类型。常见的方法包括GET(获取资源)、POST(提交数据)、PUT(更新资源)、DELETE(删除资源)等。

  4. 状态码(Status Codes):HTTP定义了一些状态码,用于表示服务器对请求的处理结果。常见的状态码包括200(成功)、404(未找到)、500(服务器错误)等。

  5. 头字段(Headers):HTTP的请求和响应中可以包含头字段,用于传递一些额外的元数据。常见的头字段包括Content-Type(指定数据的类型)、Cookie(存储会话信息)等。

  6. URL(Uniform Resource Locator):URL是用于标识资源在网络上的位置的地址。它包含协议类型、主机名、端口号和路径等组件,用于定位资源。

59IJ}8VZ3ZKJP9O4DTOSI)G.png

一般我们写的项目,里面的接口需要进行测试,可以使用像Apipost postman这样的软件:

![XZGK$0P9LJYUV`6BW15WZ4.png

![I{~1U5FV$E9P0{YP~)3D52.png

HTTP框架的不足

HTTP1:队头阻塞,传输效率低,明文传输不安全

HTTP2:多路复用,头部压缩,二进制协议

QUIC:基于UDP实现,解决队头阻塞,加密减少握手次数,支持开始启动