栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

go语言微服务之RPC协议

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

go语言微服务之RPC协议

目录

1 什么是RPC

2 RPC 使用的步骤

3 RPC相关函数

4 代码实现

4.1 服务端代码实现

4.2客户端代码实现

4.3程序实现结果

​


1 什么是RPC

Remote Procedure Call Protocol --远程过程调用协议!

IPC:进程间通信

RPC:远程进程通信 -- 应用层协议(http协议同层),底层用TCP实现。

  • 理解RPC:像调用本地函数一样,去调用远程函数。通过rpc协议,传递:函数名,函数参数。达到在本地,调用远端函数,得返回值到本地的目标。
  • 为什么微服务要使用RPC:
  1. 每个服务都被封转成进程,彼此“独立”。
  2. 进程与进程之间,可以使用不同的语言实现。

2 RPC 使用的步骤

服务端:

  1. 注册rpc服务对象。给对象绑定方法(1,定义类,2,绑定类方法)。

rpc.RegisterNmae("服务名:",回调对象)

  1. 创建监听器。

listener,err:=net.Listen()

  1. 建立连接。

conn,err:=listener.Accept()

  1. 将连接绑定rpc服务。

rpc.ServerConn(conn)

客户端:

  1. 用rpc连接服务器。rpc.Dial()

conn,err:=rpc.Dial()

  1. 调用远程函数。

conn.Call("服务名.方法名",传入参数,传出参数)

3 RPC相关函数

 1,注册rpc服务

func(server *Server) RegistName(name string ,rcvr interface{}) error

参数1 :服务名,字符串类型

参数2 :对应rpc对象,该对象绑定方法要满足以下条件:

  1. 方法必须是导出的 --包外可见。首字母大写
  2. 方法必须两个参数,都是导出类型,内建类型 
  3. 方法的第二个参数必须是“指针”(传出参数)
  4. 方法只有一个error 接口类型的 返回值

如:

type World struct {

}

方法:

s *Wofunc(thirld) HelloWorld (name string,resp *string) error {

}

rpc.RegisterName("服务名",new(World))

2,绑定rpc服务

 func (server *Server) ServerConn(conn io.ReadWriteCloser)

    conn:成功建立好连接的:socket -- conn

3,调用远程函数

func (client *Client) Call(serviceMethod string, args interface{}, reply interface{}) error

serviceMethod:“服务名.方法名”

args:传入参数。方法需要的数据。

reply:传出参数。定义 var 变量,&变量名  完成传参。

4 代码实现

4.1 服务端代码实现
package main

import (
	"fmt"
	"net"
	"net/rpc"
)

type World struct {
}

//绑定类方法

func (this *World) HelloWorld(name string, resp *string) error {
	*resp = name + "你好!"
	return nil
}

func main() {
	//1,注册rpc服务,绑定对象方法
	err := rpc.RegisterName("hello", new(World))
	if err != nil {
		fmt.Println("注册rpc服务失败!", err)
		return
	}
	//2,设置监听
	listener, err := net.Listen("tcp", "127.0.0.1:8800")
	if err != nil {
		fmt.Println("net.Listen err:", err)
		return
	}
	defer listener.Close()

	fmt.Println("开始监听...")

	//3,建立连接
	conn, err := listener.Accept()
	if err != nil {
		fmt.Println("listener.Accept err:", err)
		return
	}
	defer conn.Close()
	fmt.Println("连接成功!")
	//4,绑定服务
	rpc.ServeConn(conn)

}

4

.2客户端代码实现
package main

import (
	"fmt"
	"net/rpc"
)

func main() {
	//1,用rpc连接服务器--Dial()
	conn, err := rpc.Dial("tcp", "127.0.0.1:8800")
	if err != nil {
		fmt.Println("rpc.Dial err:", err)
		return
	}
	defer conn.Close()
	fmt.Println("建立连接成功")
	//2,调用远程函数
	var reply string //接收函数返回值
	err = conn.Call("hello.HelloWorld", "李白", &reply)
	if err != nil {
		fmt.Println("conn.Call err:", err)
		return
	}
	fmt.Println(reply)
}

4.3程序实现结果

服务端

客户端

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/905494.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号