Note
ãã®ãã¼ã¸ã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ è¦ã§ãã ãµã¤ã³ã¤ã³ã¾ãã¯ãã£ã¬ã¯ããªã®å¤æ´ã試ããã¨ãã§ãã¾ãã
ãã®ãã¼ã¸ã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ è¦ã§ãã ãã£ã¬ã¯ããªã®å¤æ´ã試ããã¨ãã§ãã¾ãã
Note
ããã¯ããã®è¨äºã®ææ°ãã¼ã¸ã§ã³ã§ã¯ããã¾ããã ç¾å¨ã®ãªãªã¼ã¹ã«ã¤ãã¦ã¯ã ãã®è¨äºã® .NET 10 ãã¼ã¸ã§ã³ãåç §ãã¦ãã ããã
Warning
ãã®ãã¼ã¸ã§ã³ã® ASP.NET Core ã¯ãµãã¼ã対象ããé¤å¤ããã¾ããã 詳細ã«ã¤ãã¦ã¯ã .NET ããã³ .NET Core ãµãã¼ã ããªã·ã¼ãåç §ãã¦ãã ããã ç¾å¨ã®ãªãªã¼ã¹ã«ã¤ãã¦ã¯ã ãã®è¨äºã® .NET 10 ãã¼ã¸ã§ã³ãåç §ãã¦ãã ããã
使è : James Newton-King
gRPC ã¯è¨èªã«ä¾åããªã髿§è½ãªãªã¢ã¼ã ããã·ã¼ã¸ã£ ã³ã¼ã« (RPC) ãã¬ã¼ã ã¯ã¼ã¯ã§ãã
gRPC ã®ä¸»ãªå©ç¹:
- ææ°ã®é«æ§è½è»½é RPC ãã¬ã¼ã ã¯ã¼ã¯ã
- æ¢å®ã§ãããã³ã« ãããã¡ã¼ã使ç¨ããå¥ç´åªå ã® API éçºãè¨èªã«ä¾åããªãå®è£ ãå¯è½ã«ãã¾ãã
- å³å¯ã«åæå®ããããµã¼ãã¼ã¨ã¯ã©ã¤ã¢ã³ããçæããç®çã§ããã¾ãã¾ãªè¨èªã§å©ç¨ã§ãããã¼ã«ã
- ã¯ã©ã¤ã¢ã³ãããµã¼ãã¼ãåæ¹åã¹ããªã¼ãã³ã°å¼ã³åºãããµãã¼ããã¾ãã
- Protobuf ãã¤ã㪠ã·ãªã¢ã«åã§ãããã¯ã¼ã¯ã®ä½¿ç¨çãæ¸ããã¾ãã
以ä¸ã®å©ç¹ãã gRPC ã¯ä»¥ä¸ã«æé©ã§ãã
- å¹çæ§ãéè¦ã¨ãªã軽éã®ãã¤ã¯ããµã¼ãã¹ã
- éçºã«è¤æ°ã®è¨èªãå¿ è¦ã«ãªãå¤è¨èªã·ã¹ãã ã
- ã¹ããªã¼ãã³ã°ã®è¦æ±ã¾ãã¯å¿çãå¦çããå¿ è¦ããããã¤ã³ããã¼ãã¤ã³ãã®ãªã¢ã«ã¿ã¤ã ãµã¼ãã¹ã
.proto ãã¡ã¤ã«ã«å¯¾ãã C# ã®ãã¼ã«ã®ãµãã¼ã
gRPC ã§ã¯ãAPI éçºã«å¯¾ãã¦ã³ã³ãã©ã¯ãåªå
ã®ã¢ããã¼ãã使ããã¾ãã ãµã¼ãã¹ã¨ã¡ãã»ã¼ã¸ã¯ã.proto ãã¡ã¤ã«ã§å®ç¾©ããã¦ãã¾ãã
syntax = "proto3";
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply);
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
ãµã¼ãã¹ãã¯ã©ã¤ã¢ã³ããã¡ãã»ã¼ã¸ã® .NET åã¯ãããã¸ã§ã¯ãã« .proto ãã¡ã¤ã«ãå«ãããã¨ã§èªåçã«çæããã¾ãã
- Grpc.Tools ããã±ã¼ã¸ã«ããã±ã¼ã¸åç §ã追å ãã¾ãã
-
.protoé ç®ã°ã«ã¼ãã«<Protobuf>ãã¡ã¤ã«ã追å ãã¾ãã
<ItemGroup>
<Protobuf Include="Protos\greet.proto" />
</ItemGroup>
gRPC ãã¼ã« ãµãã¼ãã«ã¤ãã¦è©³ããã¯ããC# ã使ç¨ãã gRPC ãµã¼ãã¹ããåç §ãã¦ãã ããã
ASP.NET Core ã§ã® gRPC ãµã¼ãã¹
gRPC ãµã¼ãã¹ã¯ ASP.NET Core ã§ãã¹ãã§ãã¾ãã ãµã¼ãã¹ã¯ããã°ãä¾åé¢ä¿ã®æ³¨å ¥ (DI)ãèªè¨¼ãèªå¯ãªã©ã® ASP.NET Core æ©è½ã¨å®å ¨ã«çµ±åããã¦ãã¾ãã
ASP.NET Core ã¢ããªã« gRPC ãµã¼ãã¹ã追å ãã
gRPC ã«ã¯ Grpc. AspNetCore ããã±ã¼ã¸ãå¿ è¦ã§ãã .NET ã¢ããªã§ã® gRPC ã®æ§æã®è©³ç´°ã«ã¤ãã¦ã¯ããgRPC ãæ§æããããåç §ãã¦ãã ããã
gRPC ãµã¼ãã¹ ããã¸ã§ã¯ã ãã³ãã¬ã¼ã
ASP.NET Core gRPC ãµã¼ãã¹ã®ããã¸ã§ã¯ã ãã³ãã¬ã¼ãã«ã¯ãã¹ã¿ã¼ã¿ã¼ ãµã¼ãã¹ãç¨æããã¦ãã¾ãã
public class GreeterService(ILogger<GreeterService> logger) : Greeter.GreeterBase
{
public override Task<HelloReply> SayHello(HelloRequest request,
ServerCallContext context)
{
logger.LogInformation("Saying hello to {Name}", request.Name);
return Task.FromResult(new HelloReply
{
Message = "Hello " + request.Name
});
}
}
public class GreeterService : Greeter.GreeterBase
{
private readonly ILogger<GreeterService> _logger;
public GreeterService(ILogger<GreeterService> logger)
{
_logger = logger;
}
public override Task<HelloReply> SayHello(HelloRequest request,
ServerCallContext context)
{
_logger.LogInformation("Saying hello to {Name}", request.Name);
return Task.FromResult(new HelloReply
{
Message = "Hello " + request.Name
});
}
}
GreeterService 㯠GreeterBase åãç¶æ¿ãã¾ããããã¯ãGreeter ãã¡ã¤ã«ã® .proto ãµã¼ãã¹ããçæããã¾ãã ãµã¼ãã¹ã¯ãProgram.cs å
ã§ã¯ã©ã¤ã¢ã³ããã¢ã¯ã»ã¹ã§ããããã«ãªãã¾ãã
app.MapGrpcService<GreeterService>();
ASP.NET Core ã§ã® gRPC ãµã¼ãã¹ã«ã¤ãã¦è©³ããã¯ããASP.NET Core ã使ç¨ãã gRPC ãµã¼ãã¹ããåç §ãã¦ãã ããã
.NET ã¯ã©ã¤ã¢ã³ãã使ç¨ã㦠gRPC ãµã¼ãã¹ãå¼ã³åºã
gRPC ã¯ã©ã¤ã¢ã³ãã¯ã.proto ãã¡ã¤ã«ããçæãããå
·è±¡ã¯ã©ã¤ã¢ã³ãåã§ãã å
·è±¡ gRPC ã¯ã©ã¤ã¢ã³ãã«ã¯ã.proto ãã¡ã¤ã«å
ã® gRPC ãµã¼ãã¹ã«å¤æããããã®ã¡ã½ãããå«ã¾ãã¾ãã
var channel = GrpcChannel.ForAddress("https://localhost:5001");
var client = new Greeter.GreeterClient(channel);
var response = await client.SayHelloAsync(
new HelloRequest { Name = "World" });
Console.WriteLine(response.Message);
gRPC ã¯ã©ã¤ã¢ã³ãã¯ãã£ãã«ã使ã£ã¦ä½æããããã㯠gRPC ãµã¼ãã¹ã¸ã®é·ææ¥ç¶ã表ãã¾ãã ãã£ãã«ã¯ GrpcChannel.ForAddress ã使ã£ã¦ä½æã§ãã¾ãã
ã¯ã©ã¤ã¢ã³ãã®ä½æã¨ããã¾ãã¾ãªãµã¼ãã¹ ã¡ã½ããã®å¼ã³åºãã«ã¤ãã¦è©³ããã¯ãã.NET ã¯ã©ã¤ã¢ã³ãã使ç¨ã㦠gRPC ãµã¼ãã¹ãå¼ã³åºãããåç §ãã¦ãã ããã
ãã®ä»ã®ãªã½ã¼ã¹
gRPC ã¯è¨èªã«ä¾åããªã髿§è½ãªãªã¢ã¼ã ããã·ã¼ã¸ã£ ã³ã¼ã« (RPC) ãã¬ã¼ã ã¯ã¼ã¯ã§ãã
gRPC ã®ä¸»ãªå©ç¹:
- ææ°ã®é«æ§è½è»½é RPC ãã¬ã¼ã ã¯ã¼ã¯ã
- æ¢å®ã§ãããã³ã« ãããã¡ã¼ã使ç¨ããå¥ç´åªå ã® API éçºãè¨èªã«ä¾åããªãå®è£ ãå¯è½ã«ãã¾ãã
- å³å¯ã«åæå®ããããµã¼ãã¼ã¨ã¯ã©ã¤ã¢ã³ããçæããç®çã§ããã¾ãã¾ãªè¨èªã§å©ç¨ã§ãããã¼ã«ã
- ã¯ã©ã¤ã¢ã³ãããµã¼ãã¼ãåæ¹åã¹ããªã¼ãã³ã°å¼ã³åºãããµãã¼ããã¾ãã
- Protobuf ãã¤ã㪠ã·ãªã¢ã«åã§ãããã¯ã¼ã¯ã®ä½¿ç¨çãæ¸ããã¾ãã
以ä¸ã®å©ç¹ãã gRPC ã¯ä»¥ä¸ã«æé©ã§ãã
- å¹çæ§ãéè¦ã¨ãªã軽éã®ãã¤ã¯ããµã¼ãã¹ã
- éçºã«è¤æ°ã®è¨èªãå¿ è¦ã«ãªãå¤è¨èªã·ã¹ãã ã
- ã¹ããªã¼ãã³ã°ã®è¦æ±ã¾ãã¯å¿çãå¦çããå¿ è¦ããããã¤ã³ããã¼ãã¤ã³ãã®ãªã¢ã«ã¿ã¤ã ãµã¼ãã¹ã
.proto ãã¡ã¤ã«ã«å¯¾ãã C# ã®ãã¼ã«ã®ãµãã¼ã
gRPC ã§ã¯ãAPI éçºã«å¯¾ãã¦ã³ã³ãã©ã¯ãåªå
ã®ã¢ããã¼ãã使ããã¾ãã ãµã¼ãã¹ã¨ã¡ãã»ã¼ã¸ã¯ã.proto ãã¡ã¤ã«ã§å®ç¾©ããã¦ãã¾ãã
syntax = "proto3";
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply);
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
ãµã¼ãã¹ãã¯ã©ã¤ã¢ã³ããã¡ãã»ã¼ã¸ã® .NET åã¯ãããã¸ã§ã¯ãã« .proto ãã¡ã¤ã«ãå«ãããã¨ã§èªåçã«çæããã¾ãã
- Grpc.Tools ããã±ã¼ã¸ã«ããã±ã¼ã¸åç §ã追å ãã¾ãã
-
.protoé ç®ã°ã«ã¼ãã«<Protobuf>ãã¡ã¤ã«ã追å ãã¾ãã
<ItemGroup>
<Protobuf Include="Protos\greet.proto" />
</ItemGroup>
gRPC ãã¼ã« ãµãã¼ãã«ã¤ãã¦è©³ããã¯ããC# ã使ç¨ãã gRPC ãµã¼ãã¹ããåç §ãã¦ãã ããã
ASP.NET Core ã§ã® gRPC ãµã¼ãã¹
gRPC ãµã¼ãã¹ã¯ ASP.NET Core ã§ãã¹ãã§ãã¾ãã ãµã¼ãã¹ã¯ããã°ãä¾åé¢ä¿ã®æ³¨å ¥ (DI)ãèªè¨¼ãèªå¯ãªã©ã® ASP.NET Core æ©è½ã¨å®å ¨ã«çµ±åããã¦ãã¾ãã
ASP.NET Core ã¢ããªã« gRPC ãµã¼ãã¹ã追å ãã
gRPC ã«ã¯ Grpc. AspNetCore ããã±ã¼ã¸ãå¿ è¦ã§ãã .NET ã¢ããªã§ã® gRPC ã®æ§æã®è©³ç´°ã«ã¤ãã¦ã¯ããgRPC ãæ§æããããåç §ãã¦ãã ããã
gRPC ãµã¼ãã¹ ããã¸ã§ã¯ã ãã³ãã¬ã¼ã
gRPC ãµã¼ãã¹ã®ããã¸ã§ã¯ã ãã³ãã¬ã¼ãã«ã¯ãã¹ã¿ã¼ã¿ã¼ ãµã¼ãã¹ãç¨æããã¦ãã¾ãã
public class GreeterService : Greeter.GreeterBase
{
private readonly ILogger<GreeterService> _logger;
public GreeterService(ILogger<GreeterService> logger)
{
_logger = logger;
}
public override Task<HelloReply> SayHello(HelloRequest request,
ServerCallContext context)
{
_logger.LogInformation("Saying hello to {Name}", request.Name);
return Task.FromResult(new HelloReply
{
Message = "Hello " + request.Name
});
}
}
GreeterService 㯠GreeterBase åãç¶æ¿ãã¾ããããã¯ãGreeter ãã¡ã¤ã«ã® .proto ãµã¼ãã¹ããçæããã¾ãã ãµã¼ãã¹ã¯ãStartup.cs å
ã§ã¯ã©ã¤ã¢ã³ããã¢ã¯ã»ã¹ã§ããããã«ãªãã¾ãã
app.UseEndpoints(endpoints =>
{
endpoints.MapGrpcService<GreeterService>();
});
ASP.NET Core ã§ã® gRPC ãµã¼ãã¹ã«ã¤ãã¦è©³ããã¯ããASP.NET Core ã使ç¨ãã gRPC ãµã¼ãã¹ããåç §ãã¦ãã ããã
.NET ã¯ã©ã¤ã¢ã³ãã使ç¨ã㦠gRPC ãµã¼ãã¹ãå¼ã³åºã
gRPC ã¯ã©ã¤ã¢ã³ãã¯ã.proto ãã¡ã¤ã«ããçæãããå
·è±¡ã¯ã©ã¤ã¢ã³ãåã§ãã å
·è±¡ gRPC ã¯ã©ã¤ã¢ã³ãã«ã¯ã.proto ãã¡ã¤ã«å
ã® gRPC ãµã¼ãã¹ã«å¤æããããã®ã¡ã½ãããå«ã¾ãã¾ãã
var channel = GrpcChannel.ForAddress("https://localhost:5001");
var client = new Greeter.GreeterClient(channel);
var response = await client.SayHelloAsync(
new HelloRequest { Name = "World" });
Console.WriteLine(response.Message);
gRPC ã¯ã©ã¤ã¢ã³ãã¯ãã£ãã«ã使ã£ã¦ä½æããããã㯠gRPC ãµã¼ãã¹ã¸ã®é·ææ¥ç¶ã表ãã¾ãã ãã£ãã«ã¯ GrpcChannel.ForAddress ã使ã£ã¦ä½æã§ãã¾ãã
ã¯ã©ã¤ã¢ã³ãã®ä½æã¨ããã¾ãã¾ãªãµã¼ãã¹ ã¡ã½ããã®å¼ã³åºãã«ã¤ãã¦è©³ããã¯ãã.NET ã¯ã©ã¤ã¢ã³ãã使ç¨ã㦠gRPC ãµã¼ãã¹ãå¼ã³åºãããåç §ãã¦ãã ããã