RPC调用初识

什么是RPC远程调用?

远程调用会遇到的问题:

1.call id 的映射

2.序列化和反序列化

3.网络传输

为什么一个函数,要放在另一台服务器上面,在本地跑不是更好吗?

当电商系统,有一段逻辑是扣减库存了,但是库存服务是一个独立的系统或者说服务,这就是涉及到网络了,可以做成一个web服务来

1.函数的调用一般都是通过这个二进制数据传输,例如json和protobuf序列化数据

2.需要将本地的内存对象序列化,另一个服务反序列化才能调用

搞这么麻烦直接全部用json格式化不行吗?,这种做法在浏览器和gin服务之间是可行的,但是如果是一个大型的分布式系统,大量的调用不可以维护
大体的网络流程客户端,服务端

序列化反序列化是可以选择的,不一定要采用json,xml。选择很多

网络传输调用过程大部分是基于tcp的封装的协议,例如http,socket。grpc是基于http2.0的,1.0的话一次的不好的,性能不如长连接

Demo 样例 使用http协议做的rpc调用

server端

Go 复制代码
func main() {
    http.HandleFunc("/add", func(w http.ResponseWriter, r *http.Request) {
       _ = r.ParseForm() // 解析参数
       fmt.Println("path: ", r.URL.Path)

       a, err1 := strconv.Atoi(r.Form["a"][0])
       if err1 != nil {
          http.Error(w, "Invalid parameter 'a'", http.StatusBadRequest)
          return
       }

       b, err2 := strconv.Atoi(r.Form["b"][0])
       if err2 != nil {
          http.Error(w, "Invalid parameter 'b'", http.StatusBadRequest)
          return
       }

       w.Header().Set("Content-Type", "application/json")
       Jdata, _ := json.Marshal(map[string]int{"data": a + b})
       w.Write(Jdata)
    })

    http.ListenAndServe(":8000", nil)
}

client端

Go 复制代码
type ResponseData struct {
    Data int `json:"data"`
}

func Add(a, b int) int {
    // 构建 URL
    url := fmt.Sprintf("http://127.0.0.1:8000/add?a=%d&b=%d", a, b)
    // 发起 HTTP GET 请求
    res, err := http.Get(url)
    if err != nil {
       fmt.Println("Error making GET request:", err)
       return 0
    }
    defer res.Body.Close()
    // 读取响应体
    body, err := ioutil.ReadAll(res.Body)
    if err != nil {
       fmt.Println("Error reading response body:", err)
       return 0
    }
    // 打印响应体
    fmt.Println(string(body))
    // 解析 JSON 响应
    rspData := ResponseData{}
    err = json.Unmarshal(body, &rspData)
    if err != nil {
       fmt.Println("Error unmarshalling JSON:", err)
       return 0
    }

    return rspData.Data
}

func main() {
    fmt.Println(Add(1, 2))
}

RPC的开发的要点

示例流程图

相关推荐
白晨并不是很能熬夜7 小时前
【RPC】第 4 篇:服务发现 — Zookeeper + 缓存容错
java·后端·程序人生·缓存·zookeeper·rpc·服务发现
信徒_8 小时前
技术选型 RPC 框架
网络·网络协议·rpc
Andya_net11 小时前
Spring | 深度剖析Spring Bean的生命周期:从加载到销毁的完整流程
java·spring·rpc
染夕陌木1 天前
RPC/服务调用框架中“方法无法应用到给定类型”错误的通用排查指南
java·ide·rpc
Albert Edison2 天前
【RabbitMQ】RPC 通信(使用案例)
分布式·rpc·rabbitmq
lifewange3 天前
RPC 是什么
网络·网络协议·rpc
白晨并不是很能熬夜3 天前
【PRC】第 2 篇:Netty 通信层 — NIO 模型 + 自定义协议 + 心跳
java·开发语言·后端·面试·rpc·php·nio
白晨并不是很能熬夜3 天前
【RPC】第 1 篇:全景篇 — 一次 RPC 调用的完整旅程
java·网络·后端·网络协议·面试·rpc·java-zookeeper
珹洺3 天前
C++远程调用组件库JsonRpc(一)项目背景、核心概念与环境搭建
开发语言·c++·rpc
星辰_mya7 天前
RPC 原理:Dubbo为了偷懒而存在的中间商
后端·网络协议·rpc·架构·dubbo