rpc远程调用
首先看我们正常执行程序的过程
func main() {
var a, b int
a = 1
b = 2
c := Add(a, b)
fmt.Println("计算结果:", c)
}
func Add(a int, b int) int {
return a + b
}
rpc简介
RPC是Remote Procedure Call Protocol单词首字母的缩写,简称为:RPC
远程过程调用指的是调用远端服务器上的程序的方法整个过程。
入门案例(实现远程调用实现加法运算)
//server.go服务端
package main
import (
"log"
"net"
"net/http"
"net/rpc"
)
type NumbersTwo struct {
}
func main() {
Nt := new(NumbersTwo)
//注册服务对象
//该对象必须是结构体对象,通过对象所属的方法暴露给调用者从而提供服务
err := rpc.Register(Nt)
if err != nil {
log.Fatal(err)
}
//通过该函数把对象所属的方法的服务注册到http协议上,方便调用者可以利用http的方式进行数据传递
rpc.HandleHTTP()
//端口监听
listen, err := net.Listen("tcp", ":8000")
if err != nil {
panic(err.Error())
}
err = http.Serve(listen, nil)
if err != nil {
panic(err.Error())
}
}
//远程方法需遵循一定的规则
//对外暴露的方法只能有两个参数第二个参数是指针类型)
//返回值类型是error
//传回的值必须是指针类型
func (n *NumbersTwo) AddTwoNumbers(t map[string]int, result *int) error {
*result = t["A"] + t["B"]
return nil
}
//client.go客户端
package main
import (
"fmt"
"net/rpc"
)
func main() {
//通过http的端口监听方式连接
client, err := rpc.DialHTTP("tcp", "localhost:8000")
if err != nil {
panic(err.Error())
}
var result *int
t := map[string]int{
"A":2,
"B":3,
}
//调用远端方法
err = client.Call("NumbersTwo.AddTwoNumbers", t, &result)
if err != nil {
panic(err.Error())
}
fmt.Println("远程调用程序, 结果为:", *result)
}