golang使用net/rpc库实现rpc

 更新时间:2024年01月14日 10:35:52   作者:lianxuhanshu_  
这篇文章主要为大家详细介绍了golang如何使用net/rpc库实现rpc,文章的示例代码讲解详细,具有一定的借鉴价值,需要的小伙伴可以参考一下

项目左侧包结构

rpc服务端实现

使用golang官方的net/rpc库实现RPC方法,使用http作为RPC的载体,通过http/net包监听客户端连接请求。

rpc服务端实现代码serverrpc.go如下

package main
 
import (
	"errors"
	"fmt"
	"log"
	"net"
	"net/http"
	"net/rpc"
	"os"
)
 
// 运算结构体
type Arith struct {
}
 
// 运算请求结构体
type ArithRequest struct {
	A int
	B int
}
 
// 运算响应结构体
type ArithResponse struct {
	Pro int  //product 表示乘积
	Quo int  //quotient 表示商
	Rem int  //remaind 表示余数
}
 
/*
	运算结构体的乘法运算方法
	第一个参数只需要拿到其里面的值只需要传一个结构体即可,
	第二个参数需要将运算结果存到其里面所以需要传地址
*/
func (this *Arith) Multiply(req ArithRequest, res *ArithResponse) error {
	res.Pro = req.A * req.B
	return nil
}
 
/*
	运算结构体的除法运算方法 
	第一个参数只需要拿到其里面的值只需要传一个结构体即可,
	第二个参数需要将运算结果存到其里面所以需要传地址
*/ 
func (this *Arith) Divide(req ArithRequest, res *ArithResponse) error {
	if req.B == 0 {  //除法为0,运算不合法
		return errors.New("divide by zero")
	}
	res.Quo = req.A / req.B
	res.Rem = req.A % req.B
	return nil
}
func main() {
	rpc.Register(new(Arith)) //注册rpc服务
	rpc.HandleHTTP()         //采用http作为rpc的载体
 
	lis, err := net.Listen("tcp", "127.0.0.1:8090") //Listen是block(阻塞的)
	if err != nil {
		log.Fatalln("fatal error:", err)
	}
	fmt.Fprintf(os.Stdout, "%s", "start connection")
	http.Serve(lis, nil) //net.Listen是阻塞的,需要通过这里进行启动
}

rpc客户端实现

上述服务端程序运行之后,将会监听本地的8090端口,我们可以实现一个客户端程序,连接服务端并且实现RPC方法调用。

rpc客户端实现代码clientrpc.go如下

package main
 
import (
	"fmt"
	"log"
	"net/rpc"
)
 
// 算数运算请求结构体
type ArithRequest struct {
	A int
	B int
}
 
// 算数运算响应结构体
type ArithResponse struct {
	Pro int  //product 乘积
	Quo int  //quotient 商
	Rem int  //remain 余数
}
 
func main() {
	//通过网络实现rpc远程进程调用
	conn, err := rpc.DialHTTP("tcp", "127.0.0.1:8090") 
	if err != nil {
		log.Fatalln("dailing error", err)
	}
 
	req := ArithRequest{9, 2}  //请求结构体
	var res ArithResponse    //响应结构体,用于存储运算结果
 
	//实现rpc之后,通过Call方法在客户端调用服务端里面算数运算结构体的乘法运算方法
	err = conn.Call("Arith.Multiply", req, &res)
	if err != nil {
		log.Fatalln("arith error", err)
	}
	fmt.Printf("%d * %d = %d\n", req.A, req.B, res.Pro)
 
	//实现rpc之后,通过Call方法在客户端调用服务端里面算数运算结构体的除法运算方法
	err = conn.Call("Arith.Divide", req, &res)
	if err != nil {
		log.Fatalln("arith error", err)
	}
	fmt.Printf("%d / %d, quo is %d, rem is %d\n", req.A, req.B, res.Quo, res.Rem)
}

详细实现步骤

1.首先初始化项目

go mod init pro01  //pro01表示项目名称

2.在当前项目下新建包server,并且在该包下面新建serverrpc.go实现rpc服务端

3.在当前项目下新建包client,并且在该包下面新建clientrpc.go实现rpc客户端

4.运行rpc服务端程序 ,首先进入server包,然后运行serverrpc.go

cd server
go run serverrpc.go

5.运行rpc客户端程序,首先进入client包,然后运行clientrpc.go

cd client
go run clientrpc.go

6.查看输出结果是否正确,输出结果如下表示程序运行结果正确,当然我这里的结果是根据我在请求结构体里面给出的俩个数值进行计算的,具体结果是否正确根据自己的具体程序判断。

总结

通过官方库net/rpc实现rpc远程进程调用非常方便,并且实现还是比较简单的,但是有一个缺点就是不能跨平台。 

到此这篇关于golang使用net/rpc库实现rpc的文章就介绍到这了,更多相关go rpc内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • go1.21中slog日志包用法入门

    go1.21中slog日志包用法入门

    go1.21中,slog这一被Go语言团队精心设计的结构化日志包正式落地,本文将带领读者上手slog,体会其与传统log的差异,感兴趣的小伙伴快跟随小编一起学习一下吧
    2023-09-09
  • 一文带你了解Golang中select的实现原理

    一文带你了解Golang中select的实现原理

    select是go提供的一种跟并发相关的语法,非常有用。本文将介绍 Go 语言中的 select 的实现原理,包括 select 的结构和常见问题、编译期间的多种优化以及运行时的执行过程
    2023-02-02
  • Go语言使用HTTP包创建WEB服务器的方法

    Go语言使用HTTP包创建WEB服务器的方法

    这篇文章主要介绍了Go语言使用HTTP包创建WEB服务器的方法,结合实例形式分析了Go语言基于HTTP包创建WEB服务器客户端与服务器端的实现方法与相关注意事项,需要的朋友可以参考下
    2016-07-07
  • 基于Golang实现Redis分布式锁解决秒杀问题

    基于Golang实现Redis分布式锁解决秒杀问题

    这篇文章主要给大家介绍了使用Golang实现Redis分布式锁解决秒杀问题,文中有详细的代码示例供大家参考,具有一定的参考价值,需要的朋友可以参考下
    2023-08-08
  • go语言实现mqtt协议的实践

    go语言实现mqtt协议的实践

    MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。本文主要介绍了go语言实现mqtt协议的实践,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • 线上golang grpc服务资源泄露问题排查

    线上golang grpc服务资源泄露问题排查

    这篇文章主要介绍了线上golang grpc服务资源泄露问题排查,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Golang 基础之函数使用(匿名递归闭包)实例详解

    Golang 基础之函数使用(匿名递归闭包)实例详解

    这篇文章主要为大家介绍了Golang 基础之函数使用(匿名递归闭包)实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • 构建Golang应用最小Docker镜像的实现

    构建Golang应用最小Docker镜像的实现

    这篇文章主要介绍了构建Golang应用最小Docker镜像的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • Golang 限流器的使用和实现示例

    Golang 限流器的使用和实现示例

    这篇文章主要介绍了Golang 限流器的使用和实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • 如何组织Go代码目录结构依赖注入wire使用解析

    如何组织Go代码目录结构依赖注入wire使用解析

    这篇文章主要为大家介绍了如何组织Go代码目录结构依赖注入wire使用解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07

最新评论