婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Go實現簡易RPC框架的方法步驟

Go實現簡易RPC框架的方法步驟

熱門標簽:浙江高速公路地圖標注 地圖標注的汽車標 高德地圖標注口訣 學海導航地圖標注 廣州呼叫中心外呼系統 江西轉化率高的羿智云外呼系統 南通如皋申請開通400電話 西部云谷一期地圖標注 中國地圖標注省會高清

本文旨在講述 RPC 框架設計中的幾個核心問題及其解決方法,并基于 Golang 反射技術,構建了一個簡易的 RPC 框架。

項目地址:Tiny-RPC

RPC

RPC(Remote Procedure Call),即遠程過程調用,可以理解成,服務 A 想調用不在同一內存空間的服務 B 的函數,由于不在一個內存空間,不能直接調用,需要通過網絡來表達調用的語義和傳達調用的數據。

服務端

RPC 服務端需要解決 2 個問題:

  • 由于客戶端傳送的是 RPC 函數名,服務端如何維護 函數名 與 函數實體 之間的映射
  • 服務端如何根據 函數名 實現對應的 函數實體 的調用

核心流程

  • 維護函數名到函數的映射
  • 在接收到來自客戶端的函數名、參數列表后,解析參數列表為反射值,并執行對應函數
  • 對函數執行結果進行編碼,并返回給客戶端

方法注冊

服務端需要維護 RPC 函數名到 RPC 函數實體的映射,我們可以使用 map 數據結構來維護映射關系。

type Server struct {
 addr string
 funcs map[string]reflect.Value
}

// Register a method via name
func (s *Server) Register(name string, f interface{}) {
 if _, ok := s.funcs[name]; ok {
 return
 }
 s.funcs[name] = reflect.ValueOf(f)
}

執行調用

一般來說,客戶端在調用 RPC 時,會將 函數名 和 參數列表 作為請求數據,發送給服務端。

由于我們使用了 map[string]reflect.Value 來維護函數名與函數實體之間的映射,則我們可以通過 Value.Call() 來調用與函數名相對應的函數。

package main

import (
 "fmt"
 "reflect"
)

func main() {
 // Register methods
 funcs := make(map[string]reflect.Value)
 funcs["add"] = reflect.ValueOf(add)

 // When receives client's request
 req := []reflect.Value{reflect.ValueOf(1), reflect.ValueOf(2)}
 vals := funcs["add"].Call(req)
 var rsp []interface{}
 for _, val := range vals {
 rsp = append(rsp, val.Interface())
 }

 fmt.Println(rsp)
}

func add(a, b int) (int, error) {
 return a + b, nil
}

具體實現

由于篇幅的限制,此處沒有貼出服務端實現的具體代碼,細節請查看項目地址。

客戶端

RPC 客戶端需要解決 1 個問題:

  • 由于函數的具體實現在服務端,客戶端只有函數的原型,客戶端如何通過 函數原型 調用其 函數實體

核心流程

  • 對調用者傳入的函數參數進行編碼,并傳送給服務端
  • 對服務端響應數據進行解碼,并返回給調用者

生成調用

我們可以通過 reflect.MakeFunc 為指定的函數原型綁定一個函數實體。

package main

import (
 "fmt"
 "reflect"
)

func main() {
 add := func(args []reflect.Value) []reflect.Value {
 result := args[0].Interface().(int) + args[1].Interface().(int)
 return []reflect.Value{reflect.ValueOf(result)}
 }

 var addptr func(int, int) int
 container := reflect.ValueOf(addptr).Elem()
 v := reflect.MakeFunc(container.Type(), add)
 container.Set(v)

 fmt.Println(addptr(1, 2))
}

具體實現

由于篇幅的限制,此處沒有貼出客戶端實現的具體代碼,細節請查看項目地址。

數據傳輸格式

我們需要定義服務端與客戶端交互的數據格式。

type Data struct {
 Name string    // service name
 Args []interface{} // request's or response's body except error
 Err string    // remote server error
}

與交互數據相對應的編碼與解碼函數。

func encode(data Data) ([]byte, error) {
 var buf bytes.Buffer
 encoder := gob.NewEncoder(buf)
 if err := encoder.Encode(data); err != nil {
 return nil, err
 }
 return buf.Bytes(), nil
}

func decode(b []byte) (Data, error) {
 buf := bytes.NewBuffer(b)
 decoder := gob.NewDecoder(buf)
 var data Data
 if err := decoder.Decode(data); err != nil {
 return Data{}, err
 }
 return data, nil
}

同時,我們需要定義簡單的 TLV 協議(固定長度消息頭 + 變長消息體),規范數據的傳輸。

// Transport struct
type Transport struct {
 conn net.Conn
}

// NewTransport creates a transport
func NewTransport(conn net.Conn) *Transport {
 return Transport{conn}
}

// Send data
func (t *Transport) Send(req Data) error {
 b, err := encode(req) // Encode req into bytes
 if err != nil {
 return err
 }
 buf := make([]byte, 4+len(b))
 binary.BigEndian.PutUint32(buf[:4], uint32(len(b))) // Set Header field
 copy(buf[4:], b)                  // Set Data field
 _, err = t.conn.Write(buf)
 return err
}

// Receive data
func (t *Transport) Receive() (Data, error) {
 header := make([]byte, 4)
 _, err := io.ReadFull(t.conn, header)
 if err != nil {
 return Data{}, err
 }
 dataLen := binary.BigEndian.Uint32(header) // Read Header filed
 data := make([]byte, dataLen)       // Read Data Field
 _, err = io.ReadFull(t.conn, data)
 if err != nil {
 return Data{}, err
 }
 rsp, err := decode(data) // Decode rsp from bytes
 return rsp, err
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • python使用rpc框架gRPC的方法
  • Java如何實現簡單的RPC框架
  • Java RPC框架過濾器機制原理解析
  • Java RPC框架如何實現客戶端限流配置
  • Java RPC框架熔斷降級機制原理解析
  • SpringBoot2.0 整合 Dubbo框架實現RPC服務遠程調用方法
  • 分析JAVA中幾種常用的RPC框架
  • Java實現簡單的RPC框架的示例代碼
  • Java利用Sping框架編寫RPC遠程過程調用服務的教程
  • php實現的一個簡單json rpc框架實例
  • python實現一個簡單RPC框架的示例

標簽:保定 曲靖 德宏 吐魯番 常州 貴州 東營 許昌

巨人網絡通訊聲明:本文標題《Go實現簡易RPC框架的方法步驟》,本文關鍵詞  實現,簡易,RPC,框架,的,方法,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Go實現簡易RPC框架的方法步驟》相關的同類信息!
  • 本頁收集關于Go實現簡易RPC框架的方法步驟的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    久久国内精品自在自线400部| 久久久久一区二区三区四区| 欧美午夜精品免费| 国产午夜亚洲精品不卡| 久久99在线观看| 日韩三级精品电影久久久| 视频一区国产视频| 日韩一区二区三区四区五区六区| 亚洲一区二区三区在线| 在线观看国产91| 亚洲一区二区三区小说| 欧美性生活大片视频| 亚洲黄色av一区| 欧美亚洲一区三区| 日本欧美肥老太交大片| 久久综合九色综合欧美亚洲| 国内成人自拍视频| 亚洲免费观看高清| 欧美三区在线观看| 秋霞午夜鲁丝一区二区老狼| 久久综合九色综合97婷婷| 国产精品99久久久久久有的能看 | 成人亚洲一区二区一| 亚洲图片激情小说| 欧洲精品一区二区| 久久精品99国产精品| 国产色一区二区| 欧洲中文字幕精品| 国产精选一区二区三区| 亚洲情趣在线观看| 久久影音资源网| 日本韩国视频一区二区| 国精产品一区一区三区mba桃花 | 日本欧美肥老太交大片| 国产精品夫妻自拍| 精品国产电影一区二区 | 欧美最新大片在线看| 国产真实乱子伦精品视频| 亚洲日本在线a| 久久久久久一二三区| 91久久国产最好的精华液| 激情综合一区二区三区| 亚洲国产精品久久人人爱| 国产欧美日韩激情| 欧美精品v日韩精品v韩国精品v| 国产精品12区| 青草国产精品久久久久久| 亚洲欧美一区二区三区久本道91| 精品国产伦一区二区三区观看体验 | 99国产欧美另类久久久精品| 青青青伊人色综合久久| 国产精品国产三级国产aⅴ中文| 欧美日韩国产天堂| 国产伦精一区二区三区| 亚洲一区av在线| 久久综合九色综合97_久久久| 欧美一区二区三区在线观看视频| 国产盗摄一区二区| 国产婷婷色一区二区三区四区| 成人精品小蝌蚪| 美女视频黄久久| 国产精品久久99| 欧美成人一区二区三区片免费| 波多野结衣在线一区| 日韩福利电影在线| 亚洲欧洲综合另类| 欧美国产精品一区二区三区| 欧美性猛片aaaaaaa做受| 国产成人综合视频| 久久国产婷婷国产香蕉| 精品一区二区在线观看| 亚洲综合另类小说| 亚洲日本va午夜在线电影| 久久久久久久久久美女| 日韩视频一区二区三区在线播放| 成人av先锋影音| 精品一区二区三区视频在线观看 | 亚洲精品欧美激情| 亚洲欧美成aⅴ人在线观看| xnxx国产精品| 26uuu久久综合| 国产精品理论片在线观看| 亚洲人午夜精品天堂一二香蕉| 一区二区三区免费| 日本免费新一区视频| 九九精品视频在线看| 不卡av在线免费观看| 欧美在线观看视频一区二区| 91麻豆精品国产91久久久久久久久| 日韩一区二区电影| 亚洲欧美一区二区在线观看| 最新国产成人在线观看| 日韩主播视频在线| 国产乱子伦一区二区三区国色天香| 国产一区二区三区蝌蚪| 91在线你懂得| 欧美图片一区二区三区| 日韩精品一区二区三区中文不卡 | 日本久久电影网| 日韩免费视频一区二区| 亚洲国产人成综合网站| 欧美美女黄视频| 一区二区三区欧美激情| 亚洲午夜久久久久| 午夜精品福利一区二区三区av| 亚洲国产精品精华液网站| 亚洲第一电影网| 免费在线观看日韩欧美| 国产精品自产自拍| 粉嫩久久99精品久久久久久夜| 欧美日韩你懂得| 精品国产乱码久久久久久1区2区 | 欧美一区二区三区影视| 国产农村妇女毛片精品久久麻豆| 成人欧美一区二区三区黑人麻豆 | 欧美唯美清纯偷拍| 国产女主播视频一区二区| 轻轻草成人在线| 国产精品123| 26uuu国产在线精品一区二区| 国产精品久久午夜夜伦鲁鲁| 九九热在线视频观看这里只有精品| 国产99久久久精品| 精品国产乱码久久久久久久久| 国产精品的网站| 成人av免费观看| 日韩欧美中文一区| 午夜精品福利在线| 成人动漫一区二区在线| 久久亚洲精华国产精华液| 日韩一区二区不卡| 日韩电影一区二区三区四区| 欧美性猛片aaaaaaa做受| 久久久久久免费| 国产一区二区91| 久久精子c满五个校花| 亚洲一区二区三区自拍| 成人av资源站| 欧美日韩国产综合草草| 日本一区二区三区免费乱视频 | 91亚洲精品一区二区乱码| 久久久久久久综合色一本| 国产一区二区三区免费观看| 欧美喷潮久久久xxxxx| 国产精品二区一区二区aⅴ污介绍| 亚洲欧洲日韩综合一区二区| 麻豆91在线看| 欧美区视频在线观看| 一区二区三区四区乱视频| 色老汉av一区二区三区| 国产精品理论片| 欧美亚一区二区| 一区二区三区毛片| 欧美欧美午夜aⅴ在线观看| 亚洲欧美另类小说视频| 欧美日本在线看| 自拍av一区二区三区| 日本精品视频一区二区| 午夜精品福利一区二区三区av| 欧美日韩国产系列| 国模套图日韩精品一区二区| 日韩免费高清视频| 久久99国产精品久久99果冻传媒| 欧美美女直播网站| 亚洲国产sm捆绑调教视频 | 成人av动漫网站| 成人免费在线播放视频| kk眼镜猥琐国模调教系列一区二区| 成人欧美一区二区三区1314| 26uuu精品一区二区三区四区在线| 蜜臀a∨国产成人精品| 日本一区二区免费在线观看视频| 国产一区二区三区在线观看免费视频 | 26uuu精品一区二区| 美女一区二区视频| 国产精品日日摸夜夜摸av| 成人少妇影院yyyy| 午夜精品久久久久久| 日本久久电影网| 国产在线视视频有精品| 亚洲综合一区二区三区| 在线91免费看| 91社区在线播放| 日本欧美肥老太交大片| 亚洲免费在线电影| 欧美浪妇xxxx高跟鞋交| 成人avav在线| 国产精品一二三四五| 亚洲美女免费在线| 91精品国产综合久久福利| 手机精品视频在线观看| 亚洲免费观看高清完整版在线观看 | 91精品国产入口| 国产成人免费在线观看不卡| 日韩成人av影视| 久久久五月婷婷| 精品99一区二区| 99久久国产免费看| 久久国产精品第一页| 调教+趴+乳夹+国产+精品|