GO分布式微服务-RPC

本文介绍了Go语言中的RPC基础,包括RPC的概念、入门示例及标准库的使用。通过详细的操作步骤展示了如何在Go中实现RPC服务,包括服务端和客户端的设置。讨论了如何构建更安全的RPC接口,规范服务空间名称,统一接口和调用。同时探讨了跨语言RPC,利用jsonrpc实现不同语言间交互,并展示了如何在HTTP上提供RPC服务,以实现更多元化的调用方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是RPC

rpc是远程过程调用(Remote Procedure Call)的缩写,简单的来讲就是调用远处的一个节点所提供的服务,至于这个远处有多远呢?可能是一个文件内,不同的函数,也可能是同一个机器上的另一个进程的函数,也可能是远在另外省份的机器所提供的函数。
在这里插入图片描述

rpc 入门

rpc是分布式微服务系统中不同节点之间流行的通信方式,在现今互联网时代,rpc已经是一个不可缺少的基础组件,因此GO语言的标准库也提供了简单的RPC实现,我们将以此为入口学习RPC的各种用法。

rpc包提供了通过网络或其他I/O连接对一个对象的导出方法的访问。服务端注册一个对象,使它作为一个服务被暴露,服务的名字是该对象的类型名。注册之后,对象的导出方法就可以被远程访问。服务端可以注册多个不同类型的对象(服务),但注册具有相同类型的多个对象是错误的。

只有满足如下标准的方法才能用于远程访问,其余方法会被忽略:

  • 方法是导出的
  • 方法有两个参数,都是导出类型或内建类型
  • 方法的第二个参数是指针
  • 方法只有一个error接口类型的返回值

事实上,方法必须看起来像这样:

func (t *T) MethodName(argType T1, replyType *T2) error

项目实操

我们在服务端提供了一个Hello的服务,有着一个Print的方法。

服务端
package main

import (
	"log"
	"net"
	"net/rpc"
)

type Hello struct {
}
//方法需要满足前面所描述的约束条件
func (h *Hello) Print(from string, reply *string) error {
	*reply = from + ":Hello World"
	return nil
}

func main() {
	rpc.Register(new(Hello)) //注册服务
	//Register 会将独享中满足约束条件的方法全部注册为RPC函数
	//所有注册的方法会放到服务名为对象名的服务之下(RegisterName 可以自定义服务名称)
	listen, err := net.Listen("tcp", ":1234") //监听服务
	if err != nil {
		log.Fatal("listen errpr", err)
	}
	for {
		conn, _ := listen.Accept()  //同意连接
		rpc.ServeConn(conn) //
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值