【问题标题】:grpc server port sharinggrpc服务器端口共享
【发布时间】:2021-01-15 09:15:52
【问题描述】:

我正在挖掘 grpc 作为 WCF 的替代品。我正在使用 .Net 5 并寻找独立的 服务器解决方案(不涉及 ASP --> Concole 应用程序)。这已经在很大程度上限制了可用的提示和教程:-(

使用包 grpc.Core (2.34.0)、grpc.Tools (2.34.0)、grpc.Net.Common (2.34.0) 和 Google.Protobuf (3.14.0) 很容易生成一个基本的服务器(GreeterImpl 来自一些教程):

Server server = new Server();
server.Services.Add(Greeter.BindService(new GreeterImpl()));
server.Ports.Add(new ServerPort("localhost", 5001, ServerCredentials.Insecure));

server.Start();

Console.ReadKey();

这很好用。服务器监听 5001 端口。

在 WCF 自托管(基于 http.sys)中,托管多个 WCF 服务器非常容易 通过指定不同的目录(精简代码):

第一次大会

List<Uri> baseAddresses = new List<Uri>();

baseAddresses.Add(new Uri("http://localhost:5001/Service1.svc"));
host = new ServiceHost(typeof(GenericService), baseAddresses.ToArray());
host.Open();

第二次组装

List<Uri> baseAddresses = new List<Uri>();

baseAddresses.Add(new Uri("http://localhost:5001/Service2.svc"));
host = new ServiceHost(typeof(GenericService), baseAddresses.ToArray());
host.Open();

它甚至可以与在端口 5001 上为其他东西提供服务的现有 IIS 一起工作


如何使用相同的端口但不同的目录启动第二台服务器(不同的程序集)?
我找不到任何关于如何实现这一目标的建议。

【问题讨论】:

  • 附带说明:如果您从 WCF 迁移,protobuf-net.Grpc 可能对您有用;见:github.com/protobuf-net/protobuf-net.Grpc/tree/main/examples/…; protobuf-net.Grpc 在客户端和服务器上都可以与 Google (Grpc.Core) 和 Microsoft 传输一起使用
  • @MarcGravell 谢谢你会更深入地了解它
  • WCF中有端口共享功能。查了微软文档中关于gRPC的介绍,gRPC中好像没有这个功能。

标签: c# wcf grpc


【解决方案1】:

要在同一个端口上运行,它必须是同一个Server 实例的一部分;这实际上意味着在使用不同的服务实例调用.Start() 之前多次调用server.Services.Add(...)(在同一个server 实例上)。为此,您可能需要编排代码,以便在尝试创建服务器之前识别所有服务。部分原因在于 Grpc.Core 不使用 Http.Sys - 它是 chttp2 的包装器,不提供主动端口共享。但实际上:这是一个非常常见的限制即使在可能使用操作系统辅助的系统中也是如此。

【讨论】:

  • 在我们的托管环境中,我仅限于将端口 443 用于入站流量。仍然需要几个完全独立的 grpc 服务器实例。
  • @TomB 你可以很高兴地拥有几个独立的 grpc 服务,它们都运行在同一个服务器实例中;你不能在同一个端口上有多个独立的 grpc 服务器(每个都有一个服务)。这就是它的工作原理;您要求的不是 API 提供的东西。请问:多服务器在这里对你很重要的具体原因是什么?它与托管多个服务的单个服务器有何区别?
  • 原因很简单。我的程序的多个完全独立的实例使用相同的端口在同一台机器上同时运行(见上面的评论)。没有 grpc 主服务器然后路由数据。只是使用相同端口的 1:1 连接,但在 WCF 中应尽可能使用不同的目录
  • @TomB 哦,“目录”是指在文件系统上,有多个单独的进程?我假设您的意思是简单的路由,即“/foo/whatever”与“/bar/something”的http2端点(很好);如果它们是单独的进程:那是行不通的,AFAIK - 然而,可能有一些我从未听说过的超级秘密巫术可以实现这一点;不过,我没有屏住呼吸
猜你喜欢
  • 2018-05-13
  • 2021-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-24
  • 1970-01-01
  • 1970-01-01
  • 2019-03-30
相关资源
最近更新 更多