《GO語言高級編程》設計中案例,僅作爲筆記進行收藏。通常的RPC是基於C/S結構,RPC的服務端對應⽹絡的服務器,RPC的客戶端也對應⽹絡客戶端。但是對於⼀些特殊場景,⽐如在公司內⽹提供⼀個RPC服務,但是在外⽹⽆法鏈接到內⽹的服務器。這種時候我們可以參考類似反向代理的技術,⾸先從內⽹主動鏈接到外⽹的TCP服務器,然後基於TCP鏈接向外⽹提供RPC服務。
1.Server/main.go
package main
import (
"net"
"net/rpc"
"time"
)
type HelloService struct{}
func (p *HelloService) Hello(request string, reply *string) error {
*reply = "hello:" + request
return nil
}
func main() {
rpc.Register(new(HelloService))
for {
conn, _ := net.Dial("tcp", "localhost:1234")
if conn == nil {
time.Sleep(time.Second)
continue
}
rpc.ServeConn(conn)
conn.Close()
}
}
2.Client/main.go
package main
import (
"fmt"
"log"
"net"
"net/rpc"
)
func main() {
listener, err := net.Listen("tcp", ":1234")
if err != nil {
log.Fatal("ListenTCP error:", err)
}
clientChan := make(chan *rpc.Client)
go func() {
for {
conn, err := listener.Accept()
if err != nil {
log.Fatal("Accept error:", err)
}
clientChan <- rpc.NewClient(conn)
}
}()
client := <-clientChan
defer client.Close()
var reply string
err = client.Call("HelloService.Hello", "hello", &reply)
if err != nil {
log.Fatal(err)
}
fmt.Println(reply)
}