rpc协议与http协议简述

news2025/3/13 3:16:21

http协议

HTTP(Hypertext Transfer Protocol,超文本传输协议)是一种用于在计算机之间传输超文本的应用层协议。它是Web应用中最常用的协议,用于在客户端和服务器之间传输数据。

HTTP超文本传输协议教程

http由定义可以看出是传输超文本文件的,这里的范围很广,html文件,xml文件,字符串,数字,视频,图片等等,总之一切以流形式存在的文件都可以通过http协议传输。总的来说http传输的主体是流,字节流(文件,视频),字符流(各种数据),字符串常常以字符串表现,通过统一的序列化与反序列化规则恢复与压缩。

http协议存在与B/S或者C/S架构,为客户端(request)和服务端(respose)的新式,因此在计算器通讯时必须存在一个机器作为服务端一直监听请求,等待客户端请求数据。客户端与服务端通过http规定的解码与编码规则保证了传输数据的一致性。

对于服务端监听请求的叫web服务器,对于客户端发送请求的叫web浏览器。浏览器是指能够发送http请求的一类应用,现在有很多封装了http库可以直接使用如Ajax,Axios等,对http协议十分了解的也可以自行封装工具库。

一个http请求一般包含如下部分:
在这里插入图片描述
浏览器的开发者模式,对http请求的命名为xhr,如下

在这里插入图片描述

总结来说,http协议主要用来传输不同计算机上的产生的数据的。

在网络通讯的发展中仅仅用于传输数据的http协议已不再满足需求,如需要某个计算机的运行结果,使用http协议还需要等待其运行完成,在对数据封装,再发送;那么有没有可能,在其他计算机上直接调用需求计算机的线程,使其运行结果直接返回目标计算机而不必在对数据封装。于是rpc协议就诞生了。

rpc

RPC(Remote Procedure Call,远程过程调用)是一种计算机通信协议,用于在不同的计算机或进程之间进行远程调用。它允许一个计算机程序通过网络请求另一个计算机上的服务或函数,就像调用本地函数一样。

在通讯的不断发展中rpc协议已经实现了进程的调用,在其他计算机上调用目标计算机的线程,实现内存共享。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。

rpc相关问题

在RPC中,客户端程序通过发送请求消息给服务器端程序,服务器端程序接收请求消息并执行相应的操作,然后将结果返回给客户端。这个过程对于客户端来说是透明的,就像调用本地函数一样,不需要关心底层的网络通信细节。

RPC协议通常包括以下几个关键组件:

  1. 通信协议:定义了客户端和服务器之间的通信规则,如数据传输格式、编码方式、网络传输协议等。常见的通信协议有HTTP、TCP、UDP等。

  2. 接口定义语言(IDL):用于定义客户端和服务器之间的接口和数据结构。IDL提供了一种统一的语法和语义,使得不同编程语言的程序可以相互调用。

  3. 序列化和反序列化:将数据结构转换为字节流进行传输,或将接收到的字节流转换为数据结构。序列化和反序列化是RPC协议中的重要环节,用于在网络中传输数据。

  4. 代理和存根:客户端和服务器端分别使用代理和存根来隐藏底层的网络通信细节。客户端的代理负责将函数调用转换为网络请求,发送给服务器端;服务器端的存根负责接收请求,执行相应的操作,并将结果返回给客户端。

RPC协议可以用于构建分布式系统,将不同的计算机或进程连接起来,实现跨网络的函数调用。常见的RPC框架有gRPC、Apache Thrift、Apache Dubbo等。

rpc教程

rpcx

rpcx官方文档

rpcx是和grpc一样流行的rpc框架,更加轻量级,也更贴合原生的rpc使用。

rpcx时国人开发的文档丰富就不再赘述了,可以移步开发手册rpcx快速起步

大致分三步:

  1. 需调用线程及方法
  2. 服务端程序
  3. 客户端程序

案例如下server为服务端程序,client为客户端程序,service为服务线程。
在这里插入图片描述

  • service服务线程方法
package service

import (
	"context"
)

// 主程序的方法及数据
type Param struct {
	A, B int
	C    string
}

type Calculate int

// 返回数据
type Result struct {
	D int
}

// 计算方法
func (t *Calculate) Compute(cxt context.Context, args *Param, reply *Result) error {
	if args.C == "+" {
		reply.D = args.A + args.B
	} else if args.C == "-" {
		reply.D = args.A - args.B
	} else if args.C == "*" {
		reply.D = args.A * args.B
	} else if args.C == "/" {
		reply.D = args.A / args.B
	} else {
		reply.D = 0
	}
	return nil
}


服务相对简单,定义一个类编写方法,Param是参数,Result是返回数据。

这里需要注意的是,rpc调用的方法的参数和返回值必须来源于服务的方法类,不能通过远程调用接收时自定义。就行在使用grpc中参数和返回值都只能来源于pb文件,即使是自定义的完全一致的也不可以。

定义了Calculate 类有Compute方法传入参数和返回值,一般情况下,第一个参数是context.Context,第二个参数是参数,第三个参数是返回值。方法体就是根据表示进行加减乘除计算了。

  • server服务端程序
package main

import (
	"rpctest/service"

	"github.com/smallnest/rpcx/server"
)

// rpc服务器注册
func main() {
	s := server.NewServer()
	s.RegisterName("xiaoxu", new(service.Calculate), "")
	s.Serve("tcp", ":8972")
}

创建服务端将服务注册到服务端并起别名。

  • client客户端
package main

import (
	"context"
	"flag"
	"fmt"
	"log"

	"rpctest/service"

	"github.com/smallnest/rpcx/client"
)

var (
	addr = flag.String("addr", "localhost:8972", "server address")
)

func main() {
	flag.Parse()
	// 直接连接rpc服务器,连接会话
	d, err := client.NewPeer2PeerDiscovery("tcp@"+*addr, "")
	if err != nil {
		log.Fatalf("failed to call: %v", err)
	}
	// 获取客户端接口
	xclient := client.NewXClient("xiaoxu", client.Failtry, client.RandomSelect, d, client.DefaultOption)
	defer xclient.Close()
	//接口方法参数
	args := &service.Param{A: 10, B: 8, C: "+"}
	var reply service.Result
	//客户端接口调用方法
	err = xclient.Call(context.Background(), "Compute", args, &reply)
	if err != nil {
		log.Fatalf("failed to call: %v", err)
	}
	fmt.Printf("调用rpc的结果为:%d", reply.D)
}

创建rpc连接会话,通过别名获取连接到服务端的客户端,通过客户端创建接口,一般调用方法使用Call方法,第一个参数是context.Context,第一个参数是要调用的方法名称,第三个参数是服务参数,第四哥参数是服务返回值。

启动服务端
在这里插入图片描述
调用客户端
在这里插入图片描述

在此情况下,服务中定义一的任意类,参数与返回值均可以在客户端被调用,如下,在service再定义一个方法:

type ResultStr struct {
	Str string
}

func (t *Calculate) Hello(cxt context.Context, args *Param, reply *ResultStr) error {
	reply.Str = fmt.Sprintf("连接的三个参数分别为%d,%d,%s", args.A, args.B, args.C)
	return nil
}

由于属于同一个类连接会话一样,接口一样,在客户端可直接调用。

server

// hello函数
var replay1 service.ResultStr
xclient.Call(context.Background(), "Hello", args, &replay1)
fmt.Println(replay1.Str)

在这里插入图片描述

除了Call方法同步获取返回结果外,也提供了Go异步获取返回结果,此处不再赘述。

注册中心

在使用rpc时常常使用注册中心功能,对于分布式部署来说,各个主机的ip时不一样的,但是方法名都是一样的,因此可以通过方法名调用,这就需要使用注册中心功能。

在之前的服务器会话是点对点连接,未使用注册中心,点对点是最简单的一种注册中心的方式,事实上没有注册中心,客户端直接得到唯一的服务器的地址,连接服务。也就是使用NewPeer2PeerDiscovery方法。

d := client.NewPeer2PeerDiscovery("tcp@"+*addr, "")
xclient := client.NewXClient("Arith", client.Failtry, client.RandomSelect, d, client.DefaultOption)
defer xclient.Close()

但是有若干台服务器,且是分布式的就不再实用了,需要实用注册中心,常见的注册中心有ZooKeeper,Etcd,Consul等。

rpcx默认实用配置方式完成注册中心功能,只要开启相关功能配置插件即可。

在这里插入图片描述

实用etcd注册中心的服务端就变成了

// go run -tags etcd server.go
func main() {
    flag.Parse()

    s := server.NewServer()
    addRegistryPlugin(s)

    s.RegisterName("Arith", new(example.Arith), "")
    s.Serve("tcp", *addr)
}

func addRegistryPlugin(s *server.Server) {

    r := &serverplugin.EtcdRegisterPlugin{
        ServiceAddress: "tcp@" + *addr,
        EtcdServers:    []string{*etcdAddr},
        BasePath:       *basePath,
        Metrics:        metrics.NewRegistry(),
        UpdateInterval: time.Minute,
    }
    err := r.Start()
    if err != nil {
        log.Fatal(err)
    }
    s.Plugins.Add(r)
}

客户端连接的方法换成了注册中心的连接,客户端需要设置EtcdDiscovery插件,设置basepath和etcd集群的地址。

// go run -tags etcd client.go
d := client.NewEtcdDiscovery(*basePath, "Arith",[]string{*etcdAddr}, nil)
xclient := client.NewXClient("Arith", client.Failtry, client.RandomSelect, d, client.DefaultOption)
defer xclient.Close()

go rpc开发指南

Go RPC 开发指南

地鼠文档

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

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

相关文章

PC网上订货系统的定义与组成|企业手机APP订单管理软件

PC网上订货系统的定义与组成|企业手机APP订单管理软件 企业网上订货系统主要用于公司和订货商建立订货关系,绑定订货商 属于是 经销商订货软件、供货商订货系统。 通过企业网上订货管理系统这把利器可以帮助企业打通线上, 线下业务,实现进销…

了解抖音小店认证:提升信誉度,增加曝光率,开启更多功能

抖音小店是抖音平台推出的一个电商功能,旨在帮助用户将抖音上的流量转化为销售,实现线上线下的互通。抖音小店认证是指商家通过一系列的审核流程,获得官方认证的资格,获得更多的曝光和特权,提升商家的信誉度和用户的购…

一百七十六、Kettle——Kettle配置HDFS输出控件能不能加GZIP等压缩方式?

一、目的 为了尽可能减少磁盘资源的消耗,因此需要对从Kafka到HDFS的写入数据进行数据压缩。由于使用的ETL工具是kettle,因此研究一下Kettle配置HDFS输出控件时能不能加GZIP等压缩方式? kettle9.2的HDFS输出控件压缩方式包括GZip、Hadoop-snappy、None…

如何在Python爬虫程序中使用HTTP代理?

在进行网络爬虫时,我们经常需要使用代理服务器来隐藏自己的真实IP地址,以避免被目标网站封禁或限制访问。本文将介绍如何将HTTP代理配置到Python爬虫程序中使用。 什么是HTTP代理? HTTP代理是一种网络代理,它充当客户端和服务器之…

asp.net一套完整的实验室综合管理系统源码 LIMS

LIMS将样品管理、数据管理、资源管理、业务管理、报告管理等功能融为一体,组成一套完整的实验室综合管理和产品质量监控体系。其核心是规范样品化验分析的工作流程,对样品分析的每一个环节进行监控和管理,在提高样品分析质量和人员工作效率的…

集中采购如何节省企业时间和金钱?

初创企业和规模较小的企业在采购时往往抱着 "获取业务所需 "的心态进行采购。这对于采购需求较低的小型企业来说可能可行,但随着企业的发展,采购系统必须不断发展。 这种演变通常始于一种通过技术进一步强化的流程——集中采购模式。利用集中…

恒运资本:煤炭、石油板块拉升,安泰集团一度涨停,中曼石油等走高

煤炭板块13日盘中发力走高,到发稿,安泰集团涨超6%,盘中一度涨停;平煤股份、山煤国际涨逾3%。石油、燃气板块亦上扬,到发稿,大连热电涨超7%,中曼石油涨逾4%,贝肯能源涨逾2%。 组织表…

数据治理的 “独孤九剑”

加gzh“大数据食铁兽”,了解更多大数据资讯! 来源:与数据同行 免责声明:以上报告均系本平台通过公开、合法渠道获得,报告版权归原撰写/发布机构所有,如涉侵权,请联系删除 ;资料…

【云原生进阶之PaaS中间件】第二章Zookeeper-3.2架构详解

​​​​​​​ 1 Zookeeper工作原理 1.1 Zookeeper的角色 领导者(leader),负责进行投票的发起和决议,更新系统状态 学习者(learner),包括跟随者(follower)和观察者(observer),follower用于接受客户端请求并想客户端返回结果,在选主过程中参与投票 Observer可…

向日葵管理平台添加主机,获取葵码,在设备上进行绑定

管理平台地址 贝锐向日葵管理 - 登录 (oray.com) 使用 微信扫码登录 查看设备管理-设备列表 添加单个设备 输入名称,点击确定 生成葵码,点击此处 进行复制,在 被控端上进行葵码绑定

阿里云OSS文件上传下载【专栏】------文件下载(二)

目录 1、流式下载1.1、代码示例1.2、执行结果 2、下载到本地文件2.1、代码示例2.2、执行结果 3、断点续传下载3.1、代码示例3.2、执行结果 1、流式下载 当下载的文件太大或者一次性下载耗时太长时,您可以通过流式下载,一次处理部分内容,直到完…

热管理系统研发服务

为了适应电动化和智能化的需求,汽车热管理正从传统的发动机冷却和空调系统发展至电池热管理、电机电控热管理系统以及热泵空调系统,以实现对座舱温度、电池温度和动力总成温度的精确控制。由于新增了繁多的、控制精度要求更高的零部件,使得系…

《TCP/IP网络编程》阅读笔记--多线程服务器端的实现

1--多线程的优点 多进程服务器的缺点: ① 创建进程的过程会带来一定的开销; ② 为了完成进程间的数据交换,需要特殊的 IPC 技术; ③ 进程间的上下文切换是创建进程时的最大开销; 多线程的优点: ① 线程的创…

微服务架构笔记

文章目录 简介微服务架构微服务方案对比注册中心 简介 SpringCloud(多种框架组件技术集合的总框架)笔记 传统单体架构VS微服务分布式架构 单体架构特点? 简单方便,高度耦合,扩展性差,适合小型项目。例如:学生管理系…

VMware Workstation虚拟机网络配置及配置自动启动

目录 一、网络配置二、配置自动启动1.VMware 中配置虚拟机自启动2.系统服务中配置 VMware 服务自启动 一、网络配置 本文将虚拟机 IP 与主机 IP 设置为同一个网段。 点击 “编辑” -> “虚拟网络编辑器(N)…”: 点击 “更改设置”: 将 VMnet0 设置…

Linux下安装和使用MySQL的详细教程

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

机器学习入门案例(2)之使用逻辑回归预测房子是否能被租出去

大家好,我是邵奈一,一个不务正业的程序猿、正儿八经的斜杠青年。 1、世人称我为:被代码耽误的诗人、没天赋的书法家、五音不全的歌手、专业跑龙套演员、不合格的运动员… 2、这几年,我整理了很多IT技术相关的教程给大家&#xff0…

gitlab操作

1. 配置ssh 点击访问 2. 创建新分支与切换新分支 git branch 新分支名 // 创建 git checkout 新分支名 // 切换到新分支3. 查看当前分支 git branch*所指的就是当前所在分支 4. 本地删除文件后与远程git同步 git add -A git commit -m "del" git push

编码转换流

同理,创建f1和f2方法,分别测试OutputStreamWriter和InputStreamReader 也是主要分三步,即1创建流 2使用流 3关流 OutputStreamWriter f1方法 因为要操作流,所以先创建一个try-catch-finally结构,创建流对象Out…

【2596. 检查骑士巡视方案】

来源:力扣(LeetCode) 描述: 骑士在一张 n x n 的棋盘上巡视。在有效的巡视方案中,骑士会从棋盘的 左上角 出发,并且访问棋盘上的每个格子 恰好一次 。 给你一个 n x n 的整数矩阵 grid ,由范…