기은P
시간이 멈추는 장소
기은P
  • Programming (272)
    • 개발노트 (1)
    • FrontEnd (56)
      • ES&JS 문법 (14)
      • HTML&CSS (4)
      • React 기본 (18)
      • React 심화 (12)
      • React 이슈 (2)
      • Project 연습 (1)
      • Next.js (5)
    • Backend&Devops (33)
      • AWS (2)
      • Docker (9)
      • Jenkins (6)
      • Nginx (6)
      • Node.js (1)
      • ElasticSearch (5)
      • 프레임워크&아키텍처 (2)
      • 암호화 (0)
      • 기타 (2)
    • 알고리즘 (3)
    • C# (8)
      • WPF (8)
    • Java (51)
      • 순수 Java (18)
      • RDF&Jena (12)
      • RCP&GEF (9)
      • JMX (5)
      • JMapper (3)
      • 오류해결 (4)
    • Database (21)
      • RDBMS (9)
      • NoSQL (2)
      • TSDB (1)
      • GraphQL (1)
      • Hibernate (3)
      • 데이터베이스 이론 (4)
      • Redis (1)
    • 프로토콜 (11)
      • Netty (4)
      • gRPC (5)
      • 프로토콜 개념 (2)
    • Server (4)
      • Linux (4)
    • 2020 정보처리기사 필기 (43)
      • 목차 (1)
      • 기출문제 (1)
      • 1과목 - 소프트웨어 설계 (6)
      • 2과목 - 소프트웨어 개발 (7)
      • 3과목 - 데이터베이스 구축 (8)
      • 4과목 - 프로그래밍 언어 활용 (7)
      • 5과목 - 정보시스템 구축 관리 (10)
    • 2020 정보처리기사 실기 (31)
      • 목차 (4)
      • 기출예상문제 (19)
      • 실기요약 (8)
    • 빅데이터분석기사 필기 (4)
      • 목차 (0)
      • 필기 요약 (3)
    • 전기 공학 (1)
      • CIM (1)
    • 산업자동화시스템 (3)
      • SCADA (1)
      • OPC UA (2)
    • 디자인패턴 (1)
    • 휴지통 (0)

공지사항

  • 공지사항/포스팅 예정 항목

최근 댓글

최근 글

전체 방문자
오늘
어제

티스토리

hELLO · Designed By 정상우.
기은P

시간이 멈추는 장소

[C#] gRPC Client
프로토콜/gRPC

[C#] gRPC Client

2020. 9. 3. 15:32
반응형

계속해서 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

 

[C#] nuget package manager console 사용 방법

C# 기반으로 프로그래밍을 하면서 외부 라이브러리를 사용할 때가 있는데, nuget 패키지 관리자에서 검색을 해도 검색이 되지 않는 라이브러리들이 있습니다. 웹을 뒤져보면 따로 링크는 안걸려��

narup.tistory.com

 

 

 

 

 

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  (3) 2020.09.03
gRPC란?  (0) 2020.09.02
    '프로토콜/gRPC' 카테고리의 다른 글
    • [gRPC] Protocol Buffer란?
    • [C#] gRPC Server(Sevice)
    • [Java] gRPC Maven
    • gRPC란?
    기은P
    기은P
    기은P의 블로그 일상과 개발 관련 포스팅 #React #Typescript #Next #Nest https://github.com/kimdongjang

    티스토리툴바