C# gRPC Server
C#에서는 gRPC Server를 ASP.NET과 .NET Core기반으로 지원하고 있습니다. 따라서 비쥬얼 스튜디오를 사용하고 계시다면 ASP.NET, .NET Core를 설치를 해주셔야 합니다.
gRPC가 HTTP2를 사용하기 때문에 웹 서버 기반인 ASP.NET, .NET Core를 설치를 해야 합니다.
1. gRPC 서비스 프로젝트 생성
새 프로젝트 만들기 – 템플릿 검색(grpc)
gRPC 서비스를 선택하고 프로젝트를 생성해주면 됩니다.
2. gRPC 서버 구현
gRPC 서비스를 생성하게 되면 아래와 같은 파일들이 자동적으로 생성이 됩니다.
가장 신경 써야 할 부분은 서버 측이기 때문에 클라이언트에게 Return해줄 Service의 내부 코드를 작성해주어야 한다는 것과, 클라이언트 측과 .proto 타입이 같아야 한다는 것입니다.
특히 .proto 타입의 namespace를 같게 설정해주셔야 합니다.
3. proto 파일 작성
syntax = "proto3";
option csharp_namespace = "GrpcGreeter";
package greet;
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply);
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings.
message HelloReply {
string message = 1;
}
Protos/greet.proto 경로로 설정해서 위 코드를 작성합니다.
4. GreeterService 작성
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)
{
// ServerCallContext는 모든 ASP.NET API의 HttpContext에 대한 모든 권한을 제공하지 않는데,
// GetHttpContext 확장 메서드는 HTTP2 메시지를 나타내는 HttpContext의 모든 권한을 제공한다.
//var httpContext = context.GetHttpContext();
//var clientCertificate = httpContext.Connection.ClientCertificate;
return Task.FromResult(new HelloReply
{
Message = "Hello " + request.Name
});
}
}
Services/GreeterService.cs
클라이언트가 요청한 값을 리턴하기 위한 세부 내용을 코딩합니다.
Hello에 request.Name의 값이 추가되서 반환해 주네요.
5. 앱 환경 설정
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"Kestrel": {
"EndpointDefaults": {
"Protocols": "Http2"
}
}
}
Appsettings.json
서버의 로깅 옵션과 보안 옵션을 설정하기 위한 json 파일입니다.
이 파일은 Startup.cs 파일과 같은 역할을 하며 개발자는 json에 환경을 구성할지, Startup.cs에 환경을 구성할지 정하면 됩니다.
Startup.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
namespace gRPCService
{
public class Startup
{
// This method gets called by the runtime. Use this method to add services to the container.
// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
public void ConfigureServices(IServiceCollection services)
{
services.AddGrpc(); // 현재 서비스에 gRPC를 사용하도록 설정하는 메서드
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapGrpcService<GreeterService>(); // 라우팅 파이프라인에 gRPC 서비스를 추가
endpoints.MapGet("/", async context =>
{
await context.Response.WriteAsync("Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909");
});
});
}
}
}
Program.cs
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
// Additional configuration is required to successfully run gRPC on macOS.
// For instructions on how to configure Kestrel and gRPC clients on macOS, visit https://go.microsoft.com/fwlink/?linkid=2099682
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
// gRPC에 사용되는 Kestrel 엔드포인트는 TLS로 보호해야 하는데, appsettings.json에서 구현하거나
// 아니면 Program.cs에서 Kestrel 엔드포인트를 구성할 수 있음
//webBuilder.ConfigureKestrel(options =>
//{
// options.Listen(IPAddress.Any, 5001, listenOptions =>
// {
// listenOptions.Protocols = HttpProtocols.Http2;
// listenOptions.UseHttps("<path to .pfx file>",
// "<certificate password>");
// });
//});
//webBuilder.UseStartup<Startup>();
});
}
프로그램의 메인 함수로 위의 Startup.cs를 토대로 HostBuilder를 생성해 서버를 구동시킵니다.
launchSettings.json
{
"profiles": {
"gRPCService": {
"commandName": "Project",
"launchBrowser": false,
"applicationUrl": "https://localhost:5001",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
서버의 주소를 설정하는 json 파일입니다.
6. 실행 결과
gRCP 서버를 실행하고 클라이언트로 접속을 시키면 위와 같이 proto파일을 기반으로 통신을 하는 것을 확인할 수 있습니다.
참고 사이트
https://docs.microsoft.com/ko-kr/aspnet/core/grpc/?view=aspnetcore-3.1
https://grpc.io/docs/languages/csharp/quickstart/
'프로토콜 > gRPC' 카테고리의 다른 글
[gRPC] Protocol Buffer란? (0) | 2022.05.31 |
---|---|
[C#] gRPC Client (0) | 2020.09.03 |
[Java] gRPC Maven (3) | 2020.09.03 |
gRPC란? (0) | 2020.09.02 |