注意
這不是這篇文章的最新版本。 關於目前版本,請參閱 本文的 .NET 10 版本。
警告
不再支援此版本的 ASP.NET Core。 如需詳細資訊,請參閱 .NET 和 .NET Core 支持原則。 關於目前版本,請參閱 本文的 .NET 10 版本。
.NET 支援使用 gRPC 進行處理序間通訊 (IPC)。 如需開始使用 gRPC 在處理序之間通訊的詳細資訊,請參閱使用 gRPC 進行處理序間通訊。
Unix 網域通訊端 (UDS) 是廣受支援的 IPC 傳輸,若用戶端和伺服器位於同一部電腦上,則會比 TCP 更有效率。 本文討論如何透過 UDS 設定 gRPC 通訊。
必要條件
- .NET 5 或更新版本
- Linux、macOS 或 Windows 10/Windows Server 2019 或更新版本
伺服器組態
Kestrel 支援 Unix 網域通訊端,而前者設定於 Program.cs:
var socketPath = Path.Combine(Path.GetTempPath(), "socket.tmp");
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.ListenUnixSocket(socketPath, listenOptions =>
{
listenOptions.Protocols = HttpProtocols.Http2;
});
});
上述範例:
- 在 Kestrel 中設定 ConfigureKestrel 的端點。
- 呼叫 ListenUnixSocket 以接聽具有指定路徑的 UDS。
- 建立未設定為使用 HTTPS 的 UDS 端點。 如需啟用 HTTPS 的詳細資訊,請參閱 Kestrel HTTPS 端點組態。
用戶端組態
GrpcChannel 支援透過自訂傳輸進行 gRPC 呼叫。 建立通道後,可以使用具有自訂 SocketsHttpHandler 的 ConnectCallback 加以設定。 回呼可讓用戶端透過自訂傳輸進行連線,然後透過該傳輸傳送 HTTP 要求。
注意
某些 GrpcChannel 連線能力,例如用戶端負載平衡和通道狀態,無法與 Unix 網域通訊端搭配使用。
Unix 網域通訊端連線 Factory 範例:
public class UnixDomainSocketsConnectionFactory
{
private readonly EndPoint endPoint;
public UnixDomainSocketsConnectionFactory(EndPoint endPoint)
{
this.endPoint = endPoint;
}
public async ValueTask<Stream> ConnectAsync(SocketsHttpConnectionContext _,
CancellationToken cancellationToken = default)
{
var socket = new Socket(AddressFamily.Unix, SocketType.Stream, ProtocolType.Unspecified);
try
{
await socket.ConnectAsync(this.endPoint, cancellationToken).ConfigureAwait(false);
return new NetworkStream(socket, true);
}
catch
{
socket.Dispose();
throw;
}
}
}
使用自訂連線 Factory 建立通道:
public static readonly string SocketPath = Path.Combine(Path.GetTempPath(), "socket.tmp");
public static GrpcChannel CreateChannel()
{
var udsEndPoint = new UnixDomainSocketEndPoint(SocketPath);
var connectionFactory = new UnixDomainSocketsConnectionFactory(udsEndPoint);
var socketsHttpHandler = new SocketsHttpHandler
{
ConnectCallback = connectionFactory.ConnectAsync
};
return GrpcChannel.ForAddress("http://localhost", new GrpcChannelOptions
{
HttpHandler = socketsHttpHandler
});
}
使用上述程式碼建立的通道會透過 Unix 網域通訊端傳送 gRPC 呼叫。