go rpc

运用go标准库写一个rpc例子

服务端

package mainimport ("fmt""net""net/rpc"
)//对象
type Hello struct {
}
//对象方法
func (h *Hello) HelloWorld(name string, resp *string) error {*resp = name + "你好"return nil
}func main() {//1. 注册RPC服务,绑定对象方法;这里采用的是默认的rpc对象err := rpc.RegisterName("hello", new(Hello))if err != nil {fmt.Println("rpc RegisterName error")return}//2. 初始化监听器listener, err := net.Listen("tcp", "127.0.0.1:8800")if err != nil {fmt.Println("net Listen error")return}defer listener.Close()//3.建立连接conn, err := listener.Accept()if err != nil {fmt.Println("listener Accept error")return}defer conn.Close()//4.将连接绑定rpc服务rpc.ServeConn(conn)
}

注意绑定的对象方法,必须有两个参数,第二个参数必须是“指针类型”为传出参数。方法只有一个error类型的返回值。

客户端

package mainimport ("fmt""net/rpc"
)func main() {//建立连接conn, err := rpc.Dial("tcp", "127.0.0.1:8800")if err != nil {fmt.Println("rpc Dial error")return}defer conn.Close()//调用远程函数var resp stringerr = conn.Call("hello.HelloWorld", "李白", &resp)if err != nil {fmt.Println("conn Call error")return}fmt.Println(resp)
}

注意:上面代码中rpc的远程函数调用采用的是golang中特有的序列化包gob,其他语音不能解析。所以,要进行不同语言之间的rpc通信可以采用通用的序列化方式,如json,protobuf

然后,在实际运用中都会对服务端和客户端的再进行封装:
在这里插入图片描述
在这里插入图片描述

protobuf添加rpc服务

在这里插入图片描述
此时使用的protobuf编译指令,将定义好的proto规则和rpc服务生成go代码,需要用到的是grpc

protoc --go_out=. *.proto
protoc --go-grpc_out=. *.proto

举例:
定义proto文件,然后用上面两个命令生成go代码

syntax="proto3";package pb;//option go_package = "path;name"; path 表示生成的go文件的存放地址,会自动生成目录的
// name 表示生成的go文件所属的包名
option go_package=".;pb";message HelloRequest {string requestName = 1;
}message HelloResponse {string responseMsg = 1;
}service Hello{rpc SayHello(HelloRequest) returns (HelloResponse);
}

服务端:

package mainimport ("context""fmt""google.golang.org/grpc""net""rpc_day01/pb"
)type My struct {pb.UnimplementedHelloServer //必须嵌套这个
}func (m *My) SayHello(c context.Context, req *pb.HelloRequest) (*pb.HelloResponse, error) {var resp pb.HelloResponseresp.ResponseMsg = req.RequestName + " hello !!"return &resp, nil
}func main() {//1 初始化一个gpc对象grpcServer := grpc.NewServer()//2 注册服务pb.RegisterHelloServer(grpcServer, &My{})//3 设置监听,指定IPlistener, err := net.Listen("tcp", "127.0.0.1:8801")if err != nil {fmt.Println("net Listen error")return}defer listener.Close()//4 启动服务grpcServer.Serve(listener)
}

客户端:

package mainimport ("context""fmt""google.golang.org/grpc""google.golang.org/grpc/credentials/insecure""log""rpc_day01/pb"
)func main() {//连接grpc服务(无加密)conn, err := grpc.Dial("127.0.0.1:8801", grpc.WithTransportCredentials(insecure.NewCredentials()))if err != nil {log.Fatal(err)}defer conn.Close()//初始化grpc客户端grpcClient := pb.NewHelloClient(conn)resp, err := grpcClient.SayHello(context.Background(), &pb.HelloRequest{RequestName: "李白"})if err != nil {log.Fatal(err)}fmt.Println(resp.ResponseMsg)
}

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

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

相关文章

赋能道路交通场景,九州未来助力建成广西交科车路协同智能网联示范园区

智慧高速车路协同需要更加稳固的技术基座 智慧高速是中国高速公路建设的热点之一,车路协同又是未来智慧高速建设的核心内容。高速公路运行环境相对简单、主体权责清晰、路侧机电设施齐全,具备开展车路协同创新示范的良好条件。 广西交科集团&#xff0…

编程锦囊妙计——快速创建本地Mock服务

点击上方👆蓝色“Agilean”,发现更多精彩。 前情提要 在本系列上一篇文章《全文干货:打破前后端数据传递鸿沟,高效联调秘笈》中我们分享了使用Zod这一运行时类型校验库来对后端服务响应结果进行验证达到增加项目质量的方式。 这次…

三维重建_体素重建_空间雕刻法/体素着色法

目录 1. 三角化和体素重建的区别 2. 空间雕刻法 空间雕刻法的一致性定义 空间雕刻法具体实现 基于八叉树的空间雕刻法具体实现​编辑 空间雕刻法效果展示 3. 体素着色法 体素着色法的缺点:不唯一性​编辑 体素着色法不唯一性解决措施​编辑 体素着色发实验环境与…

Ansible 自动化安装软件

例子如下: 创建一个名为/ansible/package.yml 的 playbook : 将 php 和 mariadb 软件包安装到 dev、test 和 prod 主机组中的主机上 将 RPM Development Tools 软件包组安装到 dev 主机组中的主机上 将 dev 主机组中主机上的所有软件包更新为最新版本 --- - name:…

Linux系统安全:NAT(SNAT、DNAT)

目录 一.NAT 二.SNAT 三.DNAT 一.NAT NAT: network address translation,支持PREROUTING,INPUT,OUTPUT,POSTROUTING四个链 请求报文:修改源/目标IP, 响应报文:修改源/目标IP,根据…

单片机的串口通信

今天,完整地总结一下普中科技的单片机的串口通信的硬件与编程,记录一下以后如果需要也比较方便捡起来。 单片机的串口部分的电路图。开发板上集成了 1 个串口通信电路,是 USB 转串口模块,它既可下载程序也可实现串口通信功能。 对…

WEB APIs day5

一、window对象 BOM属于window对象 1.BOM(浏览器对象模型) bom里面包含着dom,只不过bom我们平时用得比较少,我们经常使用的是dom操作,因为我们页面中的这些标签都是在dom中取的,所以我们操作dom多一点。 window对象…

python代码——批量将PPT转换成长图

语言:python 3 用法:点击运行后,弹出窗口,选择文件夹,程序运行会将文件夹内的所有PPT文件全部转换成PPT长图,图片名称与PPT文件名称相同,保存位置相同。 如运行中报错,需要自行根据…

如何在Ubuntu 22.04上安装PHP 8.1并设置本地开发环境

引言 PHP是一种流行的服务器脚本语言,用于创建动态和交互式web页面。开始使用你选择的语言是学习编程的第一步。 本教程将指导您在Ubuntu上安装PHP 8.1,并通过命令行设置本地编程环境。您还将安装依赖管理器Composer,并通过运行脚本来测试您…

8.4 【C语言】通过指针引用字符串

8.4.1 字符串的引用方式 在C程序中,字符串是存放在字符数组中的。想引用一个字符串,可以用以下两种方法。 (1)用字符数组存放一个字符串,可以通过数组名和下标引用字符串中一个字符,也可以通过数组名和格…

neo4j

UNWIND 将列表里的值展开 CREATE (N0:Person {name: Anders}) CREATE (N1:Person {name: Becky}) CREATE (N2:Person {name: Cesar}) CREATE (N3:Person {name: Dilshad}) CREATE (N4:Person {name: George}) CREATE (N5:Person {name: Filipa})CREATE (N0)-[:KNOWS]->(N3)…

spark基于HNSW向量检索

参考文档:https://talks.anghami.com/blazing-fast-approximate-nearest-neighbour-search-on-apache-spark-using-hnsw/ HNSW参数调优文档:https://github.com/nmslib/hnswlib/blob/master/ALGO_PARAMS.md spark 运行HNSW向量检索分为以下三步 1 创建H…

VUE初识

vue是一个用于构建用户界面的渐进是框架 优点,大大提高开发效率 缺点,需要记忆语法规则 构建用户界面 创建vue实例,初始化渲染 1:准备容启 2:引包,开发版本和生产版本 3.创建vue实例 new Vue&#x…

mybatis plus 控制台和日志文件中打印sql配置

1 控制台输出sql 配置mybatis-plus的日志实现类为StdOutImpl,该实现类中打印日志是通过System.out.println(s)的方式来打印日志的 mybatis-plus:configuration:log-impl: org.apache.imbatis.logging.stdout.StdOutImpl2 日志文件中写入sql 日志文件中输入sql需要…

分布式事务(4):两阶段提交协议与三阶段提交区别

1 两阶段提交协议 两阶段提交方案应用非常广泛,几乎所有商业OLTP数据库都支持XA协议。但是两阶段提交方案锁定资源时间长,对性能影响很大,基本不适合解决微服务事务问题。 缺点: 如果协调者宕机,参与者没有协调者指…

Solidity 合约安全,常见漏洞 (下篇)

Solidity 合约安全,常见漏洞 (下篇) Solidity 合约安全,常见漏洞 (上篇) 不安全的随机数 目前不可能用区块链上的单一交易安全地产生随机数。区块链需要是完全确定的,否则分布式节点将无法达…

Grafana 安装配置教程

Grafana 安装配置教程 一、介绍二、Grafana 安装及配置2.1 下载2.2 安装2.2.1 windows安装 - 图形界面2.2.2 linux安装 - 安装脚本 三、Grafana的基本配置3.1 登录3.2 Grafana设置中文 四、grafana基本使用 一、介绍 Grafana是一个通用的可视化工具。对于Grafana而言&#xff0…

华为OD-分积木/分苹果

题目描述 哥哥弟弟分一堆积木,每块积木重量不同。弟弟要求平分两组,每组数量可以不同但总重量必须相等。 然而弟弟只会二进制并且加法不进位。例如三块积木 3,5,6 分成两组 [3] 和 [5,6] 弟弟认为 5(二进制1001)加上6&#xff08…

Linux常用命令——dhcrelay命令

在线Linux命令查询工具 dhcrelay 使用dhcrelay命令可以提供中继DHCP和BOOTP请求 补充说明 dhcrelay命令使用dhcrelay命令可以提供中继DHCP和BOOTP请求,从一个没有DHCP服务器的子网直接连接到其它子网内的一个或多个DHCP服务器。该命令在DHCP中继服务器上使用&am…

Docker容器与虚拟化技术:Gitlab账户注册

目录 一、实验 1.gitlab 一、实验 1.gitlab (1) 概念 GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的Web服务。 (2)官网 The DevSecOps Platform | GitLab (3&#…