상세 컨텐츠

본문 제목

.NET gRPC 서버 제작과 gRPC-Web 기능 넣기

개발 (Development & Coding)/한글본 (Korean)

by 랑크 2022. 11. 28. 17:52

본문

이 글에서는 .NET gRPC 서버제작과 간단하게 gRPC-Web 기능을 넣는 방법을 소개해 드리겠습니다.

gRPC 서버는 바이너리 데이터형식이라 텍스트 형식의 Restful 기반의 서버보다 훨씬 빠른 성능을 가지고 있습니다. 그러나 HTTP/2 프로토콜을 사용하여 기존의 브라우저에서는 호환이 안 되는 단점이 있습니다. 그로 인해 gRPC-Web이라는 기능을 넣고 HTTP/1.1 프로토콜을 이용하여 gRPC와 데이터 교류가 가능해집니다.
 

반응형


.NET 7 에서는 Json Trancoding이라는 Google API를 이용한 신기능이 도입되어 gRPC-Web 없이도 gRPC 서버와 브라우저와 호환이 가능하지만 제가 테스트해본 결과 Google API 버전 문제와 .NET 7의 라이브러리 호환 문제로 아직 시기상조라고 생각됩니다.

.NET gRPC 서버로 gRPC-Web 기능을 추가하면 별도의 gRPC-Web Envoy 프락시가 필요하지 않습니다. 그래서 어떤 자바스크립트 기반의 웹앱이나 .NET 기반의 앱들도 접속 가능하지요.


1. gRPC 서버 개발


.NET 개발자 이면 누구나 쓰는 Visual Studio 2022 (커뮤니티나 프로페셔널)의 보일러플레이트를 이용하여 쉽게 생성 가능 합니다.

새 프로젝트 만들기 > 템플레이트 중 ASP.NET Core gRPC Service를 고르시면 됩니다.


2. gRPC-Web 첨가하기


a. nuget 패키지에서 Grpc.AspNetCore.Web를 첨가합니다. 아래의 커맨드를 패키지 매지저 콘솔 (Package Manager Console)에 입력하셔도 됩니다.

install-package Grpc.AspNetCore.Web

b. 아래의 코드 후:

var app = builder.Build();

이 아래 부분의 코드를 넣습니다:

app.UseRouting();
app.UseGrpcWeb();
app.UseEndpoints(endpoints =>
{
    endpoints.MapGrpcService<GreeterService>().EnableGrpcWeb();
});

gRPC-Web 은 Routing 이 기반이 되어서 이 부분을 넣어야 HTTP/1.1 프로토콜을 이용하는 브라우저와 통화가 가능합니다. 그리고 중요한 점은 UseGrpcWeb() 이 UseRouting()과 UseEndpoints() 사이에 위치해야 합니다.

그리고 기존에 생성되었던 아래의 부분은 지워 주세요.

app.MapGrpcService<GreeterService>();

이유는 UseEndpoints()에서 MapGrpcService()로 GreeterService를 생성하므로 기존의 gRPC 서버의 템플릿에서 자동생성된 MapGrpcService() 줄과 충돌이 있어서입니다. gRPC-Web의 엔드 포인트를 쓰거나 gRPC의 엔드포인트 둘 중 하나만 선택할 수 있습니다.

728x90

이로써 GreeterService는 gRPC-Web을 사용하게 됩니다. 이전의 두 가지 글 (React와 gRPC-Web)을 참조하시면 어떻게 웹 클라이언트에서 gRPC-Web 서버에 접속을 하는지 아실 수 있을 거예요.

https://ranku.tistory.com/2

 

React 와 gRPC-Web : PART 1 : 윈도우즈 환경에서의 Protobuf 컴필레이션방법

이 글에선 윈도우즈 환경에서 React의 gRPC-Web으로 컴필레이션 하는 방법을 소개해드리겠습니다. gRPC-Web 은 gRPC 서버에 WebAPI 형식으로 엔드포인트와 커뮤니케이션을 할수있게 만들어 주는 방법입

ranku.tistory.com

https://ranku.tistory.com/4

 

React 와 gRPC-Web : PART 2 : 컴필레이션 파일을 이용하여 gRPC-Web 서버로부터 데이터 가져오기

이번 글에서는 gRPC-Web 서버에서 데이터 가져오기를 해보겠습니다. 저번 글에서 생성된 두개의 컴필레이션 파일을 이용하여 gRPC-Web서버나 프록시에서 데이터를 가지고 와 보겠습니다. 1. Prerequisit

ranku.tistory.com


부록 : CORS

서버와 클라이언트가 완성되어도 도메인 주소가 다르면 접속이 불가능합니다. 아무리 도메인이 같다 해도 포트 번호만 달라도 접속 불가능 합니다. 브라우저 보안 기능이지요. 그래서 Cors라는 기능을 넣어 주어야 합니다.

이 글에서는 간단히 모든 주소가 연결할 수 있게 하였습니다.

Program.cs 파일에서 우선 아래의 라인 밑에:

builder.Services.AddGrpc();

이 아래 부분의 Cors에 관한 코드를 넣어 주세요

builder.Services.AddCors(o => o.AddPolicy("AllowAll", builder =>
{
    builder.AllowAnyOrigin()
           .AllowAnyMethod()
           .AllowAnyHeader()
           .WithExposedHeaders("Grpc-Status", "Grpc-Message", "Grpc-Encoding", "Grpc-Accept-Encoding");
}));

AllowAll이라는 Cors Policy를 먼저 위와 같이 정의하고

var app = builder.Build();

위의 라인 부분에 넣었던 코드를 아래 형식으로 바꾸어 줍니다 (2b 참조).

app.UseRouting();
app.UseGrpcWeb(); 
app.UseCors();
app.UseEndpoints(endpoints =>
{
    endpoints.MapGrpcService<GreeterService>()
        .EnableGrpcWeb()
        .RequireCors("AllowAll");
});

UseCors()라는 라인과 RequireCors("AllowAll")이라는 부분이 들어갑니다. 그러면 GreeterService라는 Endpoint는 어디에 서나 접속 가능 하도록 만들어집니다.


축하드립니다! .NET 버전의 gRPC-Web서버가 제작되었습니다.

감사합니다


도움이 되셨거나 즐거우셨다면 아래의 ❤️공감버튼이나 구독버튼을 눌러 주세요~  감사합니다

 

 

728x90
반응형

관련글 더보기