go语言微服务之RPC协议[通俗易懂]

go语言微服务之RPC协议[通俗易懂]1什么是RPCRemoteProcedureCallProtocol–远程过程调用协议!IPC:进程间通信RPC:远程进程通信–应用层协议(http协议同层),底层用TCP实现。理解RPC:像调用本地函数一样,去调用远程函数。通过rpc协议,传递:函数名,函数参数。达到在本地,调用远端函数,得返回值到本地的目标。 为什么微服务要使用RPC:每个服务都被封转成进程,彼此“独立”。 进程与进程之间,可以使用不同的语言实现。2RPC使用的步骤服务端:注册rpc

大家好,又见面了,我是你们的朋友全栈君。

目录

1 什么是RPC

2 RPC 使用的步骤

3 RPC相关函数

4 代码实现

4.1 服务端代码实现

4.2客户端代码实现

4.3程序实现结果


1 什么是RPC


Remote Procedure Call Protocol –远程过程调用协议!

IPC:进程间通信

RPC:远程进程通信 — 应用层协议(http协议同层),底层用TCP实现。

  • 理解RPC:像调用本地函数一样,去调用远程函数。通过rpc协议,传递:函数名,函数参数。达到在本地,调用远端函数,得返回值到本地的目标。
  • 为什么微服务要使用RPC:
  1. 每个服务都被封转成进程,彼此“独立”。
  2. 进程与进程之间,可以使用不同的语言实现。

2 RPC 使用的步骤


服务端:

  1. 注册rpc服务对象。给对象绑定方法(1,定义类,2,绑定类方法)。

rpc.RegisterNmae(“服务名:”,回调对象)

  1. 创建监听器。

listener,err:=net.Listen()

  1. 建立连接。

conn,err:=listener.Accept()

  1. 将连接绑定rpc服务。

rpc.ServerConn(conn)

客户端:

  1. 用rpc连接服务器。rpc.Dial()

conn,err:=rpc.Dial()

  1. 调用远程函数。

conn.Call(“服务名.方法名”,传入参数,传出参数)

3 RPC相关函数


 1,注册rpc服务

func(server *Server) RegistName(name string ,rcvr interface{}) error

参数1 :服务名,字符串类型

参数2 :对应rpc对象,该对象绑定方法要满足以下条件:

  1. 方法必须是导出的 –包外可见。首字母大写
  2. 方法必须两个参数,都是导出类型,内建类型 
  3. 方法的第二个参数必须是“指针”(传出参数)
  4. 方法只有一个error 接口类型的 返回值

如:

type World struct {

}

方法:

s *Wofunc(thirld) HelloWorld (name string,resp *string) error {

}

rpc.RegisterName(“服务名”,new(World))

2,绑定rpc服务

 func (server *Server) ServerConn(conn io.ReadWriteCloser)

    conn:成功建立好连接的:socket — conn

3,调用远程函数

func (client *Client) Call(serviceMethod string, args interface{}, reply interface{}) error

serviceMethod:“服务名.方法名”

args:传入参数。方法需要的数据。

reply:传出参数。定义 var 变量,&变量名  完成传参。

4 代码实现

4.1 服务端代码实现

package main

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

type World struct {
}

//绑定类方法

func (this *World) HelloWorld(name string, resp *string) error {
	*resp = name + "你好!"
	return nil
}

func main() {
	//1,注册rpc服务,绑定对象方法
	err := rpc.RegisterName("hello", new(World))
	if err != nil {
		fmt.Println("注册rpc服务失败!", err)
		return
	}
	//2,设置监听
	listener, err := net.Listen("tcp", "127.0.0.1:8800")
	if err != nil {
		fmt.Println("net.Listen err:", err)
		return
	}
	defer listener.Close()

	fmt.Println("开始监听...")

	//3,建立连接
	conn, err := listener.Accept()
	if err != nil {
		fmt.Println("listener.Accept err:", err)
		return
	}
	defer conn.Close()
	fmt.Println("连接成功!")
	//4,绑定服务
	rpc.ServeConn(conn)

}

4

.2客户端代码实现

package main

import (
	"fmt"
	"net/rpc"
)

func main() {
	//1,用rpc连接服务器--Dial()
	conn, err := rpc.Dial("tcp", "127.0.0.1:8800")
	if err != nil {
		fmt.Println("rpc.Dial err:", err)
		return
	}
	defer conn.Close()
	fmt.Println("建立连接成功")
	//2,调用远程函数
	var reply string //接收函数返回值
	err = conn.Call("hello.HelloWorld", "李白", &reply)
	if err != nil {
		fmt.Println("conn.Call err:", err)
		return
	}
	fmt.Println(reply)
}

4.3程序实现结果

服务端

go语言微服务之RPC协议[通俗易懂]

客户端

go语言微服务之RPC协议[通俗易懂]

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/144507.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月12日 下午12:00
下一篇 2022年5月12日 下午12:20


相关推荐

  • python考试编程题九道

    python考试编程题九道1 人民币和美元是世界上通用的两种货币之一 写一个程序进行货币间币值转换 其中 人民币和美元间汇率固定为 1 美元 6 78 人民币 程序可以接受人民币或美元输入 转换为美元或人民币输出 人民币采用 符号或 RMB 表示 美元采用 或 USD 表示 符号和数值之间没有空格

    2026年3月26日
    1
  • MQTT服务器搭建以及构建服务端和客户端

    MQTT服务器搭建以及构建服务端和客户端MQTT介绍MQTT,是IBM推出的一种针对移动终端设备的基于TCP/IP的发布/预订协议,可以连接大量的远程传感器和控制设备:轻量级的消息订阅和发布(publish/subscribe)协议建立在TCP/IP协议之上IoT,internetofthings,物联网,MQTT在这方面应用较多。MQTT协议是针对如下情况设计的:M2M(MachinetoMachi…

    2022年4月30日
    125
  • Coze平台搭建智能体,新手小白保姆级实战教程

    Coze平台搭建智能体,新手小白保姆级实战教程

    2026年3月12日
    2
  • Mybatis配置文件——全配置解析

    Mybatis配置文件——全配置解析为了让大家方便的使用 特意把总结放在文章开头 有帮助到你就点个关注呗配置名称配置含义配置简介包裹所有配置标签整个配置文件的顶级标签 properties 属性该标签可以引入外部配置的属性 也可以自己配置 该配置标签所在的同一个配置文件的其他配置均可以引用此配置中的属性 setting 全局配置参数用来配置一些改变运行时行为的信息 例如是否使用缓存机制 是否使用延迟加载 是否使用错误处理机制等 此项数据过于庞大 在下面细讲类型别名

    2026年3月19日
    2
  • JVM内存模型(通俗易懂)

    JVM内存模型(通俗易懂)1.什么是jvm?(1)jvm是一种用于计算设备的规范,它是一个虚构出来的机器,是通过在实际的计算机上仿真模拟各种功能实现的。(2)jvm包含一套字节码指令集,一组寄存器,一个栈,一个垃圾回收堆和一个存储方法域。(3)JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。2.jdk、jre、jvm是什么关系?(1)JRE(JavaR

    2022年4月28日
    80
  • 前端面试题:闭包_前端设计模式面试题

    前端面试题:闭包_前端设计模式面试题前段时间一直在投一些中小型公司吧,感觉好久都收不到反馈,也不知道是被淘汰了还是没出结果呢,最近开始投一些大一点的公司准备尝试一下,就在昨天接到面试电话的时候,接受到了滴滴的毒打。跟一些面试不一样的是不只是一些基础的基本概念吧,比如说什么是原型和原型链,说一下继承,讲一下this指向之类的。更多的是为什么要这样用,手写算法,预测输出结果之类的面试题。印象最深刻的应该就是那道关于闭包的题目了吧,是预测一个程序的输出结果,当时看的我是晕头转向,大厂的面试也是招架不住,真的是把我给面到自闭,感觉自己啥也不是,估

    2022年8月29日
    9

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号