1. 程式人生 > 資訊 >我國首個百萬千瓦級海上風電場併網發電,位於廣東陽江市

我國首個百萬千瓦級海上風電場併網發電,位於廣東陽江市

1、RPC (Remote Procedure Call) 遠端過程呼叫 (一個節點請求另一個節點提供的服務)

2、對應 RPC 的是本地過程呼叫,函式呼叫是最常見的本地過程呼叫

3、將本地過程呼叫,變成遠端過程呼叫會面臨各種問題

go 內建簡單 rpc 呼叫

server 端

package main

import (
    "net"
    "net/rpc"
)

type HelleService struct {

}

func (s * HelleService) Hello (request string, reply * string) error {
    *reply = "
hello" + request return nil } func main() { // 例項化一個 server listener, _ := net.Listen("tcp",":1234") // 註冊處理邏輯 handler _ = rpc.RegisterName("HelloService", &HelleService{}) // 啟動服務 conn,_ := listener.Accept() rpc.ServeConn(conn) }

client 端

package main

import (
    
"fmt" "net/rpc" ) func main() { // 建立連線 client, err := rpc.Dial("tcp","localhost:1234") if err != nil { panic("連線錯誤") } var reply string err = client.Call("HelloService.Hello","liang", &reply) if err != nil { panic("呼叫失敗") } fmt.Println(reply) }

替換 rpc 的序列化協議為 json (原 Gob)

server 端

func main() {
    // 例項化一個 server
    listener, _ := net.Listen("tcp",":1234")

    // 註冊處理邏輯 handler
    _ = rpc.RegisterName("HelloService", &HelleService{})

    // 啟動服務
    for {
        conn,_ := listener.Accept()
        go rpc.ServeCodec(jsonrpc.NewServerCodec(conn))        
    }
}

client 端

func main() {
    // 建立連線
    conn, err := net.Dial("tcp","localhost:1234")
    if err != nil {
        panic("連線錯誤")
    }

    var reply string
    client := rpc.NewClientWithCodec(jsonrpc.NewClientCodec(conn))
    err = client.Call("HelloService.Hello","liang", &reply)
    if err != nil {
        panic("呼叫失敗")
    }

    fmt.Println(reply)
}

任何語言都能進行 rpc 訪問,如python

替換 rpc 傳輸協議為 http (原 tcp)

server 端

func main() {
    // 例項化一個 server
    _ = rpc.RegisterName("HelloService", &HelleService{})
    http.HandleFunc("/wahaha",func(w http.ResponseWriter, r *http.Request) {
        var conn io.ReadWriteCloser = struct {
            io.Writer
            io.ReadCloser
        }{
            ReadCloser: r.Body,
            Writer: w,
        }
        rpc.ServeRequest(jsonrpc.NewServerCodec(conn))
    })

    http.ListenAndServe(":1234",nil)
}

測試