Go RPC 和 gRPC 技术详解

引言

在分布式系统中,服务之间的通信是非常重要的组成部分。远程过程调用 (RPC) 是一种广泛使用的通信方式,它允许程序在不同的计算机上执行函数或过程,就像调用本地函数一样。随着微服务架构的流行,RPC 成为了连接各个服务的重要桥梁。本文将探讨 Go 语言中的 RPC 以及它的高级版本 gRPC。

什么是 RPC?

RPC 是一种协议,它允许客户端程序调用远程服务器上的函数或方法,而无需了解底层网络细节。通常,客户端和服务器通过网络通信,并且需要一种方式来序列化和反序列化数据。

特点

  • 透明性:客户端像调用本地函数一样调用远程函数。
  • 简单性:客户端不需要了解底层网络协议。
  • 安全性:可以通过加密和认证等手段保证通信的安全。

Go 语言中的标准 RPC

Go 提供了内置的支持来实现 RPC,主要通过 net/rpc 包。它支持多种序列化方式,包括 JSON 和 XML。

客户端示例

package mainimport ("log""net/rpc"
)func main() {client, err := rpc.DialHTTP("tcp", "localhost:1234")if err != nil {log.Fatal("dialing:", err)}defer client.Close()var reply interr = client.Call("Arith.Multiply", &ArithArgs{7, 8}, &reply)if err != nil {log.Fatal("arith error:", err)}log.Printf("Arith: %d", reply)
}

服务器端示例

package mainimport ("log""net/rpc""net/rpc/jsonrpc"
)type Arith intfunc (t *Arith) Multiply(args *ArithArgs, reply *int) error {*reply = args.A * args.Breturn nil
}type ArithArgs struct {A, B int
}func main() {server := rpc.NewServer()server.Register(new(Arith))listener, err := net.Listen("tcp", ":1234")if err != nil {log.Fatal("listening:", err)}for {conn, err := listener.Accept()if err != nil {log.Fatal("accepting:", err)}go jsonrpc.ServeConn(conn)}
}

gRPC

gRPC 是 Google 开发的一个高性能、开源和通用的 RPC 框架。它基于 HTTP/2 协议,提供了流式通信、消息压缩等功能。

为什么选择 gRPC?

  • 高效:使用 Protocol Buffers 作为默认的序列化方式。
  • 流式传输:支持双向流式传输。
  • 丰富的功能:支持认证、负载均衡等。
  • 广泛的客户端支持:支持多种编程语言。

gRPC 的工作流程

  1. 定义服务:使用 .proto 文件定义服务接口。
  2. 生成代码:使用 Protocol Buffers 编译器生成服务的存根代码。
  3. 实现服务:编写服务的具体逻辑。
  4. 客户端调用:客户端通过 gRPC 存根调用远程服务。

gRPC 示例

定义服务
syntax = "proto3";service CalculatorService {rpc Add (AddRequest) returns (AddResponse);
}message AddRequest {int32 x = 1;int32 y = 2;
}message AddResponse {int32 sum = 1;
}
实现服务
package mainimport ("context""log""net"pb "path/to/your/proto/package""google.golang.org/grpc"
)type server struct{}func (s *server) Add(ctx context.Context, in *pb.AddRequest) (*pb.AddResponse, error) {sum := in.GetX() + in.GetY()return &pb.AddResponse{Sum: sum}, nil
}func main() {lis, err := net.Listen("tcp", ":50051")if err != nil {log.Fatalf("failed to listen: %v", err)}s := grpc.NewServer()pb.RegisterCalculatorServiceServer(s, &server{})if err := s.Serve(lis); err != nil {log.Fatalf("failed to serve: %v", err)}
}
客户端
package mainimport ("context""log""time"pb "path/to/your/proto/package""google.golang.org/grpc"
)func main() {conn, err := grpc.Dial(":50051", grpc.WithInsecure())if err != nil {log.Fatalf("did not connect: %v", err)}defer conn.Close()client := pb.NewCalculatorServiceClient(conn)ctx, cancel := context.WithTimeout(context.Background(), time.Second)defer cancel()r, err := client.Add(ctx, &pb.AddRequest{X: 2, Y: 2})if err != nil {log.Fatalf("could not add: %v", err)}log.Printf("Sum: %d", r.Sum)
}

结论

无论是传统的 RPC 还是新的 gRPC,在 Go 语言中实现远程服务调用都变得非常简单。gRPC 以其高性能和丰富的功能集成为分布式系统中的首选方案。

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

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

相关文章

协作新选择:即时白板在线白板软件分享

在团队合作中,产品经理扮演着至关重要的角色,他们不仅是产品与用户之间的纽带,更是产品性能和用户需求的桥梁。他们需要深入参与产品的研发过程,并与研发团队保持紧密的沟通。因此,产品经理需要一款高效的协作工具来提…

arthas源码刨析:arthas 命令粗谈(3)

文章目录 dashboardwatchretransform 前面介绍了 arthas 启动相关的代码并聊了聊怎么到一个 shellserver 的建立。 本篇我们来探讨一下几个使用频次非常高的命令是如何实现的。 dashboard 想看这个命令的主要原因是编程这些年来从来没有开发过 terminal 的这种比较花哨的界面&a…

php生成json字符串,python解析json字符串

<?php $nodes []; $_tmp[title] 标题1; $_tmp[titlekey] actt; $_tmp[child] [acww.zip, acww21.zip, tta.zip]; $nodes[] $_tmp;$_tmp2[title] 标题2; $_tmp2[titlekey] kfij; $_tmp2[child] [KL7SHR47.zip, fdgfdg.zip, qweqw.zip]; $nodes[] $_tmp2;// 构建调用…

SpringBoot集成kafka-获取生产者发送的消息(阻塞式和非阻塞式获取)

说明 CompletableFuture对象需要的SpringBoot版本为3.X.X以上&#xff0c;需要的kafka依赖版本为3.X.X以上&#xff0c;需要的jdk版本17以上。 1、阻塞式&#xff08;等待式&#xff09;获取生产者发送的消息 生产者&#xff1a; package com.power.producer;import org.ap…

【html+css 绚丽Loading】 000014 三元波动盘

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽Loading&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495…

JVM系列--初始JVM

根据《黑马程序员JVM虚拟机入门到实战全套视频教程》整理 1 什么是JVM JVM 全称是 Java Virtual Machine&#xff0c;中文译名 Java虚拟机。JVM 本质上是一个运行在计算机上的程序&#xff0c;他的职责是运行Java字节码文件。 Java源代码执行流程如下&#xff1a; 分为三个步…

代码随想录day52 101孤岛的总面积 102沉没孤岛 103水流问题 104建造最大岛屿

代码随想录day52 101孤岛的总面积 102沉没孤岛 103水流问题 104建造最大岛屿 101孤岛的总面积 代码随想录 #include <iostream> #include <vector>using namespace std; int count 0; int dir[4][2] {{1, 0}, {0, 1}, {-1 ,0}, {0, -1}};void dfs(vector<v…

书生大模型实战营第三期基础岛第二课——8G 显存玩转书生大模型 Demo

8G 显存玩转书生大模型 Demo 基础任务进阶作业一&#xff1a;进阶作业二&#xff1a; 基础任务 使用 Cli Demo 完成 InternLM2-Chat-1.8B 模型的部署&#xff0c;并生成 300 字小故事&#xff0c;记录复现过程并截图。 创建conda环境 # 创建环境 conda create -n demo pytho…

[Meachines] [Easy] Legacy nmap 漏洞扫描脚本深度发现+MS08-067

信息收集 IP AddressOpening Ports10.10.10.4TCP:135,139,445 $ nmap -p- 10.10.10.4 --min-rate 1000 -sC -sV -Pn PORT STATE SERVICE VERSION 135/tcp open msrpc Microsoft Windows RPC 139/tcp open netbios-ssn Microsoft Windows n…

Docker私人学习笔记

俗话说“好记性不如烂笔头”&#xff0c;编程的海洋如此的浩大&#xff0c;养成做笔记的习惯是成功的一步&#xff01; 此笔记主要是antlr4.13版本的笔记&#xff0c;并且笔记都是博主自己一字一字编写和记录&#xff0c;有错误的地方欢迎大家指正。 一、基础概念&#xff1a;…

Tomcat 服务器详解与优化实践

文章目录 Tomcat 服务器详解与优化实践一、Tomcat 简介1.1 什么是 Tomcat1.2 Tomcat 的核心组件1.3 什么是 Servlet 和 JSP 二、Tomcat 的核心组件结构2.1 Connector2.2 Container2.3 Tomcat 请求处理过程 三、Tomcat 服务部署3.1 安装准备3.2 安装 JDK3.3 安装和启动 Tomcat3.…

Java二十三种设计模式-责任链模式(17/23)

责任链模式&#xff1a;实现请求处理的灵活流转 引言 在这篇博客中&#xff0c;我们深入探讨了责任链模式的精髓&#xff0c;从其定义和用途到实现方法&#xff0c;再到使用场景、优缺点、与其他模式的比较&#xff0c;以及最佳实践和替代方案&#xff0c;旨在指导开发者如何…

SAP BW:QUERY数据结果写入ADSO

作者 idan lian 如需转载备注出处 如果对你有帮助&#xff0c;请点赞收藏~~~ 需求背景 客户基于QUERY进行报表展示&#xff0c;现需迁移到永洪报表平台&#xff0c;query中的变量参数&#xff0c;公式等无法直接生成视图&#xff0c;query相对复杂&#xff0c;不想直接在视图…

笔记mybatisplus

MP入门 Mybatis-Plus&#xff08;简称MP&#xff09;是一个Mybatis的增强工具&#xff0c;在Mybatis的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 Mybatis-Plus已经封装好了大量增删改查的方法&#xff0c;程序员只需要继承BaseMapper就可以使用这些方法…

大模型从入门到实战——RAG理解

大模型从入门到实战之RAG 1. 什么是 RAG 检索增强生成&#xff08;RAG, Retrieval-Augmented Generation&#xff09; 是一种创新的模型架构&#xff0c;旨在提升大型语言模型&#xff08;LLM&#xff09;的性能和输出质量。尽管 LLM 在许多自然语言处理任务中表现出色&#…

Linux阿里云服务器,利用docker安装EMQX

第一步&#xff0c;给云服务器docker进行加速 阿里云搜索“镜像加速器”&#xff0c;找到下面这个菜单&#xff0c;点进去 然后找到镜像工具下的镜像加速器 把这个加速器地址复制 然后在自己的云服务器中&#xff0c;找到docker的文件夹 点击json配置文件 把地址修改为刚刚…

如何将LaTeX数学公式嵌入到PowerPoint中

如何将LaTeX数学公式嵌入到PowerPoint中 简介 在学术演示或技术报告中&#xff0c;清晰且专业地展示数学公式是至关重要的。PowerPoint虽然提供了一些基本的公式编辑功能&#xff0c;但如果你需要更复杂或格式严格的公式&#xff0c;使用LaTeX生成公式并嵌入到PPT中是一个极佳…

Python酷库之旅-第三方库Pandas(092)

目录 一、用法精讲 391、pandas.Series.hist方法 391-1、语法 391-2、参数 391-3、功能 391-4、返回值 391-5、说明 391-6、用法 391-6-1、数据准备 391-6-2、代码示例 391-6-3、结果输出 392、pandas.Series.to_pickle方法 392-1、语法 392-2、参数 392-3、功能…

KT来袭,打造沉浸式体验的聚合性web3应用平台

随着步入 2024&#xff0c;漫长的区块链熊市即将接近尾声。纵观产业发展&#xff0c;逆流而上往往会是彰显品牌市场影响力和技术实力的最佳证明。在这次周期中&#xff0c;一个名为KT的web3.0聚合平台吸引了市场关注&#xff0c;无论在市场层面还是技术层面&#xff0c;都广泛赢…

听劝❗用AI做职场思维导图仅仅需要几秒钟啊

本文由 ChatMoney团队出品 嘿&#xff0c;各位职场朋友们 是不是常常对着密密麻麻的笔记感到焦虑呢&#xff1f; 想整理却无从下手&#xff1f; 别怕&#xff0c;ChatmoneyAI知识库来拯救你的整理困难症啦&#xff01; 咱们都知道&#xff0c;思维导图是职场中必备的神器 …