当前位置: 首页 > news >正文

【Go系列】RPC和grpc

承上启下

介绍完了Go怎么实现RESTFul api,不可避免的,今天必须得整一下rpc这个概念。rpc是什么呢,很多人都想把rpc和http一起对比,但是他们不是一个概念。RPC是一种思想,可以基于tcp,可以基于udp也可以基于http。我们详细学习下把。

开始学习

RPC,听起来是不是有点像“人品差”?别误会,这里的RPC可是“远程过程调用”的缩写,它可是一个让我们的代码能够隔空打牛、远程操控的神奇技能!

什么是RPC?

简单来说,RPC就是让你在本地调用一个函数,却能够远程执行另一台机器上的代码。想象一下,你在家里的沙发上按了一个遥控器,结果远在千里之外的咖啡机开始给你煮咖啡,是不是很神奇?RPC就是这么个神奇的“遥控器”。

Go如何实现RPC?

在Go语言中,实现RPC就跟泡方便面一样简单。以下是泡面的步骤:

  1. 准备调料包(定义服务):首先,你需要定义一个服务,也就是你的远程函数。这就像把调料包准备好,等着加水泡。
type HelloService struct{}func (p *HelloService) Hello(request string, reply *string) error {*reply = "hello, " + requestreturn nil
}

烧开水(注册服务):然后,你需要把服务注册到RPC服务器上,就像把调料包放进烧开的水里。

rpc.RegisterName("HelloService", new(HelloService))

泡方便面(启动服务器):接下来,启动RPC服务器,等待客户端调用。

lis, _ := net.Listen("tcp", ":1234")
rpc.Accept(lis)

品尝美味(调用服务):最后,客户端就可以远程调用你的服务了,就像品尝美味的方便面。

client, _ := rpc.Dial("tcp", "localhost:1234")
var reply string
err := client.Call("HelloService.Hello", "world", &reply)

grpc库的使用

说到RPC,怎能不提/grpc/这个库呢?它可是RPC界的“老干妈”,让RPC变得更加美味。

gRPC,这个由Google开发的高性能、开源的RPC框架。gRPC基于HTTP/2协议,使用Protocol Buffers作为接口定义语言,支持多种编程语言。以下是gRPC的详细介绍:

1. gRPC的特点

  • 多语言支持:gRPC支持多种编程语言,包括C++、Java、Python、Go、Ruby、C#、Node.js等。
  • 基于HTTP/2:gRPC使用HTTP/2作为传输协议,支持双向流、流控、头部压缩等特性,使得通信更加高效。
  • 协议缓冲(Protocol Buffers):gRPC使用Protocol Buffers来定义服务接口和消息格式,它是一种轻量级的数据交换格式,可以跨平台和语言使用。
  • 同步和异步:gRPC客户端提供了同步和异步的API,可以根据需要选择不同的调用方式。
  • 负载均衡:gRPC原生支持负载均衡,可以通过名称解析来发现服务实例。
  • 认证:gRPC支持多种认证机制,如SSL/TLS、JWT等。

2. gRPC的工作流程

  1. 定义服务:使用Protocol Buffers定义服务接口和消息类型。

    syntax = "proto3";service YourService {rpc YourMethod (YourRequest) returns (YourResponse);
    }message YourRequest {// request fields
    }message YourResponse {// response fields
    }
    
  2. 生成代码:使用Protocol Buffers编译器protoc生成服务端和客户端的代码。

    protoc --go_out=plugins=grpc:. your_service.proto
    
  3. 实现服务端:实现生成的服务端接口。

    type server struct{}func (s *server) YourMethod(ctx context.Context, in *pb.YourRequest) (*pb.YourResponse, error) {// implement the method
    }func main() {lis, err := net.Listen("tcp", ":50051")if err != nil {log.Fatalf("failed to listen: %v", err)}s := grpc.NewServer()pb.RegisterYourServiceServer(s, &server{})if err := s.Serve(lis); err != nil {log.Fatalf("failed to serve: %v", err)}
    }
    
  4. 实现客户端:使用生成的客户端代码调用服务。

    conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure(), grpc.WithBlock())
    if err != nil {log.Fatalf("did not connect: %v", err)
    }
    defer conn.Close()
    c := pb.NewYourServiceClient(conn)ctx, cancel := context.WithTimeout(context.Background(), time.Second)
    defer cancel()
    r, err := c.YourMethod(ctx, &pb.YourRequest{})
    if err != nil {log.Fatalf("could not greet: %v", err)
    }
    log.Printf("Response: %s", r.GetField())
    

3. gRPC的四种调用类型

  • 简单RPC:客户端发送一个请求到服务器,并等待响应,就像普通的函数调用。
  • 服务器流式RPC:客户端发送一个请求到服务器,并获取一个流来读取一系列消息。客户端读取直到没有更多的消息。
  • 客户端流式RPC:客户端写入一系列消息并发送到服务器,一旦客户端完成消息写入,它等待服务器读取这些消息并返回一个响应。
  • 双向流式RPC:双方使用读写流发送一系列消息。两个流独立操作,因此客户端和服务器可以按照自己喜欢的顺序读写。

4. gRPC的安全性和认证

gRPC支持以下安全性措施:

  • 传输安全性:通过TLS/SSL来保证传输过程中的数据加密。
  • 认证:gRPC支持基于Token的认证机制,如OAuth 2.0。
  • 权限和审计:可以通过中间件来添加权限检查和审计日志。

5. gRPC的负载均衡

gRPC支持以下负载均衡策略:

  • 名称解析:gRPC客户端可以使用名称解析来发现服务实例。
  • 轮询:简单的轮询策略,将请求轮流分配到不同的服务器。
  • 基于权重的轮询:根据服务器的权重分配请求。
  • 故障转移:在主服务器故障时,请求会被转发到备用服务器。

restful与rpc

通过以上的介绍,我们都了解RPC(远程过程调用)和HTTP(超文本传输协议)是完全不同的概念,我们反倒是可以跟Restful API进行对比,:

RPC与HTTP的区别:

1. 目的与设计哲学:

  • RPC:旨在实现远程函数调用,让远程服务调用看起来像本地函数调用一样简单。
  • HTTP:是一种用于传输超媒体文档的应用层协议,主要用于Web浏览器和服务器之间的通信。

2. 通信方式:

  • RPC:通常采用二进制协议,数据传输效率较高。
  • HTTP:采用文本格式(如JSON、XML),可读性较好,但传输效率相对较低。

3. 传输协议:

  • RPC:可以使用多种传输协议,如TCP、UDP,甚至HTTP。
  • HTTP:默认使用HTTP/1.1或HTTP/2,基于TCP。

4. 性能:

  • RPC:通常提供更低的延迟和更高的吞吐量,因为它通常使用更高效的序列化/反序列化机制。
  • HTTP:由于HTTP协议的文本特性,性能通常不如RPC。

5. 客户端和服务端实现:

  • RPC:需要特定的客户端和服务端库来处理消息的序列化和反序列化。
  • HTTP:可以直接使用标准的HTTP客户端和服务器,如Web浏览器和Web服务器。

RPC与RESTful API的优缺点:

RPC的优点:

  • 性能:通常RPC框架提供更高效的序列化/反序列化机制,如Protocol Buffers或MessagePack,性能更优。
  • 简单性:RPC让远程调用看起来像本地函数调用,开发体验更接近于本地编程。
  • 强类型:许多RPC框架支持静态类型,有助于在编译时发现错误。

RPC的缺点:

  • 耦合性:RPC可能导致客户端和服务端之间的强耦合,因为它们需要共享接口定义。
  • 标准化:相比RESTful API,RPC的标准化程度较低,不同框架之间可能不兼容。

RESTful API的优点:

  • 无状态:RESTful API是无状态的,有助于构建可伸缩的系统。
  • 标准化:基于HTTP协议,有广泛的工具和库支持。
  • 可缓存:HTTP的缓存机制可以用于优化性能。

RESTful API的缺点:

  • 性能:由于HTTP的文本特性,性能可能不如二进制的RPC协议。
  • 复杂性:对于复杂的操作,RESTful API可能需要多个请求来完成任务,而RPC可以一个调用完成。

总的来说,RPC和RESTful API各有适用场景。RPC更适合内部服务之间的通信,特别是对性能有高要求的场景。而RESTful API更适合面向资源的Web服务,尤其是需要被Web浏览器直接访问的场景。选择哪种协议取决于具体的应用需求、性能要求和开发团队的偏好。

相关文章:

【Go系列】RPC和grpc

承上启下 介绍完了Go怎么实现RESTFul api,不可避免的,今天必须得整一下rpc这个概念。rpc是什么呢,很多人都想把rpc和http一起对比,但是他们不是一个概念。RPC是一种思想,可以基于tcp,可以基于udp也可以基于…...

【VUE】v-if和v-for的优先级

v-if和v-for v-if 用来显示和隐藏元素 flag为true时&#xff0c;dom元素会被删除达到隐藏效果 <div class"boxIf" v-if"flag"></div>v-for用来进行遍历&#xff0c;可以遍历数字对象数组&#xff0c;会将整个元素遍历指定次数 <!-- 遍…...

【单目3D检测】smoke(1):模型方案详解

纵目发表的这篇单目3D目标检测论文不同于以往用2D预选框建立3D信息&#xff0c;而是采取直接回归3D信息&#xff0c;这种思路简单又高效&#xff0c;并不需要复杂的前后处理&#xff0c;而且是一种one stage方法&#xff0c;对于实际业务部署也很友好。 题目&#xff1a;SMOKE&…...

数据库系统概论:数据库系统的锁机制

引言 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;数据作为一种共享资源&#xff0c;其并发访问的一致性和有效性是数据库必须解决的问题。锁机制通过对数据库中的数据对象&#xff08;如表、行等&#xff09;进行加锁&#xff0c;以确保在同…...

Django+vue自动化测试平台(28)-- ADB获取设备信息

概述 adb的全称为Android Debug Bridge&#xff0c;就是起到调试桥的作用。通过adb可以在Eclipse中通过DDMS来调试Android程序&#xff0c;说白了就是调试工具。 adb的工作方式比较特殊&#xff0c;采用监听Socket TCP 5554等端口的方式让IDE和Qemu通讯&#xff0c;默认情况下…...

RESTful API设计指南:构建高效、可扩展和易用的API

文章目录 引言一、RESTful API概述1.1 什么是RESTful API1.2 RESTful API的重要性 二、RESTful API的基本原则2.1 资源导向设计2.2 HTTP方法的正确使用 三、URL设计3.1 使用名词而非动词3.2 使用复数形式表示资源集合 四、请求和响应设计4.1 HTTP状态码4.2 响应格式4.2.1 响应实…...

npm下载的依赖包版本号怎么看

npm下载的依赖包版本号怎么看 版本号一般分三个部分&#xff0c;主版本号、次版本号、补丁版本号。 主版本号&#xff1a;一般依赖包发生重大更新时&#xff0c;主版本号才回发生变化&#xff0c;如Vue2.x到Vue3.x。次版本号&#xff1a;当依赖包中发生了一些小变化&#xff…...

css前端面试题

1.什么是css盒子模型&#xff1f; 盒子模型包含了元素内容&#xff08;content&#xff09;、内边距&#xff08;padding&#xff09;、边框&#xff08;border&#xff09;、外边距&#xff08;margin&#xff09;几个要素。 标准盒子模型和IE盒子模型的区别在于其对元素的w…...

Vue从零到实战

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…...

【Chatgpt大语言模型医学领域中如何应用】

随着人工智能技术 AI 的不断发展和应用&#xff0c;ChatGPT 作为一种强大的自然语言处理技术&#xff0c;无论是 自然语言处理、对话系统、机器翻译、内容生成、图像生成&#xff0c;还是语音识别、计算机视觉等方面&#xff0c;ChatGPT 都有着广泛的应用前景。特别在临床医学领…...

ES6 正则的扩展(十九)

1. 正则表达式字面量改进 特性&#xff1a;在 ES6 中&#xff0c;正则表达式字面量允许在字符串中使用斜杠&#xff08;/&#xff09;作为分隔符。 用法&#xff1a;简化正则表达式的书写。 const regex1 /foo/; const regex2 /foo/g; // 全局搜索2. u 修饰符&#xff08;U…...

<数据集>钢铁缺陷检测数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;1800张 标注数量(xml文件个数)&#xff1a;1800 标注数量(txt文件个数)&#xff1a;1800 标注类别数&#xff1a;6 标注类别名称&#xff1a;[crazing, patches, inclusion, pitted_surface, rolled-in_scale, scr…...

Kafka系列之:Kafka存储数据相关重要参数理解

Kafka系列之:Kafka存储数据相关重要参数理解 一、log.segment.bytes二、log.retention.bytes三、日志段四、log.retention.check.interval.ms五、数据底层文件六、index、log、snapshot、timeindex、leader-epoch-checkpoint、partition.metadata一、log.segment.bytes 参数lo…...

Template execution failed: ReferenceError: name is not defined

问题 我们使用了html-webpack-plugin&#xff08;webpack&#xff09;进行编译html&#xff0c;导致的错误。 排查结果 连接地址 html-webpack-plugin版本低(2.30.1)&#xff0c;html模板里面不能有符号&#xff0c;注释都不行 // var reg new RegExp((^|&)${name}([^&…...

CVE-2024-24549 Apache Tomcat - Denial of Service

https://lists.apache.org/thread/4c50rmomhbbsdgfjsgwlb51xdwfjdcvg Apache Tomcat输入验证错误漏洞&#xff0c;HTTP/2请求的输入验证不正确&#xff0c;会导致拒绝服务&#xff0c;可以借助该漏洞攻击服务器。 https://mvnrepository.com/artifact/org.apache.tomcat.embed/…...

Linux下如何安装配置Graylog日志管理工具

Graylog是一个开源的日志管理工具&#xff0c;可以帮助我们收集、存储和分析大量的日志数据。它提供了强大的搜索、过滤和可视化功能&#xff0c;可以帮助我们轻松地监控系统和应用程序的运行情况。 在Linux系统下安装和配置Graylog主要包括以下几个步骤&#xff1a; 准备安装…...

「MQTT over QUIC」与「MQTT over TCP」与 「TCP 」通信测试报告

一、结论 在实车5G测试中「MQTT Over QUIC」整体表现优于「TCP」&#xff0c;可在系统架构升级时采用MQTT Over QUIC替换原有的TCP通讯&#xff1b;从实现原理上基于QUIC比基于TCP在弱网、网络抖动导致频繁重连场景延迟更低。 二、测试方案 网络类型&#xff1a;实车5G、实车…...

获取磁盘剩余容量-----c++

获取磁盘剩余容量 #include <filesystem>struct DiskSpaceInfo {double total;double free;double available; };DiskSpaceInfo getDiskSpace(const std::string& path) {std::filesystem::space_info si std::filesystem::space(path);DiskSpaceInfo info;info.…...

AI算法24-决策树C4.5算法

目录 决策树C4.5算法概述 决策树C4.5算法简介 决策树C4.5算法发展历史 决策树C4.5算法原理 信息熵&#xff08;Information Entropy&#xff09; 信息增益&#xff08;Information Gain&#xff09; 信息增益比&#xff08;Gain Ratio&#xff09; 决策树C4.5算法改进 …...

【云原生】Prometheus整合Alertmanager告警规则使用详解

目录 一、前言 二、Altermanager概述 2.1 什么是Altermanager 2.2 Altermanager使用场景 三、Altermanager架构与原理 3.1 Altermanager使用步骤 3.2 Altermanager工作机制 3.3 Altermanager在Prometheus中的位置 四、Altermanager部署与接入Prometheus 4.1 Altermana…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...