当前位置: 首页 > 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…...

C++ :友元类

友元类的概念和使用 (1)将类A声明为B中的friend class后&#xff0c;则A中所有成员函数都成为类B的友元函数了 (2)代码实战&#xff1a;友元类的定义和使用友元类是单向的 (3)友元类是单向的&#xff0c;代码实战验证 互为友元类 (1)2个类可以互为友元类&#xff0c;代码实战…...

【整理了一些关于使用swoole使用的解决方案】

目录 如何监控和分析 Swoole 服务器的性能瓶颈&#xff1f; 在进行 Swoole 服务器性能优化时&#xff0c;有哪些常见的错误和陷阱需要避免&#xff1f; 除了 Swoole&#xff0c;还有哪些 PHP 框架或技术可以用于构建高并发的 Web 应用&#xff1f; Swoole 同步请求在高并发…...

python selenium4 EdgeDriver动态页面爬取

截止至2024.7.16 chrome浏览器最新版本为126.0.6478.127 但对应的chromeDriver版本都低于此版本&#xff0c;因此&#xff0c;转用Edge浏览器 说明&#xff1a;仅记录自己使用过程中用到的一些代码和感受&#xff0c;看具体情况不定期更新。 selenium官方文档 1、安装selen…...

【一次记一句:SQL】从 information_schema.TABLES中查询数据库表中记录数据量

有时候&#xff0c;一张千万数据量的表&#xff0c;使用 count(*) 统计记录数&#xff0c;查不动。可以使用下述SQL来试试&#xff1a; SELECT CONCAT(table_schema, ., table_name) AS "Table Name", table_rows AS "Number of Rows", CONCAT(ROUND(data…...

NXP i.MX8系列平台开发讲解 - 3.19 Linux TTY子系统(二)

专栏文章目录传送门&#xff1a;返回专栏目录 Hi, 我是你们的老朋友&#xff0c;主要专注于嵌入式软件开发&#xff0c;有兴趣不要忘记点击关注【码思途远】 目录 1. Linux 串口驱动 1.1 Uart 驱动注册流程 1.2 uart 操作函数 1.3 line discipline 2. Linux tty应用层使用…...

FPGA资源容量

Kintex™ 7 https://www.amd.com/zh-tw/products/adaptive-socs-and-fpgas/fpga/kintex-7.html#product-table AMD Zynq™ 7000 SoC https://www.amd.com/en/products/adaptive-socs-and-fpgas/soc/zynq-7000.html#product-table AMD Zynq™ UltraScale™ RFSoC 第一代 AMD Z…...

Zabbix介绍和架构

目录 一.Zabbix简介 1.为什么需要监控 2.需要监控什么 3.常见的监控工具 4.Zabbix使用场景及系统概述 5.Zabbix 架构 6.Zabbix工作流程 7.Zabbix 术语 二. 部署安装zabbix 三.zabbix 配置文件 一.Zabbix简介 1.为什么需要监控 运维行业有句话:“无监控、不运维”&am…...

打造智慧图书馆:AI视频技术助力图书馆安全与秩序管理

一、背景需求 随着信息技术的飞速发展&#xff0c;图书馆作为重要的知识传播场所&#xff0c;其安全管理也面临着新的挑战。为了确保图书馆内书籍的安全、维护读者的阅读环境以及应对突发事件&#xff0c;TSINGSEE青犀旭帆科技基于EasyCVR视频监控汇聚平台技术与AI视频智能分析…...

Go的数据结构与实现【LinkedList】

介绍 所谓链表&#xff08;Linked List&#xff09;&#xff0c;就是按线性次序排列的一组数据节点。每个节点都是一个对象&#xff0c;它通过一个引用指向对应的数据元素&#xff0c;同时还通过一个引用next指向下一节点。 实现 逻辑方法 我们定义链表的结构体&#xff1a…...

Ubuntu22.04安装CUDA+CUDNN+Conda+PyTorch

步骤&#xff1a; 1、安装显卡驱动&#xff1b; 2、安装CUDA&#xff1b; 3、安装CUDNN&#xff1b; 4、安装Conda&#xff1b; 5、安装Pytorch。 一、系统和硬件信息 1、Ubuntu 22.04 2、显卡&#xff1a;4060Ti 二、安装显卡驱动 &#xff08;已经安装的可以跳过&a…...

企业邮箱格式怎么填写才正确/深圳网站seo

刷题路线参考&#xff1a; https://github.com/chefyuan/algorithm-base https://github.com/youngyangyang04/leetcode-master 大家好&#xff0c;我是靠写博客督促自己刷题的老三&#xff0c;这一节我们对线栈和队列。 栈和队列基础 在正式开刷之前&#xff0c;我们先了解一…...

杭州app定制/关键词排名优化工具有用吗

隐藏index.php 一、codeigniter codeigniter和许多php框架一样&#xff0c;有个单一入口index.php,从url上看&#xff0c;显得很不友好。通过apache的rewirte&#xff0c;是可以隐藏掉的&#xff0c;实现伪url。 打开codeigniter下system\application\config中的config.php …...

地板网站建设方案/湖南广告优化

Stencil buffer(模板缓冲区)用于控制哪些区域可以绘制对象&#xff0c;哪些对象不能绘制对象。如果通过了模板测试&#xff0c;则正常绘制对象&#xff1b;如果没有通过&#xff0c;则不能绘制。 &#xff08;1&#xff09;Stencil buffers首先需要启动Test&#xff1b; &#…...

wordpress laravel 共存/中山网站建设

栈空间 栈空间是从高地址向低地址扩充&#xff0c;堆地址是从低地址向高地址扩充。 堆栈是一种具有一定规则的数据结构&#xff0c;我们可以按照一定的规则进行添加和删除数据。它使用的是后进先出的原则。在x86等汇编集合中堆栈与弹栈的操作指令分别为&#xff1a; PUSH&…...

有了域名 怎么做网站/南昌seo网站推广

推荐一个国内漏洞研究技术比较厉害的blog&#xff0c;其blog地址为&#xff1a;(1)[url]http://shineast.yo2.cn/[/url](2)[url]http://hi.baidu.com/shineastdh [/url]...

电子产品东莞网站建设/天津seo网络

由于一些嵌套特别深的数据&#xff0c;导致数据更新了。UI没有更新&#xff08;连深度监听都没有监听到&#xff09;&#xff0c;我捉摸着有没有和react一样的立即更新UI的API呢 this.forceUpdate()呢&#xff1f;结果还真有&#xff1a; this.$forceUpdate(); 转载于:https://…...