RPC
尚硅谷Golang課
server
/ 用接口,讓服務端註冊RPC的時候,就能確保他合法
type World struct{}
func (w *World) HelloWorld(name string, resp *string) error {
*resp = name + "你好"
return nil
// 如果這個return的返回值不為空,
// 那無論傳出的參數是否有值,服務端都不會給東西
// (就你給你error)
}
// 用接口,讓服務端註冊RPC的時候,就能確保他合法
type MyInerface interface {
HelloWorld(string *string) error
}
// 調用方法時,給i傳參,參數是實現HelloWorld方法的對象
func RegsiterService(i MyInerface) {
rpc.RegisterName("hello", i)
}
func main() {
// 1.註冊RPC服務 綁定對象方法
err := rpc.RegisterName("hello", new(World))
if err != nil {
fmt.Println("註冊RPC服務失敗", err)
}
// 2.開始監聽
listener, err := net.Listen("tcp", "127.0.0.1:8899")
if err != nil {
fmt.Println("listener failed", err)
return
}
fmt.Println("server開始監聽...")
defer listener.Close()
// 3.建立連接
conn, err := listener.Accept()
if err != nil {
fmt.Println("Accept failed", err)
return
}
fmt.Println("連接成功")
defer conn.Close()
// 4.綁訂服務
jsonrpc.ServeConn(conn)
}
client
import (
"fmt"
"net/rpc"
"net/rpc/jsonrpc"
)
func main01() {
// 1.用RPC連接伺服器
// conn, err := rpc.Dial("tcp", "127.0.0.1:8899")
conn, err := jsonrpc.Dial("tcp", "127.0.0.1:8899")
if err != nil {
fmt.Println("Accept failed", err)
return
}
defer conn.Close()
// 2.遠程調用函數
var reply = ""
err = conn.Call("hello.HelloWorld", "張三", &reply)
if err != nil {
fmt.Println("Call failed", err)
return
}
fmt.Println(reply)
}
func main() {
// myClient := InitClient("127.0.0.1:8899")
// var resp string
// err := myClient.HelloWorld("李四", &resp)
// if err != nil {
// fmt.Println("HelloWorld failed", err)
// return
// }
// fmt.Println(resp, err)
}
type MyClient struct {
c *rpc.Client
}
// 把c初始化下面才能調用
// func InitClient(addr string) {
// conn, _ := jsonrpc.Dial("tcp", addr)
// return MyClient{c: conn}
// }
func (m *MyClient) HelloWorld(a string, b *string) error {
return m.c.Call("hello.HelloWorld", a, b)
}
上次修改於 2021-08-01
此篇文章的評論功能已經停用。