기본카테고리

gRPC Server & Client 예제

DevReff 2023. 1. 16. 14:22




728x90

gRPC Server 구성

1. ASP.NET Core gRPC 서비스 프로젝트 생성


2. proto
파일 정의

syntax = "proto3";

 

option csharp_namespace = "GrpcServer";

 

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;

}


3. GreeterService.cs
동작 정의

using Grpc.Core;

 

using GrpcServer;

 

namespace GrpcServer.Services

{

    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)

        {

            return Task.FromResult(new HelloReply

            {

                Message = "Hello " + request.Name

            });

        }

    }

}


4. Program.cs
에서 GreeterService Mapping

using GrpcServer.Services;

 

var builder = WebApplication.CreateBuilder(args);

 

// 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

 

// Add services to the container.

builder.Services.AddGrpc();

 

var app = builder.Build();

 

// Configure the HTTP request pipeline.

app.MapGrpcService<GreeterService>();

app.MapGet("/", () => "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");

 

app.Run();


5. Properties
launchSettings.json 파일에 서비스 주소 정의 기타 옵션 설정

{

  "profiles": {

    "GrpcServer": {

      "commandName": "Project",

      "dotnetRunMessages": true,

      "launchBrowser": false,

      "applicationUrl": "http://localhost:5253;https://localhost:7253",

      "environmentVariables": {

        "ASPNETCORE_ENVIRONMENT": "Development"

      }

    }

  }

}


6. appsettings.json
파일에서 Protocols 정의 Log Level 지정

{

  "Logging": {

    "LogLevel": {

      "Default": "Information",

      "Microsoft.AspNetCore": "Warning"

    }

  },

  "AllowedHosts": "*",

  "Kestrel": {

    "EndpointDefaults": {

      "Protocols": "Http2"

    }

  }

}


7. appsettings.Development.json
파일에서 Develope 모드 일때 Info 로그가 찍히도록 Log Level 정의

{

  "Logging": {

    "LogLevel": {

      "Default": "Information",

      "Microsoft.AspNetCore": "Warning",

      "Microsoft.AspNetCore.Hosting": "Information",

      "Microsoft.AspNetCore.Routing.EndpointMiddleware": "Information"

    }

  }

}


8. Server
실행

web page 확인

 

gRPC Client 구성

1. 콘솔앱 프로젝트 생성

2. Server 에서 만들어진 proto 파일을 동일하게 Protos 폴더를 만들어 복사한다.

3. Nuget 설치
Google.Protobuf
Grpc.Net.Client
Grpc.Tools

4. 프로젝트파일 편집
<Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
부분을 Client 아래 처럼 바꾼다.
<Protobuf Include="Protos\greet.proto" GrpcServices="Client" /> 

<Project Sdk="Microsoft.NET.Sdk">

 

  <PropertyGroup>

    <OutputType>Exe</OutputType>

    <TargetFramework>net6.0</TargetFramework>

    <ImplicitUsings>enable</ImplicitUsings>

    <Nullable>enable</Nullable>

  </PropertyGroup>

 

  <ItemGroup>

    <None Remove="Protos\greet.proto" />

  </ItemGroup>

 

  <ItemGroup>

    <PackageReference Include="Google.Protobuf" Version="3.20.1" />

    <PackageReference Include="Grpc.Net.Client" Version="2.45.0" />

    <PackageReference Include="Grpc.Tools" Version="2.45.0">

      <PrivateAssets>all</PrivateAssets>

      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>

    </PackageReference>

  </ItemGroup>

 

  <ItemGroup>

    <Protobuf Include="Protos\greet.proto" GrpcServices="Client" />

  </ItemGroup>

 

</Project>


5. 
빌드/다시빌드
빌드 하게되면 proto 파일을 이용해 c# 코드가 생성된다. (솔루션 탐색기에서 표시되지 않음)


6.
서버 연결 통신

using System.Threading.Tasks;

 

using Grpc.Net.Client;

 

using GrpcClient;

 

using var channel = GrpcChannel.ForAddress("http://localhost:5253");

var client = new Greeter.GreeterClient(channel);

var reply = await client.SayHelloAsync(new HelloRequest { Name = "GreeterClient" });

Console.WriteLine("Greeting: " + reply.Message);

Console.WriteLine("Press any key to exit...");

Console.ReadKey();

https 연결하면 SSL 인증서를 요구한다.
SayHelloAsync
서버쪽에 요청을 하게되면 서버측에서는 받은 메세지앞에 Hello 붙여 반환한다.

아래는 서버와 클라이언트간에 테스트 결과

gRPC Server &amp; Client 예제.docx
0.28MB