使用golang官方的net/rpc
库实现RPC方法,使用http
作为RPC的载体,通过net/http
包监听客户端连接请求。
- package main
-
- import (
- "errors"
- "fmt"
- "log"
- "net"
- "net/http"
- "net/rpc"
- "os"
- )
-
- // 算数运算结构体
- type Arith struct {
- }
-
- // 算数运算请求结构体
- type ArithRequest struct {
- A int
- B int
- }
-
- // 算数运算响应结构体
- type ArithResponse struct {
- Pro int // 乘积
- Quo int // 商
- Rem int // 余数
- }
-
- // 乘法运算方法
- func (this *Arith) Multiply(req ArithRequest, res *ArithResponse) error {
- res.Pro = req.A * req.B
- return nil
- }
-
- // 除法运算方法
- func (this *Arith) Divide(req ArithRequest, res *ArithResponse) error {
- if req.B == 0 {
- return errors.New("divide by zero")
- }
- res.Quo = req.A / req.B
- res.Rem = req.A % req.B
- return nil
- }
-
- func main() {
- rpc.Register(new(Arith)) // 注册rpc服务
- rpc.HandleHTTP() // 采用http协议作为rpc载体
-
- lis, err := net.Listen("tcp", "127.0.0.1:8090")
- if err != nil {
- log.Fatalln("fatal error: ", err)
- }
-
- fmt.Fprintf(os.Stdout, "%s", "start connection")
-
- http.Serve(lis, nil)
- }
上述服务端程序运行后,将会监听本地的8090端口,我们可以实现一个客户端程序,连接服务端并实现RPC方法调用。
- package main
-
- import (
- "fmt"
- "log"
- "net/rpc"
- )
-
- // 算数运算请求结构体
- type ArithRequest struct {
- A int
- B int
- }
-
- // 算数运算响应结构体
- type ArithResponse struct {
- Pro int // 乘积
- Quo int // 商
- Rem int // 余数
- }
-
- func main() {
- conn, err := rpc.DialHTTP("tcp", "127.0.0.1:8090")
- if err != nil {
- log.Fatalln("dailing error: ", err)
- }
-
- req := ArithRequest{9, 2}
- var res ArithResponse
-
- err = conn.Call("Arith.Multiply", req, &res) // 乘法运算
- if err != nil {
- log.Fatalln("arith error: ", err)
- }
- fmt.Printf("%d * %d = %d\n", req.A, req.B, res.Pro)
-
- err = conn.Call("Arith.Divide", req, &res)
- if err != nil {
- log.Fatalln("arith error: ", err)
- }
- fmt.Printf("%d / %d, quo is %d, rem is %d\n", req.A, req.B, res.Quo, res.Rem)
- }
输出结果:
server:
- [Running] go run "grpc\grpc_server\grpc_server.go"
- start connection
client:
- [Running] go run "grpc\grpc_client\grpc_client.go"
- 9 * 2 = 18
- 9 / 2, quo is 4, rem is 1
-
- [Done] exited with code=0 in 2.093 seconds