그림 분석 ASP.NET Core 도입 gRPC 서비스 템 플 릿

12731 단어 ASP.NETCoregRPC
ASP.NET Core 3.0 에 gRPC 서비스 템 플 릿 이 도입 되 었 다 고 들 었 는데 마침 집에 있 는 컴퓨터 가 새로운 시스템 을 만 든 틈 을 타 VS 2019 를 설치 한 시간 에 체험 해 보 았 다.체험 의 과정 을 동시에 기록 하 다.본문 절차 에 따라 체험 하고 싶다 면.NET Core 3.0 미리 보기 SDK 를 설치 해 야 한다.개발 도구 에 대해 서 는 내 가 사용 할 때 VS 2019,물론 너 도 VS Code 로 진행 할 수 있다.
gRPC 의 간단 한 소개
gRPC 는 언어 와 무관 한 고성능 원 격 프로 세 스 호출(RPC)프레임 워 크 입 니 다.gRPC 기초 지식 에 대한 자세 한 정 보 는gRPC 문서 페이지참조 하 시기 바 랍 니 다.
gRPC 의 주요 장점 은:
  • 현대 고성능 경량급 RPC 프레임 워 크.
  • 협정 우선 API 개발,기본 프로 토 콜 버퍼 사용,언어 와 무관 한 실현 허용
  • 다양한 언어 에 사용 할 수 있 는 도구 로 강 한 유형의 서버 와 클 라 이언 트 를 생 성 할 수 있 습 니 다.
  • 클 라 이언 트,서버 와 양 방향 스 트림 처리 호출 을 지원 합 니 다.
  • Protobuf 바 이 너 리 직렬 화 를 사용 하여 네트워크 사용 을 감소 합 니 다.
  • 이러한 장점 은 gRPC 를 다음 과 같이 적용 합 니 다.
  • 효율 이 매우 중요 한 경량급 마이크로 서비스.
  • 다양한 언어 로 개발 할 수 있 는 Polyglot 시스템 이 필요 합 니 다.
  • 스 트림 처리 요청 이나 응답 점 대 점 실시 간 서 비 스 를 처리 해 야 합 니 다.
  • ASP.NET Core 3.0 에서 gRPC 서비스 템 플 릿 초기 체험
    gRPC 서비스 만 들 기
            1.VS 2019 를 열 고 Visual Studio'파일'메뉴 에서'새로 만 들 기'>'항목'을 선택 하 십시오.(나 는 새로 연 VS 이기 때문에 다음 그림 과 같이 새 항목 을 만 듭 니 다)

            2.다음 그림 에서 보 듯 이'ASP.NET Core 웹 애플 리 케 이 션'을 만 들 고 다음 을 클릭 합 니 다.

            3.이 페이지 는 아래 그림 에서 보 듯 이 항목 이름,위치,솔 루 션 이름 을 입력 한 다음 오른쪽 아래 에 있 는'생 성'단 추 를 누 르 면 생 성 됩 니 다.

            4.위 단계 에서'생 성'을 누 르 면 끝 날 것 같 습 니까?gRPC 서비스 템 플 릿 을 만 들 기로 했 습 니 다.따라서 위 에 있 는 생 성 을 클릭 하면 다음 그림 과 같이 팝 업 됩 니 다.서비스 템 플 릿 의 창 을 선택 하 라 고 했 습 니 다.여 기 는 아래 그림 에 따라 gRPC 서비스 템 플 릿 을 선택 한 다음 오른쪽 아래 에 있 는 생 성 을 다시 클릭 하 는 것 이 진정한 생 성 항목 입 니 다.

            5.생 성 에 성공 하면 다음 그림 과 같은 프로젝트 구조 가 나타 납 니 다.

            6.이로써 우 리 는 gRPC 서비스의 템 플 릿 을 만 들 었 습 니 다.그 다음 에 테스트 를 한 다음 에 이 템 플 릿 의 구 조 를 잘 보 겠 습 니 다.
    테스트 gRPC 서비스
            1.먼저HelloGrpc.Server이 서버 의 작업 디 렉 터 리 를 열 고Shift+ 아래 그림 과 같은 오른쪽 단추 메뉴 를 팝 업 합 니 다.그림 과 같이 ps 창 을 엽 니 다.

            2.입력dotnet run명령 은 이 gRPC 서버 항목 을 실행 합 니 다.아래 그림 에서 보 듯 이 서버 가 정상적으로 작 동 하고 해당 하 는 포트 를 감청 하기 시작 합 니 다.

            3.똑 같은 방법 으로 클 라 이언 트 를 시작 합 니 다.이때 클 라 이언 트 는 이 서버 에'GreeterClient'라 는 메 시 지 를 포함 한 인사 메 시 지 를 보 냅 니 다.이 서버 는 응답 으로"Hello GreeterClient"메 시 지 를 보 내 고 명령 프롬프트 에 표 시 됩 니 다.다음 그림 에서 보 듯 이:

            4.이로써 gRPC 서비스 템 플 릿 이 만 든 서버 와 클 라 이언 트 테스트 에 성 공 했 습 니 다.다음은 이 서비스 템 플 릿 을 잘 살 펴 보 자.
    gRPC 템 플 릿 분석HelloGrpc.Server서비스의 엔 드 항목 에는 다음 과 같은 몇 가지 파일 이 있 습 니 다.
  • greet.proto:greet.proto 파일 정의GreetergRPC 이 며,gRPC 서버 자산 생 성 에 사 용 됩 니 다.
  • Services 폴 더:Greeter서비스의 실현 을 포함 합 니 다.
  • appSettings.json:Kestrel 에서 사용 하 는 프로 토 콜 과 같은 설정 데 이 터 를 포함 합 니 다.(ASP.NET Core 에 익숙 한 당신 은 분명 익숙 할 것 입 니 다.
  • Program.cs:gRPC 서비스의 입구 점 을 포함 합 니 다.(ASP.NET Core 에 익숙 한 당신 은 분명 익숙 할 것 입 니 다.
  • Startup.cs:IWebHostBuilder의 시작 프로필 은 응용 행 위 를 설정 하 는 코드 를 포함 합 니 다.(ASP.NET Core 에 익숙 한 당신 은 분명 익숙 할 것 입 니 다.
  • gRPC 클 라 이언 트HelloGrpc.Client파일:
    Program.cs 는 gRPC 클 라 이언 트 의 입구 점 과 논 리 를 포함 합 니 다.
    다음은 모든 서 류 를 열 어 안에 무엇이 들 어 있 는 지 살 펴 보 자.
    proto 파일
    proto
    GRPC 는 약 정 된 우선 API 개발 방법 을 사용한다.기본적으로 프로 토 콜 버퍼(Protobuf)를 인터페이스 디자인 언어(IDL)로 사용 합 니 다.이.proto파일 은 다음 을 포함 합 니 다:
  • GRPC 서비스의 정의.
  • 클 라 이언 트 와 서버 사이 에서 보 낸 메시지 입 니 다.
  • Protobuf 파일 문법 에 대한 더 많은 정 보 는 정식 파일(원형)을 참조 하 십시오.
    우리 템 플 릿 에서 만 든greet.proto파일 의 내용 은 다음 과 같 습 니 다.
    
    syntax = "proto3";
    
    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;
    }
  • 정의Greeter서비스.
  • Greeter서비스 정의SayHello요청 입 니 다.
  • SayHello메 시 지 를 보 내 고 받 기HelloRequest메시지:
  • 이.proto 파일 이 프로젝트 에 어떻게 포함 되 어 있 는 지 물 어 봐 야 할 것 같 습 니 다.사실.csproject 파일 을 열 면 이 파일 을HelloResponse의 ItemGroup 에 추가 하면 됩 니 다.
  • 
    <ItemGroup>
     <Protobuf Include="..\Protos\*.proto" GrpcServices="Server" />
     <Content Include="@(Protobuf)" LinkBase="" />
    </ItemGroup>
    C\#.proto 파일 에 대한 도구 지원
    공구 꾸러미Grpc.Tools는.proto 파일 에서 C\#파일 을 만 드 는 데 사 용 됩 니 다.생 성 된 자산(파일)은 다음 과 같은 특성 을 가지 고 있 습 니 다.
  • 프로젝트 를 구축 할 때마다 필요 에 따라 생 성 된다.
  • 생 성 된 파일 은 프로젝트 에 추가 되 거나 소스 코드 관리 에 서명 되 지 않 습 니 다.
  • 생 성 된 C\#파일 은 OBJ 디 렉 터 리 에 포 함 됩 니 다.
  • 서버 와 클 라 이언 트 항목 모두 이 가방 이 필요 합 니 다.<Protobuf>VisualStudio 에서 패키지 관리 자 를 사용 하거나 프로젝트 파일 에 추가 할 수 있 습 니 다.
    XML 복사
    
    <PackageReference Include="Grpc.Tools" Version="1.19.0-pre1" PrivateAssets="All" />
    공구 꾸러미 가 실 행 될 때 필요 한 것 이 아니 므 로 사용 해 야 합 니 다Grpc.Tools.
    Services 폴 더 의 구체 적 인 gRPC 서비스
    우 리 는<PackageReference>공구 꾸러미 가.proto 파일 의 정의 에 따라 번역 되 고 해당 하 는 C\#형식의 파일 을 생 성 할 것 이라는 것 을 알 고 있 습 니 다.
    서버 쪽 자산 에 대해 추상 적 인 서비스 기본 유형 을 생 성 할 것 입 니 다.기본 형식 은.proto 파일 에 포 함 된 모든 GRPC 호출 에 대한 정 의 를 포함 합 니 다.그 다음 에 귀 하 는 이 기본 유형의 파생 된 구체 적 인 서 비 스 를 만 들 고 GRPC 호출 논 리 를 실현 할 것 입 니 다.앞에서 설명 한PrivateAssets="All"예제 에 대해 가상Grpc.Tools방법 을 포함 한 추상greet.proto유형 을 생 성 할 것 이다.구체 적 인 실현SayHello은 이 방법 을 다시 쓰 고 GRPC 호출 을 처리 하 는 논 리 를 실현 한다.GreeterBase프로젝트 의GreeterService코드 와 같 습 니 다.
    
    public class GreeterService : Greeter.GreeterBase
    {
     public override Task<HelloReply> 
     SayHello(HelloRequest request, ServerCallContext context)
     {
     return Task.FromResult(new HelloReply
     {
      Message = "Hello " + request.Name
     });
     }
    }
    클 라 이언 트 에 대해 서 는 구체 적 인 클 라 이언 트 유형의 GRPC 호출 을 생 성 합 니 다.proto 파일 은 호출 가능 한 구체 적 인 형식 으로 변환 되 었 습 니 다.HelloGrpc.Server앞에서 설명 한 예 시 를 위해 구체 적 인Services\GreeterService.cs유형 이 생 성 됩 니 다.이greet.proto유형 은 서버 에 대한 GRPC 호출 을 시작 하기 위해GreeterClient방법 을 포함 하고 있 습 니 다.
    
    public class Program
    {
     static async Task Main(string[] args)
     {
     // Include port of the gRPC server as an application argument
     var port = args.Length > 0 ? args[0] : "50051";
    
     var channel = new Channel("localhost:" + port, ChannelCredentials.Insecure);
     var client = new Greeter.GreeterClient(channel);
    
     var reply = await client.SayHelloAsync(
         new HelloRequest { Name = "GreeterClient" });
     Console.WriteLine("Greeting: " + reply.Message);
    
     await channel.ShutdownAsync();
    
     Console.WriteLine("Press any key to exit...");
     Console.ReadKey();
     }
    }
    기본적으로 서버 와 클 라 이언 트 자산 을 각각 생 성 합 니 다.proto 파일 은GreeterClient프로젝트 그룹 에 포함 되 어 있 습 니 다.서버 프로젝트 에서 만 서버 자산 을 생 성 하려 면SayHello속성 설정<Protobuf>.
    XML 복사
    
    <ItemGroup>
     <Protobuf Include="..\Protos\*.proto" GrpcServices="Server" />
     <Content Include="@(Protobuf)" LinkBase="" />
    </ItemGroup>
    유사 하 게 속성 설정GrpcServices은 고객 프로젝트 에서 만 생 성 됩 니 다.
    Startup Server에서 우 리 는 일반적인 ASP.NET Core 프로그램 과 다르다 는 것 을 발견 했다.구체 적 인 것 은 다음 과 같다.Client서비스 에 gRPC 서 비 스 를 도입 한 다음 에Startup경로 에 가입 했다.

    gRPC 와 관련 된 nuget 패키지 세 개 를 도입 해 야 합 니 다.
  • Grpc.AspNetCore.Server
  • Google.ProtobufProtobuf 메시지 API 에 대해.
  • Grpc.Tools
  • 여기 서 설명해 야 할 것 은...
    ASP.NET Core 미들웨어 와 기능 공유 루트 파 이 프 는 서비스 다른 요청 처리 프로그램 으로 프로그램 을 설정 할 수 있 습 니 다.다른 요청 처리 프로그램(예 를 들 어 MVC 컨트롤 러)은 설 정 된 GRPC 서비스 경로 와 병행 할 수 있 습 니 다.
    기타 설명 이 필요 한 내용
    ASP.NET Core 인터페이스 와 의 통합
    GRPC 서 비 스 는 주입(Di)과 로그 기능 에 의존 하 는 ASP.NETCore 기능 에 완전히 접근 할 수 있 습 니 다.예 를 들 어 서 비 스 는 구조 함수 로 DI 용기 의 기록 기 서 비 스 를 분석 할 수 있 습 니 다.
    
    public class GreeterService : Greeter.GreeterBase
    {
     public GreeterService(ILogger<GreeterService> logger)
     {
     }
    }
    기본적으로 GRPC 서 비 스 는 임의의 생존 기간 을 가 진 다른 DI 서비스(Singleton,Scoped,or Transient)를 분석 할 수 있다.
    GRPC 방법 에서 HttpContext 분석
    GRPC 응용 프로그램 인 터 페 이 스 는 method,host,header,and trailers 와 같은 일부 HTTP/2 메시지 데이터 에 대한 접근 을 제공 합 니 다.접근 은ConfigureServices매개 변수 로 GRPC 에 전달 하 는 방법 입 니 다.
    
    public class GreeterService : Greeter.GreeterBase
    {
     public override Task<HelloReply> 
     SayHello(HelloRequest request, ServerCallContext context)
     {
     return Task.FromResult(new HelloReply
     {
      Message = "Hello " + request.Name
     });
     }
    }
    Configure모든 ASP.NET 인터페이스ServerCallContext에 대한 완전한 접근 을 제공 하지 않 습 니 다.ServerCallContext확장 방법 은 ASP.NET API 의 바 텀 HTTP/2 메 시 지 를 나타 내 는 http Context 에 대한 완전한 접근 을 제공 합 니 다.
    
    public class GreeterService : Greeter.GreeterBase
    {
     public override Task<HelloReply> SayHello(HelloRequest request, 
     ServerCallContext context)
     {
     var httpContext = context.GetHttpContext();
    
     return Task.FromResult(new HelloReply
     {
      Message = "Using https: " + httpContext.Request.IsHttps
     });
     }
    }
    요청 체 데이터 속도 제한
    기본적으로 Kestrel 서버 는 최소 요청 주체 데이터 속도 로 설정 되 어 있 습 니 다.클 라 이언 트 흐름 식 과 이중 흐름 식 의 요청 에 대해 이 속 도 는 만족 하지 않 을 수 있 고 연결 이 시간 을 초과 할 수 있 습 니 다.GRPC 서비스 가 클 라 이언 트 흐름 과 이중 작업 흐름 호출 을 포함 할 때 최소 요청 본문 데이터 속도 제한 을 사용 하지 않 아야 합 니 다.
    
    public class Program
    {
     public static void Main(string[] args)
     {
     CreateHostBuilder(args).Build().Run();
     }
    
     public static IHostBuilder CreateHostBuilder(string[] args) =>
      Host.CreateDefaultBuilder(args)
     .ConfigureWebHostDefaults(webBuilder =>
     {
     webBuilder.UseStartup<Startup>();
     webBuilder.ConfigureKestrel((context, options) =>
     {
      options.Limits.MinRequestBodyDataRate = null;
     });
     });
    }
    참고 문장
    gRPC services with C#
    Tutorial: Get started with gRPC in ASP.NET Core
    gRPC services with ASP.NET Core
    Migrating gRPC services from C-core to ASP.NET Core
    총결산
    오늘 공 유 된 내용 이 좀 많 습 니 다.가능 한 한 상세 하 게 기록 하고 가능 한 한 통속 적 이 고 알 기 쉬 운 언어 로 묘사 하여 사용 할 수 있 도록 하 는 것 이 목적 입 니 다.asp.net core 3.0 에서 grpc 서 비 스 를 1 등 시민 으로 지원 하기 때문에 알 아 볼 필요 가 있 습 니 다.많은 친구 들 이 궁금 해 할 것 같 습 니 다.제 웹 API 는 비 뚤 게 사용 하 는데 왜 gRPC 라 는 원 격 프로 세 스 로 프로 토 콜 을 호출 합 니까?이 문제 에 대하 여 저 는 따로 글 을 한 편 더 써 서 설명 하려 고 합 니 다.마지막 으로 여러분 의 읽 어 주 셔 서 감사합니다.

    좋은 웹페이지 즐겨찾기