第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

通過特定端口發(fā)送 GRPC 通信

通過特定端口發(fā)送 GRPC 通信

Go
慕斯王 2023-07-10 14:21:06
我正在運行一個 GRPC 服務(wù)器(服務(wù)器 A),偵聽特定端口。我希望能夠向另一臺服務(wù)器(服務(wù)器 B)發(fā)送通信,并讓服務(wù)器 B 記錄服務(wù)器 A 連接的傳入地址,以便稍后可以聯(lián)系服務(wù)器 A。在服務(wù)器 A 上,我監(jiān)聽端口并創(chuàng)建如下上下文:lis, err := net.Listen("tcp", "0.0.0.0:6000")ctx, cancel := context.WithTimeout(context.Background(),    10000*time.Millisecond)然后像這樣創(chuàng)建連接:connection, err = grpc.DialContext(ctx, server2Address,grpc.WithInsecure(), grpc.WithBlock())在最終向服務(wù)器 B 上的端點發(fā)送消息之前,該端點嘗試讀取服務(wù)器 A 傳入連接的 IP 地址info, _ := peer.FromContext(ctx)fmt.Printf(info.Addr.String()) // Returns a random port, NOT 6000,然而,服務(wù)器 B 打印的結(jié)果端口是隨機的,例如 62056,而不是預(yù)期的 6000。我的假設(shè)是,在服務(wù)器 A 上,GRPC 從隨機端口撥號 - 是否可以強制 GRPC 從端口 6000 而不是隨機端口撥號?
查看完整描述

1 回答

?
HUX布斯

TA貢獻1876條經(jīng)驗 獲得超6個贊

您可以像這樣指定源端口:


cc, err := grpc.Dial("127.0.0.1:6001", grpc.WithInsecure(),

? ? grpc.WithContextDialer(func(ctx context.Context, addr string) (net.Conn, error) {

? ? ? ? dst, err := net.ResolveTCPAddr("tcp", addr)

? ? ? ? if err != nil {

? ? ? ? ? ? return nil, err

? ? ? ? }

? ? ? ? src := &net.TCPAddr{

? ? ? ? ? ? IP:? ?net.ParseIP("127.0.0.1"),

? ? ? ? ? ? Port: 6000,

? ? ? ? }

? ? ? ? return net.DialTCP("tcp", src, dst)

? ? }))

但是,如果您的服務(wù)器正在偵聽同一端口,這將導(dǎo)致錯誤:


panic: dial tcp 127.0.0.1:6000->127.0.0.1:6001: bind: address already in use

另一種方法是將地址作為元數(shù)據(jù)傳遞。在客戶端您執(zhí)行以下操作:


ctx := context.Background()

ctx = metadata.NewOutgoingContext(ctx, metadata.Pairs("address", "127.0.0.1:6000"))

res, err := grpc_health_v1.NewHealthClient(cc).Check(ctx, &grpc_health_v1.HealthCheckRequest{

? ? Service: "test",

})

在服務(wù)器上:


func (s *server) Check(ctx context.Context, req *grpc_health_v1.HealthCheckRequest) (*grpc_health_v1.HealthCheckResponse, error) {

? ? if md, ok := metadata.FromIncomingContext(ctx); ok {

? ? ? ? addr := md.Get("address")

? ? ? ? // addr == "127.0.0.1:6000"

? ? }


? ? return &grpc_health_v1.HealthCheckResponse{

? ? ? ? Status: grpc_health_v1.HealthCheckResponse_SERVING,

? ? }, nil

}

第三種方法是使用流式傳輸。



查看完整回答
反對 回復(fù) 2023-07-10
  • 1 回答
  • 0 關(guān)注
  • 237 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號