grpc 可以傳遞context嘛 gRPC入門

2021-10-13 17:22:03 字數 4435 閱讀 4289

什麼是rpc,rpc和http的區別,為什麼要用rpc

使用者和訂單肯定是分不開的,分離成為兩個系統不同的主機不同的程序以後如何進行互動,可以通過http或者rpc,http的優點是:簡單、通用、開發方便。相較http rpc的優點是:長連線(不必像http 3次握手)、rpc一般都有註冊中心,有豐富的監控管理;

一般來說,rpc服務主要是針對大型企業的,而http服務主要是針對小企業的,因為rpc效率更高,而http服務開發迭代會更快。

解壓bin/protoc 新增環境變數

go get -u github.com/golang/protobuf/protoc-gen-go
【源**】

protoc 是 protocol buffers 的乙個工具,負責生成協議的序列化、反序列化相應語言的**,看個例子:

首先定義proto協議檔案:

// 這裡宣告協議版本,預設是proto2, 不向下相容

syntax = "proto3";

// 這裡指定 go 包名

package greeter;

// 定義要序列化的資訊的結構

message hellorequest

// 同乙個proto檔案中可以定義多個message type

message helloreply

// 定義介面

service greeter

具體的字段型別個語言對照可以檢視

編譯grpc生成序列化和反序列化**

protoc --go_out=plugins=grpc:. hello.proto
grpc外掛程式會為服務端和客戶端生成不同的介面:

//client api

type greeterclient inte***ce

// server api

type greeterserver inte***ce

定義結構體,實現服務端介面

註冊rpc 服務

啟用tcp服務,接受乙個鏈結啟用乙個goroutine,完成http/2握手,接收grpc請求,呼叫註冊函式

const port = ":4000"

// 定義結構體

type server struct{}

// 實現 service greeter 定義的介面

func (p *server) sayhello(ctx context.context, req *greeter.hellorequest) (*greeter.helloreply, error)

return reply, nil

}func main()

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

}

連線伺服器,grpc.withinsecure不需要許可權驗證

初始化客戶端,grpc自動生成的客戶端

呼叫api

func main() 

defer conn.close()

client := greeter.newgreeterclient(conn)

if err != nil

reply, err := client.sayhello(context.background(), &greeter.hellorequest)

if err != nil

fmt.println(reply.getmessage())

}

【源**】

定義protobuf

// 定義介面

service greeter

type greeter_routechatserver inte***ce
greeter.greeter_routechatserver 介面,有send/recv兩個方法相當於write/read,當前stream要當作單個connection,接下來的操作就是對stream的讀寫操作了

func (p *server) routechat(stream greeter.greeter_routechatserver) error 

return err

}err = stream.send(&greeter.helloreply)

if err != nil }}

同服務端建立長連線,間隔1秒傳送一次請求

func main() 

defer conn.close()

client := greeter.newgreeterclient(conn)

stream, err := client.routechat(context.background())

if err != nil

go func() ); err != nil

time.sleep(time.second)

}}()

for

log.fatal(err)

}fmt.println(reply.getmessage())}}

【原始碼閱讀】

找個優秀的包,godoc搜尋 pubsub 看到docker的pubsub引用最多,而且和第二名差距甚大,決定使用docker提供的pubsub

本地使用發布訂閱:

p := pubsub.newpublisher(100*time.millisecond, 10)

c := p.subscribe()

p.publish("hi")

msg :=

fmt.println(msg)

使用grpc 實現 發布訂閱模式, 建立protobuf檔案

syntax = "proto3";

package douyacun;

message topic

message pubsubmessage

message publishrequest

message publishresponse

service publisher

type server struct 

func (s *server) publish(c context.context, pub *douyacun.publishrequest) (*douyacun.publishresponse, error) , nil

}func (s *server) subscribe(req *douyacun.topic, stream douyacun.publisher_subscribeserver) error ) bool

if it, ok := v.(*douyacun.publishrequest); ok

}return false

})for v := range ch }}

return nil

}

這樣就可以多啟動幾個訂閱程序

cc, err := grpc.dial(":12345", grpc.withinsecure())

if err != nil

client := douyacun.newpublisherclient(cc)

stream, err := client.subscribe(context.background(), &douyacun.topic)

if err != nil

for

log.fatal(err)

} fmt.printf("新訊息:%sn", msg.string())

}

cc, err := grpc.dial(":12345", grpc.withinsecure())

if err != nil

client := douyacun.newpublisherclient(cc)

for ,

messages: &douyacun.pubsubmessage,

})if err != nil

fmt.println(resp.messageid)

time.sleep(time.second)

}

grpc入門 (douyacun)​www.douyacun.com

React 使用Context傳遞引數

extends react component extends react component extends react component props themedbutton props theme consumer 當provider發生資料變更時,會觸發到 consumer 發生渲染,所有...

react中context傳遞資料

在乙個典型的 react 應用中,資料是通過 props 屬性自上而下 由父及子 進行傳遞的,但這種做法對於某些型別的屬性而言是極其繁瑣的 例如 地區偏好,ui 主題 這些屬性是應用程式中許多元件都需要的。context 提供了一種在元件之間共享此類值的方式,而不必顯式地通過元件樹的逐層傳遞 pro...

Intent傳遞資料時,可以傳遞哪些型別資料?

在android應用的開發中,如果我們需要在不同的模組 比如不同的activity之間 之間傳遞資料,通常有以下兩種方法 1.利用intent物件攜帶資料 通過查詢intent bundle的api文件,我們可以獲知,intent bundle支援傳遞基本型別的資料和基本型別的陣列資料,以及stri...