gRPC

[gRPC] C#으로 gRPC 서버, 클라이언트 만들기 - 튜토리얼(2)

UnaUna 2023. 11. 12. 17:20
반응형

1. GrpcServer Protos에서 customers.proto 추가

customers.proto

syntax = "proto3";

option csharp_namespace = "GrpcService";

service Customer {
    rpc GetCustomerModel(CustomerLookupModel) returns (CustomerModel);
    rpc GetNewCustomers (NewCustomerRequest) returns (stream CustomerModel);
}

message NewCustomerRequest {

}

message CustomerLookupModel{
    int32 userId = 1;
}

message CustomerModel {
    string firstName = 1;
    string lastName = 2;
    string emailAddress = 3;
    bool isAlive = 4;
    int32 age = 5;
}

2.CustomersService.cs 추가

GrpcService의 Services 폴더에 CustomersService.cs 파일을 추가한다.
수정하기에 앞서

GrpcService의 Program.cs에서 add.MapGrpcService 추가
app.MapGrpcService<GreeterService>(); 밑에 app.MapGrpcService<CustomersService>(); 추가

app.MapGrpcService<GreeterService>();
app.MapGrpcService<CustomersService>();

추가 후 GrpcService 프로젝트만 빌드 해준다.

3. CustomersService.cs 수정

using Grpc.Core;

namespace GrpcService.Services
{
    // CustomerBase 상속
    public class CustomersService : Customer.CustomerBase
    {
        private readonly ILogger<CustomersService> _logger;
        public CustomersService(ILogger<CustomersService> logger)
        {
            _logger = logger;
        }

        // UserId 별 Customer 정보 얻기
        public override Task<CustomerModel> GetCustomerModel(CustomerLookupModel request, ServerCallContext context)
        {
            CustomerModel output = new CustomerModel();
            if (request.UserId == 1)
            {
                output.FirstName = "Jamie";
                output.LastName = "Smith";
            }
            else if (request.UserId == 2)
            {
                output.FirstName = "Jane";
                output.LastName = "Doe";
            }
            else
            {
                output.FirstName = "Greg";
                output.LastName = "Thomas";
            }

            return Task.FromResult(output);
        }

        // 새로운 CustomerModel 추가 후 추가한 CustomerModel 얻기
        public override async Task GetNewCustomers(NewCustomerRequest request,
            IServerStreamWriter<CustomerModel> responseStream,
            ServerCallContext context)
        {
            List<CustomerModel> customers = new()
            {
                new CustomerModel
                {
                    FirstName = "Tim",
                    LastName = "Corey",
                    EmailAddress = "tim@iamtimcorey.com",
                    Age = 41,
                    IsAlive = true
                },
                new CustomerModel
                {
                    FirstName = "Sue",
                    LastName = "Storm",
                    EmailAddress = "sue@stormy.net",
                    Age = 28,
                    IsAlive = false
                },
                new CustomerModel
                {
                    FirstName = "Blibo",
                    LastName = "Baggins",
                    EmailAddress = "blibo@middleearth.net",
                    Age = 117,
                    IsAlive = false
                }
            };
            foreach (var customer in customers)
            { 
                await responseStream.WriteAsync(customer);
            }
        }
    }
}

4. GrpcServer의 Protos에 customers.proto를 GrpcClient의 Protos에 붙여넣기

붙여 넣은 후 customers.proto 선택 > 우클릭 > 속성 > gRPC > gRPC Stub Classes를 Client Only로 바꾼다. 바꾼 후 Client 빌드해준다.

5. GrpcClient의 Programs.cs 수정

        var channel = GrpcChannel.ForAddress("https://localhost:7264");
        var customersClient = new Customer.CustomerClient(channel);
        var customer = await customersClient.GetCustomerModelAsync(new CustomerLookupModel
        { 
            UserId = 1
        });
        Console.WriteLine($"{customer.FirstName} {customer.LastName}");

        using (var call = customersClient.GetNewCustomers(new NewCustomerRequest()))
        {
            while (await call.ResponseStream.MoveNext())
            {
                var currentCustomer = call.ResponseStream.Current;

                Console.WriteLine($"{currentCustomer.FirstName} {currentCustomer.LastName} : {currentCustomer.EmailAddress}");
            }
        }

        Console.ReadLine();

코드 수정 후 Service -> Client 순으로 빌드하여 결과를 확인
설정이 안되어 있다면 시작프로젝트 구성에서 아래와 같이 변경 후 빌드한다.

결과

참고 : https://www.youtube.com/watch?si=rJ1WYZjo7L7T_IUf&v=QyxCX2GYHxk&feature=youtu.be

반응형