gRPC ile işlemler arası iletişim
istemci ve hizmet arasındaki gRPC çağrıları genellikle TCP Yuvaları üzerinden gönderilir. TCP bir ağ üzerinden iletişim kurmak için tasarlandı. İstemci ve hizmet aynı makinede olduğunda, Işlem arası iletişim (IPC) TCP 'den daha etkilidir. Bu belgede, bkz..
Sunucu yapılandırması
Özel aktarımlar tarafından desteklenir Kestrel . Kestrelprogram. cs' de yapılandırılır:
public static readonly string SocketPath = Path.Combine(Path.GetTempPath(), "socket.tmp");
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
webBuilder.ConfigureKestrel(options =>
{
if (File.Exists(SocketPath))
{
File.Delete(SocketPath);
}
options.ListenUnixSocket(SocketPath, listenOptions =>
{
listenOptions.Protocols = HttpProtocols.Http2;
});
});
});
Önceki örnek:
- Kestrelİçindeki uç noktaları yapılandırır
ConfigureKestrel. - ListenUnixSocketBelirtilen yola sahip bir UNIX etki alanı yuvasını (UDS) dinlemek için çağrılar.
- HTTPS kullanmak üzere yapılandırılmayan bir UıDS uç noktası oluşturur. HTTPS 'yi etkinleştirme hakkında bilgi için bkz. Kestrel https uç noktası yapılandırması.
Kestrel , UDS uç noktaları için yerleşik desteğe sahiptir. UDS, Windows Linux, macOS ve modern sürümlerindedesteklenir.
İstemci yapılandırması
GrpcChannel Özel aktarımlar üzerinde gRPC çağrıları yapmayı destekler. Bir kanal oluşturulduğunda, özel bir içeren ile yapılandırılabilir SocketsHttpHandler ConnectCallback . Geri arama, istemcinin özel aktarımlar üzerinden bağlantı yapmasına ve ardından bu aktarım üzerinden HTTP istekleri göndermesini sağlar.
UNIX etki alanı yuvaları bağlantı fabrikası örneği:
public class UnixDomainSocketConnectionFactory
{
private readonly EndPoint _endPoint;
public UnixDomainSocketConnectionFactory(EndPoint endPoint)
{
_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(_endPoint, cancellationToken).ConfigureAwait(false);
return new NetworkStream(socket, true);
}
catch
{
socket.Dispose();
throw;
}
}
}
Özel bağlantı fabrikası kullanarak bir kanal oluşturun:
public static readonly string SocketPath = Path.Combine(Path.GetTempPath(), "socket.tmp");
public static GrpcChannel CreateChannel()
{
var udsEndPoint = new UnixDomainSocketEndPoint(SocketPath);
var connectionFactory = new UnixDomainSocketConnectionFactory(udsEndPoint);
var socketsHttpHandler = new SocketsHttpHandler
{
ConnectCallback = connectionFactory.ConnectAsync
};
return GrpcChannel.ForAddress("http://localhost", new GrpcChannelOptions
{
HttpHandler = socketsHttpHandler
});
}
Yukarıdaki kod kullanılarak oluşturulan kanallar, UNIX etki alanı Yuvaları üzerinden gRPC çağrıları gönderir. Diğer IPC teknolojileri için destek, ve içindeki genişletilebilirlik kullanılarak uygulanabilir Kestrel SocketsHttpHandler .