Golang实现RPC

net/rpc库

server:

package main

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

//net/rpc库使用encoding/gob进行编解码,只支持golang调用

type Params struct {
	Name string
}

type Love struct {
}

//函数名首字母大写
//第一个参数为接收参数,第二个参数是返回结果,必须是指针类型
//函数结果必须返回一个error
func (l *Love) Confession(p Params, result *string) error {
	*result = "I love you, " + p.Name
	return nil
}

func main()  {
	//注册服务
	love := new(Love)
	rpc.Register(love)
	//绑定http协议
	rpc.HandleHTTP()
	//监听服务
	fmt.Println("开始监听8888端口...")
	err := http.ListenAndServe(":8888", nil)
	if err != nil {
		log.Fatal(err)
	}
}

在这里插入图片描述

client:

package main

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

type Params struct {
	Name string
}

func main()  {
	//连接远程rpc服务
	conn, err := rpc.DialHTTP("tcp", ":8888")
	if err != nil {
		log.Fatal(err)
	}
	//调用方法
	result := ""
	err = conn.Call("Love.Confession", Params{"BaoBao"}, &result)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(result)
}

在这里插入图片描述

net/rpc/jsonrpc库

server:

package main

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

//net/rpc/jsonrpc库通过json格式编解码,支持跨语言调用

type Params struct {
	Name string
}

type Love struct {
}

//函数名首字母大写
//第一个参数为接收参数,第二个参数是返回结果,必须是指针类型
//函数结果必须返回一个error
func (l *Love) Confession(p Params, result *string) error {
	*result = "I love you, " + p.Name
	return nil
}

func main()  {
	//注册服务
	love := new(Love)
	rpc.Register(love)
	//监听服务
	fmt.Println("开始监听8888端口...")
	lis, err := net.Listen("tcp", ":8888")
	if err != nil {
		log.Fatal(err)
	}
	for {
		//等待客户端请求
		conn, err := lis.Accept()
		if err != nil {
			continue
		}
		go func(conn net.Conn) {
			fmt.Println("new client request")
			jsonrpc.ServeConn(conn)
		}(conn)
	}
}

在这里插入图片描述

client:

package main

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

type Params struct {
	Name string
}

func main()  {
	//连接远程jsonrpc服务
	conn, err := jsonrpc.Dial("tcp", ":8888")
	if err != nil {
		log.Fatal(err)
	}
	//调用方法
	result := ""
	err = conn.Call("Love.Confession", Params{"BaoBao"}, &result)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(result)
}

在这里插入图片描述

公众号:李田路口

原文地址:https://www.cnblogs.com/dubinyang/p/13945575.html