使用 gRPC 服务定义作为多个实例的接口

Using gRPC service definitions as an interface for multiple instances

假设我们有一个搜索服务

service Search {
  rpc Search (SearchRequest) returns (SearchReply) {}
}

message SearchRequest {
  string query = 1;
}

message SearchReply {
  repeated string message = 1;
}

现在,让我们考虑多个搜索引擎,它们都应该实现该接口以提供搜索。

我碰到的障碍是 gRPC 只允许单个 IP:PORT 对后面的搜索服务的单例。因此,在一个环境中集成多个搜索引擎的唯一方法是将每个搜索引擎放在不同的IP:PORT 后面,不可能将它们放在同一个端口上。

您不能在同一台服务器上拥有同一服务的多个实例。解决问题的方法主要有以下三种,具体取决于您的问题类型:

  1. 合并结果
  2. 包含一个请求参数
  3. 使用不同的服务名称

如果 "multiple search engines" 在语义上是等价的,则不需要单独的方法,而是使用聚合结果进行响应。

如果 "multiple search engines" 依赖于数据,则在 SearchRequest 中包含另一个参数,例如 string dataset = 2;

否则单独提供服务:ImageSearchWebSearch