반응형
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
반응형
'gRPC' 카테고리의 다른 글
[gRPC] C#으로 gRPC 서버, 클라이언트 만들기 - 튜토리얼(1) (0) | 2023.10.30 |
---|