[Go]RPC

閱讀時間約 6 分鐘

GOB

Go官方有提供net/rpc的RPC套件。此套件提供GOB的編/解碼,且支援TCP或HTTP傳輸方式。它可以在伺服器端註冊多個不同類型物件。


遠端存取的要求條件

  • 方法的類型可輸出
  • 方法的本體可輸出
  • 方法必須要有兩個參數是輸出或內建
  • 方法的第二個參數是指標型
  • 方法的返回類型為error


伺服器端

package main

import (
"fmt"
"net/http"
"net/rpc"
)

func main() {
algorithm := new(Algorithm)
fmt.Println("Algorithm start", algorithm)
rpc.Register(algorithm)
rpc.HandleHTTP()
err := http.ListenAndServe(":8808", nil)
if err != nil {
fmt.Println("err===", err.Error())
}
}

type Algorithm int

type Args struct {
X, Y int
}

type Response int

func (t *Algorithm) Sum(args *Args, reply *int) error {
*reply = args.X + args.Y
fmt.Println("Exec Sum ", reply)
return nil
}


用戶端

package main

import (
"fmt"
"log"
"net/rpc"
"os"
"strconv"
)

type ArgsTwo struct {
X, Y int
}

func main() {
client, err := rpc.DialHTTP("tcp", "127.0.0.1:8808")
if err != nil {
log.Fatal("ERROR:DialHTTP", err)
}
i1, _ := strconv.Atoi(os.Args[1])
i2, _ := strconv.Atoi(os.Args[2])
args := ArgsTwo{i1, i2}
var reply int
err = client.Call("Algorithm.Sum", args, &reply)
if err != nil {
log.Fatal("Call Sum algorithm error:", err)
}
fmt.Printf("Algorithm Sum: %d+%d=%d\n", args.X, args.Y, reply)
}


JSON

Go官方有提供net/rpc的RPC套件。此套件提供json-rpc的編/解碼。


伺服器端

package main

import (
"fmt"
"net"
"net/rpc"
"net/rpc/jsonrpc"
)

func init() {
fmt.Println("JSON編碼RPC,不是gob編碼,其他的和RPC概念一模一樣,")
}

type ArgsLanguage struct {
Java, Go string
}

type Programmer string

func (m *Programmer) GetSkill(al *ArgsLanguage, skill *string) error {
*skill = "Skill1:" + al.Java + ",Skill2" + al.Go
return nil
}

func main() {
str := new(Programmer)
rpc.Register(str)

tcpAddr, err := net.ResolveTCPAddr("tcp", ":8085")
if err != nil {
fmt.Println("ResolveTCPAddr err=", err)
}

listener, err := net.ListenTCP("tcp", tcpAddr)
if err != nil {
fmt.Println("tcp listen err=", err)
}

for {
conn, err := listener.Accept()
if err != nil {
continue
}
jsonrpc.ServeConn(conn)
}
}


用戶端

package main

import (
"fmt"
"log"
"net/rpc/jsonrpc"
)

func main() {
fmt.Println("client start......")
client, err := jsonrpc.Dial("tcp", "127.0.0.1:8085")
if err != nil {
log.Fatal("Dial err=", err)
}
send := Send{"Java", "Go"}
var receive string
err = client.Call("Programmer.GetSkill", send, &receive)
if err != nil {
fmt.Println("Call err=", err)
}
fmt.Println("receive", receive)

}

type Send struct {
Java, Go string
}
8會員
119Content count
嗨,我是一名程式設計師,會在這分享開發與學習紀錄。
留言0
查看全部
發表第一個留言支持創作者!
小黑與程式的邂逅 的其他內容
支援Go所有的類型儲存,且可以用原生SQL敘述與跨資料庫查詢。 映射關係 table->struct record->object field->attribute 安裝 go get github.com/astaxie/beego/orm​ go get github.com
Gorm是一款性能極好的ORM,且友善,因此可以明顯的提高開發效率。 特點 全功能ORM 支持連結 支援Hook 支持預先載入 支援交易 支持復合主鍵 支持SQL生成器 支援資料庫自動遷移 支援自訂日誌 可擴充性 所有功能都被測試覆蓋 安裝 go get -u gor
MacOS 先下載Homebrew,然後輸入底下指令: brew install go 確認是否安裝完成 go version 環境設定 export GOPATH=$HOME/go
Docker-Compose負責對container做快速編排。設定檔預設名稱為docker-compose.yml,在檔案中,可以透過COMPOSE_FILE或-f對設定進行定義。 想要將專案透過Docker-Compose部署,需要創建docker-compose.yml和Dockerfile
授權碼模式連線流程 用戶端請求自己的伺服器。 伺服器發現用戶沒登入,就導向認證伺服器。 認證伺服器顯示授權頁面,等待用戶授權。 用戶確認授權後,授權頁面會向認證伺服器請求授權碼。 用戶獲取授權碼。 用戶將授權碼傳給伺服器。 伺服器拿授權碼向認證伺服器取得token。 應用註冊
package main import ( "fmt" "io" "net/http" "os" "strconv" ) func Get(url string) (result string, err error) { resp, err1 := http.Get(url) if
支援Go所有的類型儲存,且可以用原生SQL敘述與跨資料庫查詢。 映射關係 table->struct record->object field->attribute 安裝 go get github.com/astaxie/beego/orm​ go get github.com
Gorm是一款性能極好的ORM,且友善,因此可以明顯的提高開發效率。 特點 全功能ORM 支持連結 支援Hook 支持預先載入 支援交易 支持復合主鍵 支持SQL生成器 支援資料庫自動遷移 支援自訂日誌 可擴充性 所有功能都被測試覆蓋 安裝 go get -u gor
MacOS 先下載Homebrew,然後輸入底下指令: brew install go 確認是否安裝完成 go version 環境設定 export GOPATH=$HOME/go
Docker-Compose負責對container做快速編排。設定檔預設名稱為docker-compose.yml,在檔案中,可以透過COMPOSE_FILE或-f對設定進行定義。 想要將專案透過Docker-Compose部署,需要創建docker-compose.yml和Dockerfile
授權碼模式連線流程 用戶端請求自己的伺服器。 伺服器發現用戶沒登入,就導向認證伺服器。 認證伺服器顯示授權頁面,等待用戶授權。 用戶確認授權後,授權頁面會向認證伺服器請求授權碼。 用戶獲取授權碼。 用戶將授權碼傳給伺服器。 伺服器拿授權碼向認證伺服器取得token。 應用註冊
package main import ( "fmt" "io" "net/http" "os" "strconv" ) func Get(url string) (result string, err error) { resp, err1 := http.Get(url) if
你可能也想看
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
新賽季新希望,每隻球隊都有自己的中心思想、歡呼口號、應援歌曲,然而不變的最終目標就是贏得年度總冠軍,在那之前所能做的、就是全力以赴,永不退縮。
原本的計畫是寫系列文,一天嗑一點,雖然完整影片約17小時,分批消化卻花了我近10天,現在回去看我第一天寫的草稿,編輯時間已經是半年前...。
親了,然後呢? 過了一兩分鐘姐姐似乎是回神過來,丟下一句妳先不要下車,接著關上我這邊的車門,回到駕駛座,我內心的OS:完了完了巴比Q了༼⁠⁰⁠o⁠⁰⁠;⁠༽ 「明天早上幾點來接妳?」 我???(⁠ʘ⁠ᗩ⁠ʘ) 「妳的機車不是停在公司那?親了我後就忘了?」 『不麻煩主管了,我可以搭計程車或者我
Thumbnail
今年FGO台服終於預計在年底進入2-7,又常常看到很多人說對中南美洲文化不熟, 因此想再把文章統整成一下成更適合作為遊戲補充資料的版本,希望大家在到時遊玩2-7時有更多樂趣。 第一篇基本上是以基礎知識為主,不太會有遊戲劇透。
喝著shot,苦辣嗆辣令眼淚噴出變得很合理,乾杯這苦悶的日子。 她豪邁的大腿一開坐著喝shot,崇拜過像霹靂嬌娃那樣來個霹靂腿一掃的快感。 這裡不是皇后區,只有跟她從來不熟的算數公式與做人的外星球,又是苦悶的一天過去,她懷念著跳著舞的快樂就那樣子一直跳!跳!跳!哈哈哈的過了每一天的有她存在的意義
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
新賽季新希望,每隻球隊都有自己的中心思想、歡呼口號、應援歌曲,然而不變的最終目標就是贏得年度總冠軍,在那之前所能做的、就是全力以赴,永不退縮。
原本的計畫是寫系列文,一天嗑一點,雖然完整影片約17小時,分批消化卻花了我近10天,現在回去看我第一天寫的草稿,編輯時間已經是半年前...。
親了,然後呢? 過了一兩分鐘姐姐似乎是回神過來,丟下一句妳先不要下車,接著關上我這邊的車門,回到駕駛座,我內心的OS:完了完了巴比Q了༼⁠⁰⁠o⁠⁰⁠;⁠༽ 「明天早上幾點來接妳?」 我???(⁠ʘ⁠ᗩ⁠ʘ) 「妳的機車不是停在公司那?親了我後就忘了?」 『不麻煩主管了,我可以搭計程車或者我
Thumbnail
今年FGO台服終於預計在年底進入2-7,又常常看到很多人說對中南美洲文化不熟, 因此想再把文章統整成一下成更適合作為遊戲補充資料的版本,希望大家在到時遊玩2-7時有更多樂趣。 第一篇基本上是以基礎知識為主,不太會有遊戲劇透。
喝著shot,苦辣嗆辣令眼淚噴出變得很合理,乾杯這苦悶的日子。 她豪邁的大腿一開坐著喝shot,崇拜過像霹靂嬌娃那樣來個霹靂腿一掃的快感。 這裡不是皇后區,只有跟她從來不熟的算數公式與做人的外星球,又是苦悶的一天過去,她懷念著跳著舞的快樂就那樣子一直跳!跳!跳!哈哈哈的過了每一天的有她存在的意義