Golang 编写RPC

rpc/server/server.go

package main

import (
	"log"
	"net/http"
	"net/rpc"
)

// 服务端,求面积和周长

// 声明矩形对象
type Rect struct {

}
// 声明参数结构体
type Params struct {
	// 长和宽
	Width, Height int
}

// 定义求矩形面积的方法
func (c *Rect) Area(p Params, ret *int) error {
	*ret = p.Width * p.Height
	return nil
}

// 定义求矩形周长的方法
func (c *Rect) Perimeter(p Params, ret *int) error {
	*ret = (p.Width * p.Height)*2
	return nil
}

func main() {
	// 1.注册服务
	rect := new(Rect)
	rpc.Register(rect)
	// 2.把服务处理绑定到http上
	rpc.HandleHTTP()
	// 3.监听服务
	err := http.ListenAndServe(":8888", nil)
	if err != nil {
		log.Fatal(err)
	}
}

2.rpc/client/client.go

package main

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

type Params struct {
	Width, Height int
}
// 调用服务
func main() {
	// 1. 连接远程rpc服务
	rp, err := rpc.DialHTTP("tcp", "127.0.0.1:8888")
	if err != nil {
		log.Fatal(err)
	}
	// 2.调用远程方法
	ret := 0
	// 求面积
	err2 := rp.Call("Rect.Area", Params{50, 100}, &ret)
	if err2 != nil {
		log.Fatal(err)
	}
	fmt.Println("面积:", ret)
	// 求周长
	err3 := rp.Call("Rect.Perimeter", Params{50, 100}, &ret)
	if err3 != nil {
		log.Fatal(err)
	}
	fmt.Println("周长:", ret)
}

3.先运行server.go ,

面积: 5000
周长: 10000

Process finished with exit code 0

然后运行client.go

猜你喜欢

转载自blog.csdn.net/qq2942713658/article/details/114380514
今日推荐