gRPC服务器端口共享

3
我正在研究使用grpc替换WCF。我正在使用.Net 5,并寻找一个独立的服务器解决方案(不涉及ASP,只是控制台应用程序)。这已经大大限制了可用的提示和教程 :-(
使用包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();

它甚至可以在现有的IIS上以5001端口为服务的情况下运行。


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

顺便提一下,如果你正在从WCF迁移,protobuf-net.Grpc可能是一个有用的工具,可以查看:https://github.com/protobuf-net/protobuf-net.Grpc/tree/main/examples/wcf-port;protobuf-net.Grpc可以在客户端和服务器上使用Google(Grpc.Core)和Microsoft传输。 - Marc Gravell
@MarcGravell 谢谢,我会更深入地研究它。 - TomB
WCF 中有一个端口共享功能。我查看了 Microsoft 文档中关于 gRPC 的介绍,似乎 gRPC 中没有这样的功能。 - Ding Peng
1个回答

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

在我们的托管环境中,我只能使用端口443来处理入站流量。仍然需要几个完全独立的grpc服务器实例。 - TomB
1
@TomB,您可以在同一服务器实例中运行多个独立的grpc 服务,但是您不能在同一端口上拥有多个独立的grpc 服务器(每个服务器只有一个服务)。这就是它的工作方式;您所要求的API不提供此功能。我可以问一下:为什么在这里使用多个服务器很重要?与托管多个服务的单个服务器相比,它有何区别? - Marc Gravell
原因很简单。我的程序有多个完全独立的实例在同一台机器上同时运行,使用相同的端口(请参见上面的评论)。没有grpc主服务器来路由数据。只是使用相同的端口进行1:1连接,但应尽可能使用不同的目录,就像在WCF中一样。 - TomB
@TomB 噢,你指的是文件系统中具有多个独立进程的“目录”?我本来以为你只是指路由,即在“/foo/whatever”与“/bar/something”上使用http2端点(这样没问题)。如果它们是独立进程:据我所知,这是不可能的 - 然而,可能有一些超级秘密的巫术可以实现这一点,我从未听说过;但我不抱太大希望。 - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接