GRPC CodeFirst 구현 방법
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에 가서 확인할 수 있다. 네가 원하는 것은 모두 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.