GRPC CodeFirst 구현 방법

11026 단어
선언:
gRPC는 기본적으로ProtoFirst입니다. 즉, 프로토 파일을 먼저 쓰고 코드를 생성해야 합니다. 프로토를 인공적으로 유지해야 하기 때문에 생성된 코드도 우호적이지 않습니다. 그래서 gRPC CodeFirst가 생겼습니다. 다음은 우리가 어떻게 gRPC CodeFirst를 실현했는지 말씀드리겠습니다.
 
디렉토리:
WCF와 동일한 CodeFirst 구현
(1).gRPC CodeFirst 구현을 통해 WCF의 필수 추출 인터페이스 문제 단순화
(2).코드를 통해proto와 주석을 생성하여 제3자 언어에 사용
(3). Http 원격 호출 및 관리를 위한 gRPC DashBoard 구현
(4). gRPC scope 주입을 실현하는 세 가지 방식(asp.net core 3.0 grpc 기본값은 scope)
(5).서비스 등록 및 검색 실현
(6). 분산 로그 추적
(7).로그 모니터링 등
 
 

GRPC CodeFirst 구현 방법


 
1. CodeFirst를 실현하려면 먼저 ProtoFirst가 생성한 코드를 알아야 한다. 다음에 나는 일부 생성 코드를 캡처했다.
(1).관건은 이 Bind 서비스입니다. 실현된 gRPC 방법을 ServerServiceDefinition에 귀속시키는 데 사용됩니다.
public static partial class Greeter
{
    static readonly string __ServiceName = "helloworld.Greeter";

    static readonly grpc::Marshaller<global::Helloworld.HelloRequest> __Marshaller_helloworld_HelloRequest = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Helloworld.HelloRequest.Parser.ParseFrom);
    static readonly grpc::Marshaller<global::Helloworld.HelloReply> __Marshaller_helloworld_HelloReply = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Helloworld.HelloReply.Parser.ParseFrom);

    static readonly grpc::Method<global::Helloworld.HelloRequest, global::Helloworld.HelloReply> __Method_SayHello = new grpc::Method<global::Helloworld.HelloRequest, global::Helloworld.HelloReply>(
        grpc::MethodType.Unary,
        __ServiceName,
        "SayHello",
        __Marshaller_helloworld_HelloRequest,
        __Marshaller_helloworld_HelloReply);

    static readonly grpc::Method<global::Helloworld.HelloRequest, global::Helloworld.HelloReply> __Method_SayHelloStream = new grpc::Method<global::Helloworld.HelloRequest, global::Helloworld.HelloReply>(
        grpc::MethodType.ClientStreaming,
        __ServiceName,
        "SayHelloStream",
        __Marshaller_helloworld_HelloRequest,
        __Marshaller_helloworld_HelloReply);

    /// Creates service definition that can be registered with a server
    /// An object implementing the server-side handling logic.
    public static grpc::ServerServiceDefinition BindService(GreeterBase serviceImpl)
    {
      return grpc::ServerServiceDefinition.CreateBuilder()
          .AddMethod(__Method_SayHello, serviceImpl.SayHello)
          .AddMethod(__Method_SayHelloStream, serviceImpl.SayHelloStream).Build();
    }

    /// Register service method with a service binder with or without implementation. Useful when customizing the  service binding logic.
    /// Note: this method is part of an experimental API that can change or be removed without any prior notice.
    /// Service methods will be bound by calling AddMethod on this object.
    /// An object implementing the server-side handling logic.
    public static void BindService(grpc::ServiceBinderBase serviceBinder, GreeterBase serviceImpl)
    {
      serviceBinder.AddMethod(__Method_SayHello, serviceImpl == null ? null : new grpc::UnaryServerMethod<global::Helloworld.HelloRequest, global::Helloworld.HelloReply>(serviceImpl.SayHello));
      serviceBinder.AddMethod(__Method_SayHelloStream, serviceImpl == null ? null : new grpc::ClientStreamingServerMethod<global::Helloworld.HelloRequest, global::Helloworld.HelloReply>(serviceImpl.SayHelloStream));
    }
}

 (2).__Marshaller_helloworld_HelloRequest这个是实现protobuffer的序列化和反序列化的一个委托 

 服务的请求参数和返回参数,我们使用Protobuf-net来实现序列化和反序列化,和 WCF一样需要给类打上标签

    /// 
    ///       
    /// 
    [ProtoContract]
    public class AddRequest
    {
        /// 
        ///      
        /// 
        [ProtoMember(1)]
        public int Num1 { get; set; }

        /// 
        ///      
        /// 
        [ProtoMember(2)]
        public int Num2 { get; set; }
    }

 
2. CodeFirst를 실현하려면 이 Bind Service를 실현해야 합니다. Grpc 방법을 Server Service Definition에 추가합니다.
(1).Grpc 서비스는 Grpc Service를 식별하는 데 사용되는 IGrpc Service 빈 인터페이스를 제공합니다. /// /// MathGrpc /// public class MathGrpc : IGrpcService { /// /// /// /// /// /// public Task Add(AddRequest request, ServerCallContext context) { var result = new IntMessage(); result.Value = request.Num1 + request.Num2; return Task.FromResult(result); } }
 
(2).IGrpcService 인터페이스를 구현한 클래스를 획득한 다음 획득 방법을 반사하여 ServerServiceDefinition에 추가하면 됩니다
여기에 GrpcMethodHelper가 호출되었습니다.AutoRegisterMethod() 메서드, 반사를 통해 GrpcMethod를 자동으로 등록하는 방법 /// /// IGrpcService /// /// /// private ServerBuilder UseGrpcService(IEnumerable grpcServices) { var builder = ServerServiceDefinition.CreateBuilder(); grpcServices.ToList().ForEach(grpc => GrpcMethodHelper.AutoRegisterMethod(grpc, builder)); _serviceDefinitions.Add(builder.Build()); return this; }
 
미완
이러한 기능은 이미 2018년에 실현되었고 생산에서 운행되고 있다. 관심 있는 학생은github에 가서 확인할 수 있다. 네가 원하는 것은 모두 있다.
 

좋은 웹페이지 즐겨찾기