2016-12-24 193 views
2

我正在實施一個簡單的grpc服務發現。我想要做的一件事是跟蹤當前服務的客戶數量,服務會將其報告給服務註冊中心。 grpc服務器API會提供這樣的信息嗎?我在這裏遇到了一個類似的問題。 https://github.com/grpc/grpc-java/issues/779grpc活動客戶端/頻道數

在響應的第1點,有人提到通過流API跟蹤所有傳入的rpc。我到底該怎麼做?

以下是我想要實現的rpc示例,RegisterInstance將充當「pinger」,服務器將使用etcd的ttl來檢查服務的活躍性。並且註冊表將使用connected_client來確定在註冊表中註冊了多個相同服務類型時要將哪個服務ip發送回客戶端。我的問題是如何從服務端獲得connected_clients

syntax = "proto3"; 

package registry_grpc; 

service ServiceRegistry{ 
    rpc GetInstance(ServiceRequest) returns(ServiceInstance) {} 
    rpc RegisterInstance(ServiceInstance) returns(ServiceInstance) {} 
} 


message ServiceRequest{ 
    string service_type = 1; 
} 

message ServiceInstance{ 
    int32 id = 1; 
    int32 connected_clients = 2; 
    string service_type = 3; 
    string host_address = 4; 
    int32 port = 5; 
} 

編輯

我發現,它可能每個傳入RPC調用攔截。通過這種方式,我可以在最後一秒報告例如傳入連接的數量。我想它可以作爲工作量的代理。

回答

2

ServerBuilderaddTransportFilter(),它允許你安裝一個ServerTransportFilter,你在哪裏得到的通知是創建和終止的連接(即運輸)時。

+0

此功能在所有語言中的可用性是什麼?無論如何,看起來對不同語言來說這樣做的方式並不相同。它是否通知每個連接或每個rpc呼叫?例如,在python中,'add_generic_rpc_handlers'和golang'UnaryInterceptor'可以爲每個rpc調用提供通知,但不是每個連接。 –

+0

不確定其他語言。每個連接都會通知Java的'ServerTransportFilter'。 –