欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Go语言net包RPC远程调用三种方式http与json-rpc及tcp

程序员文章站 2022-03-10 08:09:00
目录一、服务端二、http客户端三、tcp客户端四、json客户端五、运行结果rpc有多种调用方式,http、json-rpc、tcp一、服务端在代码中,启动了三个服务package mainimpo...

rpc有多种调用方式,http、json-rpc、tcp

一、服务端

在代码中,启动了三个服务

package main
import (
	"log"
	"net"
	"net/http"
	"net/rpc"
	"net/rpc/jsonrpc"
	"sync"
) 
//go对rpc的支持,支持三个级别:tcp、http、jsonrpc
//go的rpc只支持go开发的服务器与客户端之间的交互,因为采用了gob编码 
//注意字段必须是导出
type params struct {
	width, height int
} 
type rect struct{} 
//函数必须是导出的
//必须有两个导出类型参数
//第一个参数是接收参数
//第二个参数是返回给客户端参数,必须是指针类型
//函数还要有一个返回值error
func (r *rect) area(p params, ret *int) error {
	*ret = p.width * p.height
	return nil
} 
func (r *rect) perimeter(p params, ret *int) error {
	*ret = (p.width + p.height) * 2
	return nil
} 
func main() {
	rect := new(rect)
	//注册一个rect服务
	rpc.register(rect)
	var wg sync.waitgroup
	wg.add(3)
	go func() {
		//把服务处理绑定到http协议上
		rpc.handlehttp()
		err := http.listenandserve(":8080", nil)
		wg.wait()
		if err != nil {
			log.fatal(err)
			defer wg.done()
		}
	}()
	log.println("http rpc service start success addr:8080") 
	go func() {
 
		tcpaddr, _ := net.resolvetcpaddr("tcp", "127.0.0.1:8081")
		tcplisten, err := net.listentcp("tcp", tcpaddr)
		if err != nil {
			log.fatal(err)
			defer wg.done()
		}
		for {
			conn, err3 := tcplisten.accept()
			if err3 != nil {
				continue
			}
			go rpc.serveconn(conn)  
		} 
	}()
	log.println("tcp rpc service start success addr:8081")
 	go func() { 
		tcpaddr, _ := net.resolvetcpaddr("tcp", "127.0.0.1:8082")
		tcplisten, err := net.listentcp("tcp", tcpaddr)
		if err != nil {
			log.fatal(err)
			defer wg.done()
		}
		for {
			conn, err3 := tcplisten.accept()
			if err3 != nil {
				continue
			}
			go jsonrpc.serveconn(conn)
		} 
	}()
	log.println("tcp json-rpc service start success addr:8082") 
	wg.wait()
}

二、http客户端

package main
import (
	"net/rpc"
	"log"
	"fmt"
)
type params struct {
	width, height int
}
func main() {
	//连接远程rpc服务
	rpc, err := rpc.dialhttp("tcp", "127.0.0.1:8080")
	if err != nil {
		log.fatal(err)
	}
	ret := 0;
	//调用远程方法
	//注意第三个参数是指针类型
	err2 := rpc.call("rect.area", params{50, 100}, &ret)
	if err2 != nil {
		log.fatal(err2)
	}
	fmt.println(ret)
	err3 := rpc.call("rect.perimeter", params{50, 100}, &ret)
	if err3 != nil {
		log.fatal(err3)
	}
	fmt.println(ret)
}

三、tcp客户端

package main 
import (
	"net/rpc"
	"fmt"
	"log"
) 
type params struct {
	width, height int
} 
func main() {
	//连接远程rpc服务
	//这里使用dial,http方式使用dialhttp,其他代码都一样
	rpc, err := rpc.dial("tcp", "127.0.0.1:8081")
	if err != nil {
		log.fatal(err)
	}
	ret := 0
	//调用远程方法
	//注意第三个参数是指针类型
	err2 := rpc.call("rect.area", params{50, 100}, &ret)
	if err2 != nil {
		log.fatal(err2)
	}
	fmt.println(ret)
	err3 := rpc.call("rect.perimeter", params{50, 100}, &ret)
	if err3 != nil {
		log.fatal(err3)
	}
	fmt.println(ret)
}

四、json客户端

package main 
import ( 
	"fmt"
	"log"
	"net/rpc/jsonrpc"
) 
type params struct {
	width, height int
} 
func main() {
	//连接远程rpc服务
	rpc, err := jsonrpc.dial("tcp", "127.0.0.1:8082")
	if err != nil {
		log.fatal(err)
	}
	ret := 0
	//调用远程方法
	//注意第三个参数是指针类型
	err2 := rpc.call("rect.area", params{150, 100}, &ret)
	if err2 != nil {
		log.fatal(err2)
	}
	fmt.println(ret)
	err3 := rpc.call("rect.perimeter", params{150, 100}, &ret)
	if err3 != nil {
		log.fatal(err3)
	}
	fmt.println(ret)
}

五、运行结果

Go语言net包RPC远程调用三种方式http与json-rpc及tcp

Go语言net包RPC远程调用三种方式http与json-rpc及tcp

Go语言net包RPC远程调用三种方式http与json-rpc及tcp

Go语言net包RPC远程调用三种方式http与json-rpc及tcp

以上就是go语言net包rpc远程调用三种方式http与json-rpc及tcp的详细内容,更多关于go语言net包rpc远程调用方式的资料请关注其它相关文章!