基本概念
- RPC(Remote Procedure Call)远程过程调用,简单的理解是一个节点请求另一个节点提供的服务,该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程,RPC最直接的作用就是微服务。
代码
实现一个简单的服务调用,client调用server服务计算圆形的面积。
- Client:
package main
import (
"fmt"
"net/rpc"
)
func main() {
// 1. 要调用的服务地址
client, err := rpc.DialHTTP("tcp", "127.0.0.1:8181")
if err != nil {
panic(err.Error())
}
// 请求值
var req float32 = 11
// 2. 同步方式调用服务器方法计算圆形的面积
var resp *float32
err = client.Call("MathUtil.CalculateCircleArea", req, &resp)
if err != nil {
panic(err.Error())
}
fmt.Println(*resp)
}
- Server:
package main
import (
"fmt"
"math"
"net"
"net/http"
"net/rpc"
)
type MathUtil struct{
}
// 该方法向外暴露:提供计算圆形面积的服务
func (mu *MathUtil) CalculateCircleArea(req float32, resp *float32) error {
*resp = math.Pi * req * req
return nil
}
func main() {
// 1. 初始化指针数据类型
mathUtil := new(MathUtil)
// 2. 调用net/rpc包的功能将服务对象进行注册
err := rpc.Register(mathUtil)
if err != nil {
panic(err.Error())
}
// 3. 通过该函数把mathUtil中提供的服务注册到HTTP协议上,方便调用者可以利用http的方式进行数据传递
rpc.HandleHTTP()
//4、在特定的端口进行监听
listen, err := net.Listen("tcp", "127.0.0.1:8181")
if err != nil {
panic(err.Error())
}
fmt.Println("监听地址: ", listen.Addr())
http.Serve(listen, nil)
}