계속해서 gRPC를 공부하며 포스팅을 진행하는데요.
현재 진행하고 있는 프로젝트가 Client가 C# 기반이고, Server가 Java 기반이어서 Http통신의 REST API를 사용하는 구조이다 보니 서버 측의 모델과 클라이언트 측의 모델을 각각 따로 구현해야 하는 불편함이 생기더라구요.
Json이 아닌 proto타입으로 주고 받을 수 있는 RPC 기반의 gRPC를 사용하면 이런 불편함이 조금 해소되지 않을까, 찾아보면서 포스팅을 진행하고 있습니다.
앞에서 포스팅 했던 Java와 같이 C#에서도 gRPC를 구현할 수 있는데, C#이 더욱 쉽습니다(?)
1. Nuget 설치
저는 C# 콘솔 기반의 프로젝트를 생성했구요. (굳이 GUI를 만들것 까지는 없으니까...)
프로젝트에 Nuget 패키지 관리자 콘솔을 통해 gRPC.Tool을 설치해주시면 됩니다.
Nuget :: https://www.nuget.org/packages/Grpc.Tools/
패키지 관리자 콘솔을 사용하는 법을 알고 싶으면 아래 링크를 참고해주세요
https://narup.tistory.com/123?category=904301
2. .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 라는 이름의 파일을 생성해 위의 코드를 작성해주시면 됩니다.
3. 프로젝트 파일 편집
그 다음 프로젝트 우클릭 - 프로젝트 파일 편집으로 .csproj 파일을 열어주세요.
저와 같이 C# 콘솔 프로젝트로 작성하셨으면 코드가 그렇게 복잡하지는 않을 거에요.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Grpc.Tools" Version="2.31.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<!-- protobuf 추가 -->
<Protobuf Include="Protos\greet.proto" GrpcServices="Client" />
<PackageReference Include="Grpc.AspNetCore" Version="2.28.0" />
<PackageReference Include="Google.Protobuf" Version="3.11.4" />
<PackageReference Include="Grpc.Net.Client" Version="2.31.0" />
<PackageReference Include="Grpc.Tools" Version="2.28.1" />
</ItemGroup>
</Project>
위의 주석 밑의 코드를 추가해주시면 됩니다.
Protobuf 태그에서 Protos\greet.proto를 gRPC서비스를 클라이언트 형태로 등록한다, 라고 보시면 되요.
그 밑의 하위 PackageReference는 gRPC를 사용하기 위한 패키지 참조를 등록해준다고 생각하시면 됩니다.
4. Main 코드 작성
static async Task Main(string[] args)
{
// The port number(5001) must match the port of the gRPC server.
using var channel = GrpcChannel.ForAddress("https://localhost:5001");
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();
}
REST에서 많이 보던 localhost주소죠?
해당 URL을 채널에 등록하고, proto파일에서 명명했던 Greeter로 channel을 등록한 후
clinet 객체를 통해 proto 파일을 호출합니다.
gRPC 개념대로, proto에서 message와 service를 이용해서 서버 측에 request를 하고 response를 받는 코드입니다.
제 프로젝트에서 사용된 파일들... 정말 적죠?ㅎㅎ
참고 사이트
https://docs.microsoft.com/ko-kr/aspnet/core/grpc/protobuf?view=aspnetcore-3.1
https://github.com/grpc/grpc/tree/v1.31.0/src/csharp
https://grpc.io/docs/languages/csharp/quickstart/
'프로토콜 > gRPC' 카테고리의 다른 글
[gRPC] Protocol Buffer란? (0) | 2022.05.31 |
---|---|
[C#] gRPC Server(Sevice) (0) | 2020.09.04 |
[Java] gRPC Maven (2) | 2020.09.03 |
gRPC란? (0) | 2020.09.02 |