国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Golang > 正文

golang中的net/rpc包使用概述(小結(jié))

2020-04-01 19:02:01
字體:
供稿:網(wǎng)友

RPC,即 Remote Procedure Call(遠(yuǎn)程過程調(diào)用),說得通俗一點就是:調(diào)用遠(yuǎn)程計算機(jī)上的服務(wù),就像調(diào)用本地服務(wù)一樣。
我的項目是采用基于Restful的微服務(wù)架構(gòu),隨著微服務(wù)之間的溝通越來越頻繁,消耗的系統(tǒng)資源越來越多,于是乎就希望可以改成用rpc來做內(nèi)部的通訊,對外依然用Restful。于是就想到了golang/118375.html">golang/196404.html">golang標(biāo)準(zhǔn)庫的rpc包和google的grpc。

這篇文章重點了解一下golang的rpc包。

介紹

golang的rpc支持三個級別的RPC:TCP、HTTP、JSONRPC。但Go的RPC包是獨一無二的RPC,它和傳統(tǒng)的RPC系統(tǒng)不同,它只支持Go開發(fā)的服務(wù)器與客戶端之間的交互,因為在內(nèi)部,它們采用了Gob來編碼。

Go RPC的函數(shù)只有符合下面的條件才能被遠(yuǎn)程訪問,不然會被忽略,詳細(xì)的要求如下:

  1. 函數(shù)必須是導(dǎo)出的(首字母大寫)
  2. 必須有兩個導(dǎo)出類型的參數(shù),
  3. 第一個參數(shù)是接收的參數(shù),第二個參數(shù)是返回給客- 戶端的參數(shù),第二個參數(shù)必須是指針類型的
  4. 函數(shù)還要有一個返回值error

舉個例子,正確的RPC函數(shù)格式如下:

func (t *T) MethodName(argType T1, replyType *T2) error

T、T1和T2類型必須能被encoding/gob包編解碼。

示例

舉一個http的例子。

下面是http服務(wù)器端的代碼:

package mainimport (  "errors"  "net"  "net/rpc"  "log"  "net/http")type Args struct {  A, B int}type Quotient struct {  Quo, Rem int}type Arith intfunc (t *Arith) Multiply(args *Args, reply *int) error {  *reply = args.A * args.B  return nil}func (t *Arith) Divide(args *Args, quo *Quotient) error {  if args.B == 0 {    return errors.New("divide by zero")  }  quo.Quo = args.A / args.B  quo.Rem = args.A % args.B  return nil}func main() {  arith := new(Arith)  rpc.Register(arith)  rpc.HandleHTTP()  l, e := net.Listen("tcp", ":1234")  if e != nil {    log.Fatal("listen error:", e)  }  http.Serve(l, nil)}

簡單分析一下上面的例子,先實例化了一個Arith對象arith,然后給arith注冊了rpc服務(wù),然后把rpc掛載到http服務(wù)上面,當(dāng)http服務(wù)打開的時候我們就可以通過rpc客戶端來調(diào)用arith中符合rpc標(biāo)準(zhǔn)的的方法了。

請看客戶端的代碼:

package mainimport (  "net/rpc"  "log"  "fmt")type Args struct {  A, B int}type Quotient struct {  Quo, Rem int}func main() {  client, err := rpc.DialHTTP("tcp", "127.0.0.1:1234")  if err != nil {    log.Fatal("dialing:", err)  }  // Synchronous call  args := &Args{7,8}  var reply int  err = client.Call("Arith.Multiply", args, &reply)  if err != nil {    log.Fatal("arith error:", err)  }  fmt.Printf("Arith: %d*%d=%d/n", args.A, args.B, reply)  // Asynchronous call  quotient := new(Quotient)  divCall := client.Go("Arith.Divide", args, quotient, nil)  replyCall := <-divCall.Done  // will be equal to divCall  if replyCall.Error != nil {    log.Fatal("arith error:", replyCall.Error)  }  fmt.Printf("Arith: %d/%d=%d...%d", args.A, args.B, quotient.Quo, quotient.Rem)  // check errors, print, etc.}

簡單說明下,先用rpc的DialHTTP方法連接服務(wù)器端,調(diào)用服務(wù)器端的函數(shù)就要使用Call方法了,Call方法的參數(shù)和返回值已經(jīng)很清晰的表述出rpc整體的調(diào)用邏輯了。

我們把服務(wù)器端跑起來,再把客戶端跑起來,這時候客戶端會輸出:

Arith: 7*8=56Arith: 7/8=0...7

到此,整個rpc的調(diào)用邏輯就完成了。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 冀州市| 浦城县| 蒲城县| 张家口市| 偏关县| 汝州市| 大安市| 仙居县| 山西省| 宁安市| 寻甸| 天柱县| 唐河县| 探索| 华容县| 鹤岗市| 开江县| 伊川县| 惠东县| 雷州市| 娄底市| 安阳县| 嘉定区| 东乡| 磴口县| 监利县| 安庆市| 河曲县| 平果县| 富川| 铜梁县| 张掖市| 鸡东县| 柘城县| 防城港市| 玛纳斯县| 隆尧县| 安国市| 渝北区| 宜丰县| 阿城市|