大家好,又见面了,我是你们的朋友全栈君。
目录
1 什么是RPC
Remote Procedure Call Protocol –远程过程调用协议!
IPC:进程间通信
RPC:远程进程通信 — 应用层协议(http协议同层),底层用TCP实现。
- 理解RPC:像调用本地函数一样,去调用远程函数。通过rpc协议,传递:函数名,函数参数。达到在本地,调用远端函数,得返回值到本地的目标。
- 为什么微服务要使用RPC:
- 每个服务都被封转成进程,彼此“独立”。
- 进程与进程之间,可以使用不同的语言实现。
2 RPC 使用的步骤
服务端:
- 注册rpc服务对象。给对象绑定方法(1,定义类,2,绑定类方法)。
rpc.RegisterNmae(“服务名:”,回调对象)
- 创建监听器。
listener,err:=net.Listen()
- 建立连接。
conn,err:=listener.Accept()
- 将连接绑定rpc服务。
rpc.ServerConn(conn)
客户端:
- 用rpc连接服务器。rpc.Dial()
conn,err:=rpc.Dial()
- 调用远程函数。
conn.Call(“服务名.方法名”,传入参数,传出参数)
3 RPC相关函数
1,注册rpc服务
func(server *Server) RegistName(name string ,rcvr interface{}) error
参数1 :服务名,字符串类型
参数2 :对应rpc对象,该对象绑定方法要满足以下条件:
- 方法必须是导出的 –包外可见。首字母大写
- 方法必须两个参数,都是导出类型,内建类型
- 方法的第二个参数必须是“指针”(传出参数)
- 方法只有一个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{}) errorserviceMethod:“服务名.方法名”
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程序实现结果
服务端
客户端
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/144507.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...