欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2017年11月09日 10:18:15   作者:andyidea  
本篇文章主要介紹了golang中的net/rpc包使用概述(小結),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

RPC,即 Remote Procedure Call(遠程過程調用),說得通俗一點就是:調用遠程計算機上的服務,就像調用本地服務一樣。
我的項目是采用基于Restful的微服務架構,隨著微服務之間的溝通越來越頻繁,消耗的系統(tǒng)資源越來越多,于是乎就希望可以改成用rpc來做內部的通訊,對外依然用Restful。于是就想到了golang標準庫的rpc包和google的grpc。

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

介紹

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

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

  1. 函數(shù)必須是導出的(首字母大寫)
  2. 必須有兩個導出類型的參數(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服務器端的代碼:

package main

import (
  "errors"
  "net"
  "net/rpc"
  "log"
  "net/http"
)

type Args struct {
  A, B int
}

type Quotient struct {
  Quo, Rem int
}

type Arith int

func (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服務,然后把rpc掛載到http服務上面,當http服務打開的時候我們就可以通過rpc客戶端來調用arith中符合rpc標準的的方法了。

請看客戶端的代碼:

package main

import (
  "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方法連接服務器端,調用服務器端的函數(shù)就要使用Call方法了,Call方法的參數(shù)和返回值已經很清晰的表述出rpc整體的調用邏輯了。

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

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

到此,整個rpc的調用邏輯就完成了。

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

相關文章

  • 解決Goland中利用HTTPClient發(fā)送請求超時返回EOF錯誤DEBUG

    解決Goland中利用HTTPClient發(fā)送請求超時返回EOF錯誤DEBUG

    這篇文章主要介紹了解決Goland中利用HTTPClient發(fā)送請求超時返回EOF錯誤DEBUG,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 淺談Gin框架中bind的使用

    淺談Gin框架中bind的使用

    Gin框架中有bind函數(shù),可以非常方便的將url的查詢參數(shù)query?parameter、http的Header,body中提交上來的數(shù)據(jù)格式,本文就詳細的介紹Gin框架中bind的使用,感興趣的可以了解一下
    2021-12-12
  • Go項目中的GOPROXY設置

    Go項目中的GOPROXY設置

    GOPROXY是Go語言中用于指定模塊代理服務器的環(huán)境變量,設置GOPROXY可以通過操作系統(tǒng)環(huán)境變量、Go命令行參數(shù)或Go環(huán)境配置文件進行,感興趣的可以了解一下
    2024-09-09
  • go語言題解LeetCode989數(shù)組形式的整數(shù)加法

    go語言題解LeetCode989數(shù)組形式的整數(shù)加法

    這篇文章主要為大家介紹了go語言題解LeetCode989數(shù)組形式的整數(shù)加法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • Go?語言sort?中的sortInts?方法

    Go?語言sort?中的sortInts?方法

    這篇文章主要介紹了Go?語言sort?中的sortInts?方法,Go?的?sort?包實現(xiàn)了內置和用戶定義類型的排序。我們將首先查看內置函數(shù)的排序,西瓦嗯更多相關資料需要的小伙伴可以參考一下
    2022-04-04
  • Golang如何編寫內存高效及CPU調優(yōu)的Go結構體

    Golang如何編寫內存高效及CPU調優(yōu)的Go結構體

    這篇文章主要介紹了Golang如何編寫內存高效及CPU調優(yōu)的Go結構體,結構體是包含多個字段的集合類型,用于將數(shù)據(jù)組合為記錄
    2022-07-07
  • Go語言中new()和 make()的區(qū)別詳解

    Go語言中new()和 make()的區(qū)別詳解

    這篇文章主要介紹了Go語言中new()和 make()的區(qū)別詳解,本文講解了new 的主要特性、make 的主要特性,并對它們的區(qū)別做了總結,需要的朋友可以參考下
    2014-10-10
  • golang數(shù)組內存分配原理

    golang數(shù)組內存分配原理

    這篇文章主要介紹了golang數(shù)組內存分配原理,數(shù)組是內存中一片連續(xù)的區(qū)域,在聲明時需要指定長度,文章圍繞主題展開詳細的內容介紹,感興趣的小伙伴可以參考一下
    2022-06-06
  • 基于Golang實現(xiàn)統(tǒng)一加載資源的入口

    基于Golang實現(xiàn)統(tǒng)一加載資源的入口

    當我們需要在?main?函數(shù)中做一些初始化的工作,比如初始化日志,初始化配置文件,都需要統(tǒng)一初始化入口函數(shù),所以本文就來編寫一個統(tǒng)一加載資源的入口吧
    2023-05-05
  • golang文件服務器的兩種方式(可以訪問任何目錄)

    golang文件服務器的兩種方式(可以訪問任何目錄)

    這篇文章主要介紹了golang文件服務器的兩種方式,可以訪問任何目錄,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04

最新評論