type
status
date
slug
summary
tags
category
icon
password
😀
RPC架构
首先了解一下RPC架构。通过RPC我们可以形象了解微服务的工作流程。

1.RPC的概念

RPC(Remote Procedure Call Protocol),是远程过程调用的缩写,通俗的说就是调用远处的一个函数。与之相对应的是本地函数调用,我们先来看一下本地函数调用。当我们写下如下代码的时候:
上面代码表示传入了1,2两个参数,调用了本地代码中的一个Add函数,得到result这个返回值。这时参数,返回值,代码段都在一个进程空间内,这是本地函数调用。
有没有办法,我们能够调用一个跨进程(所以叫"远程",典型的事例,这个进程部署在另一台服务器上)的函数呢?
这就是RPC主要实现的功能,也是微服务的主要功能
这就是RPC主要实现的功能,也是微服务的主要功能

2.RPC入门

使用微服务化的一个好处就是: 1、不限定服务的提供方使用什么技术选型,能够实现公司跨团队的技术解耦。 2、每个服务都被封装成进程,彼此”独立“。 3、使用微服务可以跨进程通信。
实现不同服务间相互调用
实现不同服务间相互调用
在互联网时代,RPC已经和IPC(进程间通信)一样成为一个不可或缺的基础构件。 IPC:进程间通信。 RPC:远程间通信——应用层协议(http协议同层)。底层使用TCP实现。
在golang中实现RPC非常简单,有封装好的官方库和一些第三方库提供支持。Go RPC可以利用tcp或http来传递数据,可以对要传递的数据使用多种类型的编解码方式。golang官方的net/rpc库使用encoding/gob进行编解码,支持tcp或http数据传输方式,由于其他语言不支持gob编解码方式,所以使用net/rpc库实现的RPC方法没办法进行跨语言调用。
golang官方还提供了net/rpc/jsonrpc库实现RPC方法,JSON RPC采用JSON进行数据编解码,因而支持跨语言调用。但目前的jsonrpc库是基于tcp协议实现的,暂时不支持使用http进行数据传输。 除了golang官方提供的rpc库,还有许多第三方库为在golang中实现RPC提供支持,大部分第三方rpc库的实现都是使用protobuf进行数据编解码,根据protobuf声明文件自动生成rpc方法定义与服务注册代码,在golang中可以很方便的进行rpc服务调用。
GPT4注解protobuf
Protocol Buffers(Protobuf)是Google 开发的一种数据序列化协议(类似于XML、JSON、YAML等),它能够将结构化的数据序列化,用于数据存储、通信协议等方面。Protobuf是一种二进制格式,相比XML和JSON等格式,它更小、更快、更简单。 以下是Protobuf的一些主要特点: ·简单:.proto 文件中定义数据结构,然后使用 Protobuf 编译器生成数据访问代码,支持多种语言,如 Java、C++、Python、Go等。 ·高效:相比于 XML、JSON 等文本格式,Protobuf是二进制格式,因此在空间和时间效率上都更优。 ·向后兼容:Protobuf 设计了明确的版本控制规则,可以在不破坏已部署程序的情况下更新数据结构。 在微服务架构中,Protobuf常常被用作服务间通信的数据格式,因为它的高效和强大的兼容性使得服务间的数据交换更加高效和稳定。

3.net/rpc库使用tcp作为RPC的载体实现远程调用

使用golang官方的 net/rpc 库实现RPC方法
使用golang官方的 net/rpc 库实现RPC方法

3.1.创建RPC微服务端

 
  • Hellwo方法必须满足Go语言的RPC规则
    • 方法只能有两个可序列化的参数,其中第二个参数是指针类型
    • 方法要返回一个error类型,同时必须是公开的方法。 golang 中的类型比如:channel(通道)、complex(复数类型)、func(函数)均不能进行 序列化
  • 使用 http 作为RPC的载体,通过 net/http 包监听客户端连接请求。 http基于tcp,多一层封包和几次握手校验,性能自然比直接用tcp实现网络传输要差一些,所以RPC微服务中一般使用的都是tcp。

3.2创建RPC客户端