【Go系列】RPC和grpc
承上启下
介绍完了Go怎么实现RESTFul api,不可避免的,今天必须得整一下rpc这个概念。rpc是什么呢,很多人都想把rpc和http一起对比,但是他们不是一个概念。RPC是一种思想,可以基于tcp,可以基于udp也可以基于http。我们详细学习下把。
开始学习
RPC,听起来是不是有点像“人品差”?别误会,这里的RPC可是“远程过程调用”的缩写,它可是一个让我们的代码能够隔空打牛、远程操控的神奇技能!
什么是RPC?
简单来说,RPC就是让你在本地调用一个函数,却能够远程执行另一台机器上的代码。想象一下,你在家里的沙发上按了一个遥控器,结果远在千里之外的咖啡机开始给你煮咖啡,是不是很神奇?RPC就是这么个神奇的“遥控器”。
Go如何实现RPC?
在Go语言中,实现RPC就跟泡方便面一样简单。以下是泡面的步骤:
- 准备调料包(定义服务):首先,你需要定义一个服务,也就是你的远程函数。这就像把调料包准备好,等着加水泡。
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的工作流程
-
定义服务:使用Protocol Buffers定义服务接口和消息类型。
syntax = "proto3";service YourService {rpc YourMethod (YourRequest) returns (YourResponse); }message YourRequest {// request fields }message YourResponse {// response fields }
-
生成代码:使用Protocol Buffers编译器
protoc
生成服务端和客户端的代码。protoc --go_out=plugins=grpc:. your_service.proto
-
实现服务端:实现生成的服务端接口。
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)} }
-
实现客户端:使用生成的客户端代码调用服务。
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时,dom元素会被删除达到隐藏效果 <div class"boxIf" v-if"flag"></div>v-for用来进行遍历,可以遍历数字对象数组,会将整个元素遍历指定次数 <!-- 遍…...

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

数据库系统概论:数据库系统的锁机制
引言 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,数据作为一种共享资源,其并发访问的一致性和有效性是数据库必须解决的问题。锁机制通过对数据库中的数据对象(如表、行等)进行加锁,以确保在同…...
Django+vue自动化测试平台(28)-- ADB获取设备信息
概述 adb的全称为Android Debug Bridge,就是起到调试桥的作用。通过adb可以在Eclipse中通过DDMS来调试Android程序,说白了就是调试工具。 adb的工作方式比较特殊,采用监听Socket TCP 5554等端口的方式让IDE和Qemu通讯,默认情况下…...

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下载的依赖包版本号怎么看 版本号一般分三个部分,主版本号、次版本号、补丁版本号。 主版本号:一般依赖包发生重大更新时,主版本号才回发生变化,如Vue2.x到Vue3.x。次版本号:当依赖包中发生了一些小变化ÿ…...
css前端面试题
1.什么是css盒子模型? 盒子模型包含了元素内容(content)、内边距(padding)、边框(border)、外边距(margin)几个要素。 标准盒子模型和IE盒子模型的区别在于其对元素的w…...

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

【Chatgpt大语言模型医学领域中如何应用】
随着人工智能技术 AI 的不断发展和应用,ChatGPT 作为一种强大的自然语言处理技术,无论是 自然语言处理、对话系统、机器翻译、内容生成、图像生成,还是语音识别、计算机视觉等方面,ChatGPT 都有着广泛的应用前景。特别在临床医学领…...
ES6 正则的扩展(十九)
1. 正则表达式字面量改进 特性:在 ES6 中,正则表达式字面量允许在字符串中使用斜杠(/)作为分隔符。 用法:简化正则表达式的书写。 const regex1 /foo/; const regex2 /foo/g; // 全局搜索2. u 修饰符(U…...

<数据集>钢铁缺陷检测数据集<目标检测>
数据集格式:VOCYOLO格式 图片数量:1800张 标注数量(xml文件个数):1800 标注数量(txt文件个数):1800 标注类别数:6 标注类别名称:[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(webpack)进行编译html,导致的错误。 排查结果 连接地址 html-webpack-plugin版本低(2.30.1),html模板里面不能有符号,注释都不行 // var reg new RegExp((^|&)${name}([^&…...

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

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

「MQTT over QUIC」与「MQTT over TCP」与 「TCP 」通信测试报告
一、结论 在实车5G测试中「MQTT Over QUIC」整体表现优于「TCP」,可在系统架构升级时采用MQTT Over QUIC替换原有的TCP通讯;从实现原理上基于QUIC比基于TCP在弱网、网络抖动导致频繁重连场景延迟更低。 二、测试方案 网络类型:实车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算法原理 信息熵(Information Entropy) 信息增益(Information Gain) 信息增益比(Gain Ratio) 决策树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…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...