我是靠谱客的博主 危机画板,最近开发中收集的这篇文章主要介绍RPC,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在这里插入图片描述
在这里插入图片描述
rpc调用基本流程,client将要调用的方法参数打包通过tcp网络发送给server,server接收到消息解包进行方法执行并将返回的结果打包返回给clent完成rpc调用,实质就是跨域调用(个人初步理解)
在这里插入图片描述
在这里插入图片描述
序列化:指的是将数据转化为字节编码的操作,例如json序列化
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
server

package main

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

type MathUtil struct {
   
}

// 该方法向外暴露,提供计算圆形面积的服务
func (mu *MathUtil) CalculateCircleArea(req float32, resp *float32) error {
   
	// 圆形面积 s = n * r * r
	*resp = math.Pi * req * req
	return nil
}

func main() {
   
	// 初始化指针数据类型
	mathUtil := new(MathUtil)
	// 调用net/rpc包功能将服务对象进行注册 在默认服务中发布mathutil方法
	err := rpc.Register(mathUtil)
	if err != nil {
   
		panic(err.Error())
	}
	// 通过该函数把mathUtil中提供的服务注册到http协议上,方便调用者可以利用http的方式进行数据传递
	rpc.HandleHTTP()
	// 在本地起一个服务
	listen, err := net.Listen("tcp", ":8080")
	if err != nil {
   
		panic(err.Error())
	}
	http.Serve(listen, nil)
}

client

package main

import (
	"net/rpc"
	"fmt"
)
func main(){
   
	// 连接localhost:8080 端口服务,监听默认的http rpc 路径
	client,err := rpc.DialHTTP("tcp","localhost:8080")
	if err != nil{
   
		panic(err.Error())
	}
	var req float32
	req = 3
	var resp *float32
	// 同步调用方式
	// 通过Call方法调用rpc server在服务中发布的方法
	err = client.Call("MathUtil.CalculateCircleArea",req,&resp)
	if err != nil{
   
		panic(err.Error())
	}
	fmt.Println(*resp)
}

异步调用
client

package main

import (
	"net/rpc"
	"fmt"
)
func main(){
   
	// 连接localhost:8080 端口服务,监听默认的http rpc 路径
	client,err := rpc.DialHTTP("tcp","localhost:8080")
	if err != nil{
   
		panic(err.Error())
	}
	var req float32
	req = 3
	// 异步调用方法
	var respSync *float32
	// go方法返回一个指针类型的struct
	syncCall := client.Go("MathUtil.CalculateCircleArea",req,&respSync,nil)
	// Done是一个管道,里边存指针类型的call
	replayDone := <-syncCall.Done
	fmt.Println(replayDone)
	fmt.Println(*respSync)
}

在这里插入图片描述
在这里插入图片描述

rpc调用多参数传递

在这里插入图片描述

server

package main

import (
	"RPC/param"
	"net"
	"net/http"
	"net/rpc"
)

type MathUtil struct {
   
}

// 该方法向外暴露,提供计算圆形面积的服务
func (mu *MathUtil) Add(param param.AddParma, resp *float32) error {
   
	*resp = param.Args1 + param.Args2
	return nil
}

func main() {
   
	// 初始化指针数据类型
	mathUtil := new(MathUtil)
	// 调用net/rpc包功能将服务对象进行注册 在默认服务中发布mathutil方法
	err := rpc.RegisterName("MathUtil", mathUtil)
	if err != nil {
   
		panic(err.Error())
	}
	// 通过该函数把mathUtil中提供的服务注册到http协议上,方便调用者可以利用http的方式进行数据传递
	rpc.HandleHTTP()
	// 在本地起一个服务
	listen, err := net.Listen("tcp", ":8080")
	if err != nil {
   
		panic(err.Error())
	}
	http.Serve(listen, nil)
}

client

package main

最后

以上就是危机画板为你收集整理的RPC的全部内容,希望文章能够帮你解决RPC所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部