亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁(yè) > 知識(shí)庫(kù) > Go實(shí)現(xiàn)簡(jiǎn)易R(shí)PC框架的方法步驟

Go實(shí)現(xiàn)簡(jiǎn)易R(shí)PC框架的方法步驟

熱門(mén)標(biāo)簽:浙江高速公路地圖標(biāo)注 地圖標(biāo)注的汽車(chē)標(biāo) 高德地圖標(biāo)注口訣 學(xué)海導(dǎo)航地圖標(biāo)注 廣州呼叫中心外呼系統(tǒng) 江西轉(zhuǎn)化率高的羿智云外呼系統(tǒng) 南通如皋申請(qǐng)開(kāi)通400電話 西部云谷一期地圖標(biāo)注 中國(guó)地圖標(biāo)注省會(huì)高清

本文旨在講述 RPC 框架設(shè)計(jì)中的幾個(gè)核心問(wèn)題及其解決方法,并基于 Golang 反射技術(shù),構(gòu)建了一個(gè)簡(jiǎn)易的 RPC 框架。

項(xiàng)目地址:Tiny-RPC

RPC

RPC(Remote Procedure Call),即遠(yuǎn)程過(guò)程調(diào)用,可以理解成,服務(wù) A 想調(diào)用不在同一內(nèi)存空間的服務(wù) B 的函數(shù),由于不在一個(gè)內(nèi)存空間,不能直接調(diào)用,需要通過(guò)網(wǎng)絡(luò)來(lái)表達(dá)調(diào)用的語(yǔ)義和傳達(dá)調(diào)用的數(shù)據(jù)。

服務(wù)端

RPC 服務(wù)端需要解決 2 個(gè)問(wèn)題:

  • 由于客戶端傳送的是 RPC 函數(shù)名,服務(wù)端如何維護(hù) 函數(shù)名 與 函數(shù)實(shí)體 之間的映射
  • 服務(wù)端如何根據(jù) 函數(shù)名 實(shí)現(xiàn)對(duì)應(yīng)的 函數(shù)實(shí)體 的調(diào)用

核心流程

  • 維護(hù)函數(shù)名到函數(shù)的映射
  • 在接收到來(lái)自客戶端的函數(shù)名、參數(shù)列表后,解析參數(shù)列表為反射值,并執(zhí)行對(duì)應(yīng)函數(shù)
  • 對(duì)函數(shù)執(zhí)行結(jié)果進(jìn)行編碼,并返回給客戶端

方法注冊(cè)

服務(wù)端需要維護(hù) RPC 函數(shù)名到 RPC 函數(shù)實(shí)體的映射,我們可以使用 map 數(shù)據(jù)結(jié)構(gòu)來(lái)維護(hù)映射關(guān)系。

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)
}

執(zhí)行調(diào)用

一般來(lái)說(shuō),客戶端在調(diào)用 RPC 時(shí),會(huì)將 函數(shù)名 和 參數(shù)列表 作為請(qǐng)求數(shù)據(jù),發(fā)送給服務(wù)端。

由于我們使用了 map[string]reflect.Value 來(lái)維護(hù)函數(shù)名與函數(shù)實(shí)體之間的映射,則我們可以通過(guò) Value.Call() 來(lái)調(diào)用與函數(shù)名相對(duì)應(yīng)的函數(shù)。

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
}

具體實(shí)現(xiàn)

由于篇幅的限制,此處沒(méi)有貼出服務(wù)端實(shí)現(xiàn)的具體代碼,細(xì)節(jié)請(qǐng)查看項(xiàng)目地址。

客戶端

RPC 客戶端需要解決 1 個(gè)問(wèn)題:

  • 由于函數(shù)的具體實(shí)現(xiàn)在服務(wù)端,客戶端只有函數(shù)的原型,客戶端如何通過(guò) 函數(shù)原型 調(diào)用其 函數(shù)實(shí)體

核心流程

  • 對(duì)調(diào)用者傳入的函數(shù)參數(shù)進(jìn)行編碼,并傳送給服務(wù)端
  • 對(duì)服務(wù)端響應(yīng)數(shù)據(jù)進(jìn)行解碼,并返回給調(diào)用者

生成調(diào)用

我們可以通過(guò) reflect.MakeFunc 為指定的函數(shù)原型綁定一個(gè)函數(shù)實(shí)體。

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))
}

具體實(shí)現(xiàn)

由于篇幅的限制,此處沒(méi)有貼出客戶端實(shí)現(xiàn)的具體代碼,細(xì)節(jié)請(qǐng)查看項(xiàng)目地址。

數(shù)據(jù)傳輸格式

我們需要定義服務(wù)端與客戶端交互的數(shù)據(jù)格式。

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

與交互數(shù)據(jù)相對(duì)應(yīng)的編碼與解碼函數(shù)。

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
}

同時(shí),我們需要定義簡(jiǎn)單的 TLV 協(xié)議(固定長(zhǎng)度消息頭 + 變長(zhǎng)消息體),規(guī)范數(shù)據(jù)的傳輸。

// 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
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • python使用rpc框架gRPC的方法
  • Java如何實(shí)現(xiàn)簡(jiǎn)單的RPC框架
  • Java RPC框架過(guò)濾器機(jī)制原理解析
  • Java RPC框架如何實(shí)現(xiàn)客戶端限流配置
  • Java RPC框架熔斷降級(jí)機(jī)制原理解析
  • SpringBoot2.0 整合 Dubbo框架實(shí)現(xiàn)RPC服務(wù)遠(yuǎn)程調(diào)用方法
  • 分析JAVA中幾種常用的RPC框架
  • Java實(shí)現(xiàn)簡(jiǎn)單的RPC框架的示例代碼
  • Java利用Sping框架編寫(xiě)RPC遠(yuǎn)程過(guò)程調(diào)用服務(wù)的教程
  • php實(shí)現(xiàn)的一個(gè)簡(jiǎn)單json rpc框架實(shí)例
  • python實(shí)現(xiàn)一個(gè)簡(jiǎn)單RPC框架的示例

標(biāo)簽:保定 曲靖 德宏 吐魯番 常州 貴州 東營(yíng) 許昌

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Go實(shí)現(xiàn)簡(jiǎn)易R(shí)PC框架的方法步驟》,本文關(guān)鍵詞  實(shí)現(xiàn),簡(jiǎn)易,RPC,框架,的,方法,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Go實(shí)現(xiàn)簡(jiǎn)易R(shí)PC框架的方法步驟》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于Go實(shí)現(xiàn)簡(jiǎn)易R(shí)PC框架的方法步驟的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    国产极品白嫩美女在线观看看| 亚州视频一区二区| 麻豆系列国产剧在线观看| 国产视频久久久久| 天天色成人| 午夜家庭影院| 青青青草影院 | 91麻豆精品国产片在线观看| 国产精品12| 国产91精品一区二区| 国产一区二区精品| 韩国毛片 免费| 毛片的网站| 成人免费观看的视频黄页| 美女免费精品高清毛片在线视| 免费国产在线观看| 一级毛片视频免费| 国产麻豆精品视频| 亚洲精品中文字幕久久久久久| 99久久精品费精品国产一区二区| 久久99中文字幕| 久久国产精品自线拍免费| 欧美一级视频免费观看| 免费国产在线视频| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 你懂的在线观看视频| 91麻豆精品国产综合久久久| 精品在线视频播放| 国产视频一区二区三区四区| 欧美激情影院| 久久成人亚洲| 日本特黄特黄aaaaa大片| 四虎影视库| 欧美爱色| 精品在线观看一区| 国产网站免费| 国产高清在线精品一区二区 | 免费一级生活片| 免费的黄视频| 国产麻豆精品视频| 九九热精品免费观看| 日韩专区第一页| 天天做人人爱夜夜爽2020毛片| 九九久久99综合一区二区| 精品久久久久久中文| 国产视频一区二区三区四区| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 精品国产一区二区三区精东影业| 欧美18性精品| 日韩女人做爰大片| 麻豆系列国产剧在线观看| 欧美大片a一级毛片视频| 国产成人欧美一区二区三区的| 亚洲女初尝黑人巨高清在线观看| 国产视频一区二区三区四区| 国产视频在线免费观看| 国产福利免费视频| 欧美激情中文字幕一区二区| 国产一区免费在线观看| 99久久网站| 亚飞与亚基在线观看| 国产精品自拍亚洲| 欧美一级视频免费观看| 国产成人欧美一区二区三区的| 国产成人精品综合| 欧美激情一区二区三区在线播放| 精品国产亚洲一区二区三区| 亚欧乱色一区二区三区| 国产高清在线精品一区a| 日韩中文字幕一区二区不卡| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 成人影视在线播放| 国产精品1024永久免费视频 | 精品视频在线观看一区二区三区| 91麻豆精品国产综合久久久| 成人免费一级纶理片| 久久99爰这里有精品国产| 免费国产在线视频| 国产视频一区二区三区四区| 你懂的福利视频| a级毛片免费全部播放| 国产a免费观看| 成人影院一区二区三区| 在线观看成人网 | 国产一区免费在线观看| 国产不卡在线观看| 国产精品自拍亚洲| 日韩在线观看视频免费| 国产麻豆精品视频| 成人高清视频在线观看| 高清一级片| 欧美另类videosbestsex久久| 成人免费一级纶理片| 免费的黄视频| 成人免费网站久久久| 精品视频免费在线| 午夜在线亚洲男人午在线| 精品视频免费观看| 久草免费在线视频| 99久久精品费精品国产一区二区| 免费毛片播放| 99久久网站| 九九精品影院| 久久久久久久免费视频| 欧美激情中文字幕一区二区| 中文字幕Aⅴ资源网| 99热精品在线| 国产成人精品综合| 国产麻豆精品视频| 天天做日日爱夜夜爽| 黄视频网站在线观看| 亚洲精品中文字幕久久久久久| 国产成人精品一区二区视频| 日韩专区亚洲综合久久| 欧美激情伊人| 黄视频网站在线免费观看| 中文字幕一区二区三区 精品| 亚洲不卡一区二区三区在线| 国产精品免费久久| 国产亚洲男人的天堂在线观看| a级精品九九九大片免费看| 久草免费在线视频| 天天色成人| 99久久网站| 韩国毛片 免费| 97视频免费在线观看| 国产91精品一区二区| 尤物视频网站在线观看| 91麻豆爱豆果冻天美星空| 国产亚洲精品aaa大片| 九九干| 久久99中文字幕| 二级片在线观看| 国产麻豆精品免费密入口| 日韩在线观看视频免费| 欧美爱色| 国产91丝袜在线播放0| 99色吧| 黄色福利片| 九九精品影院| 一级女性全黄久久生活片| 九九九在线视频| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 久久精品欧美一区二区| 美女免费毛片| 99热精品在线| 日韩专区亚洲综合久久| 午夜在线亚洲男人午在线| 成人免费一级纶理片| 你懂的在线观看视频| 九九免费高清在线观看视频| 韩国三级香港三级日本三级| 欧美爱色| 日韩中文字幕在线观看视频| 亚洲 国产精品 日韩| 九九久久99综合一区二区| 国产网站免费在线观看| 亚欧乱色一区二区三区| 欧美激情伊人| 黄色免费三级| 精品视频在线观看一区二区三区| 一本伊大人香蕉高清在线观看| 精品视频在线看 | 日本特黄特黄aaaaa大片| 99久久精品国产高清一区二区| 青草国产在线| 国产麻豆精品hdvideoss| 成人免费一级纶理片| 可以免费在线看黄的网站| 九九精品久久| 日韩免费片| 成人免费福利片在线观看| 九九免费高清在线观看视频| 色综合久久天天综合绕观看| 成人免费一级纶理片| 精品视频一区二区三区免费| 日韩女人做爰大片| 精品视频免费观看| 日韩中文字幕在线观看视频| 欧美18性精品| 国产一级生活片| 日本在线不卡视频| 你懂的福利视频| 欧美国产日韩一区二区三区| 精品国产亚洲一区二区三区| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产麻豆精品视频| 亚洲不卡一区二区三区在线| 欧美电影免费| 成人影视在线播放| 一本伊大人香蕉高清在线观看| 国产一区二区高清视频| 国产美女在线一区二区三区| 亚洲精品久久玖玖玖玖| 色综合久久久久综合体桃花网| 青青久久精品国产免费看| 亚洲天堂一区二区三区四区| 精品久久久久久中文| 九九精品久久| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 |