go網路程式設計 RPC程式設計

2021-09-13 09:12:31 字數 3335 閱讀 1447

remote procedure call,遠端過程呼叫

而一旦踏入公司尤其是大型網際網路公司就會發現,公司的系統都由成千上萬大大小小的服務組成,各服務部署在不同的機器上,由不同的團隊負責。這時就會遇到兩個問題:

1)要搭建乙個新服務,免不了需要依賴他人的服務,而現在他人的服務都在遠端,怎麼呼叫?

2)其它團隊要使用我們的服務,我們的服務該怎麼發布以便他人呼叫?

服務消費方(client)呼叫以本地呼叫方式呼叫服務;

client stub接收到呼叫後負責將方法、引數等組裝成能夠進行網路傳輸的訊息體;

client stub找到服務位址,並將訊息傳送到服務端;

server stub收到訊息後進行解碼;

server stub根據解碼結果呼叫本地的服務;

本地服務執行並將結果返回給server stub;

server stub將返回結果打包成訊息並傳送至消費方;

client stub接收到訊息,並進行解碼;

服務消費方得到最終結果。

rpc的目標就是要2~8這些步驟都封裝起來,讓使用者對這些細節透明。

rpc可以通過http來實現(grpc基於http2.0),也可以通過socket自己實現一套協議來實現.

rpc ******hello(person) returns (result) {}

rpc serverstreamhello(person) returns (stream result) {}

rpc clientstreamhello(stream person) returns (result) {}

rpc bistreamhello(stream person) returns (stream result) {}

******.proto

syntax = "proto3";

package testrpc;

service testrpc

rpc serverstream (emit) returns (stream on){}

rpc clientstream (stream emit) returns (on){}

rpc bothstream (stream emit) returns (stream on){}

}message emit

message on

service

package main

import (

"net"

"google.golang.org/grpc"

pb "google.golang.org/grpc/examples/test/proto"

"google.golang.org/grpc/reflection"

"fmt"

"golang.org/x/net/context"

"io"

)const (

port = ":50051"

)type server struct

func (s *server) ******(ctx context.context, in *pb.emit) (*pb.on, error) , nil

}func (s *server) serverstream(in *pb.emit, stream pb.testrpc_serverstreamserver) (error) ); err != nil

}return nil

}func (s *server) clientstream(stream pb.testrpc_clientstreamserver) (error) )

}pointcount++

}}func (s *server) bothstream(stream pb.testrpc_bothstreamserver) (error)

fmt.println(string(emit.type))

for i := 1; i < 3; i++ ); err != nil }}

return nil

}func main() )

reflection.register(s)

if err := s.serve(lis); err != nil

}

client

package main

import (

"google.golang.org/grpc"

pb "google.golang.org/grpc/examples/test/proto"

"golang.org/x/net/context"

"time"

"log"

"io"

)const (

address = "localhost:50051"

)func main()

func test******(client pb.testrpcclient) )

log.printf("greeting: %s", r)

}func testserverstream(client pb.testrpcclient) )

if err != nil

for

if err != nil

log.println(feature)

}}func testclientstream(client pb.testrpcclient)

var points pb.emit

for i := 0; i < 10; i++

for _, point := range points

}reply, err := stream.closeandrecv()

if err != nil

log.printf("route summary: %v", reply)

}func testbothstream(client pb.testrpcclient)

var points pb.emit

for i := 0; i < 10; i++

waitc := make(chan struct{})

go func()

if err != nil

log.printf("got message %s = %d)", on.type, on.age)

}}()

for _, point := range points

}stream.closesend()

}

Go語言實現RPC程式設計

上節課我們對rpc知識做了介紹,講解了rpc的原理,通過圖示方式講解了rpc的內部執行過程。本節課,我們繼續來學習rpc相關的內容。在go語言官方 的pkg說明中,提供了官方支援的rpc包,具體鏈結如下 官方提供的rpc包完整的包名是 net rpc。根據官方的解釋,rpc包主要是提供通過網路訪問乙...

Go 網路程式設計

網頁伺服器 訪問並讀取頁面 websocket multi thread multi core tcp server.package main import flag fmt net syscall const maxread 25func main hostandport fmt.sprintf ...

go網路程式設計 http程式設計

一 web工作流程 web伺服器的工作原理可以簡單歸納為 1.客戶端通過tcp ip協議與伺服器建立連線 2.客戶端向伺服器傳送http協議請求包,請求伺服器裡的文件資源 3.伺服器向客戶端傳送http協議應答包,如果請求的資源中包含動態語言的內容,那麼伺服器會呼叫動態語言的解釋引擎負責處理 動態內...