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. 코드에 따라 Proto를 어떻게 만드는지 위에서 GrpcMethodHelper를 호출했습니다.AutoRegisterMethod() 메서드, 반사를 통해 GrpcMethod를 자동으로 등록하는 방법
(1).이 안에는grpc의 서열화 및 반서열화 의뢰를 생성하기 위한 BuildMethod 방법이 호출되었다
(2).grpc 방법과 매개 변수의 정보를 수집하여 프로토 생성에 사용
///
/// Grpc (CodeFirst )
///
///
///
///
///
///
///
///
///
public static Method BuildMethod(this IGrpcService srv,
string methodName, string package = null, string srvName = null, MethodType mType = MethodType.Unary)
{
var serviceName = srvName ??
GrpcExtensionsOptions.Instance.GlobalService ??
srv.GetType().Name;
var pkg = package ?? GrpcExtensionsOptions.Instance.GlobalPackage;
if (!string.IsNullOrWhiteSpace(pkg))
{
serviceName = $"{pkg}.{serviceName}";
}
#region proto
if (!(srv is IGrpcBaseService) || GrpcExtensionsOptions.Instance.GenBaseServiceProtoEnable)
{
ProtoInfo.Methods.Add(new ProtoMethodInfo
{
ServiceName = serviceName,
MethodName = methodName,
RequestName = typeof(TRequest).Name,
ResponseName = typeof(TResponse).Name,
MethodType = mType
});
ProtoGenerator.AddProto(typeof(TRequest).Name);
ProtoGenerator.AddProto(typeof(TResponse).Name);
}
#endregion
var request = Marshallers.Create((arg) => ProtobufExtensions.Serialize(arg), data => ProtobufExtensions.Deserialize(data));
var response = Marshallers.Create((arg) => ProtobufExtensions.Serialize(arg), data => ProtobufExtensions.Deserialize(data));
return new Method(mType, serviceName, methodName, request, response);
}
2. 바퀴를 중복 만들지 않고protobuf-net의 Serializer를 통과한다.GetProto()를 사용하여 요청 매개변수와 반환 매개변수를 생성하는 proto
(1).여기에 반복되는 프로토를 간단하게 필터하지만 GetProto () 는 의존하는 클래스를 모두 프로토로 생성합니다. 그러면 공용 클래스가 여러 개를 생성하고 다시 필터를 하면 됩니다.
(2).메시지 비키 코드 생성
///
/// proto
///
public static void AddProto(string entityName)
{
if (!ProtoMethodInfo.Protos.ContainsKey(entityName))
{
var msg = Serializer.GetProto(ProtoBuf.Meta.ProtoSyntax.Proto3);
ProtoMethodInfo.Protos.TryAdd(entityName, msg.FilterHead().AddMessageComment());
}
}
3.서비스 방법의proto는 더욱 간단합니다. 방법 유형에 따라 직접 맞추면 됩니다.
///
/// grpc service proto
///
private static string GenGrpcServiceProto(string msgProtoName, string pkgName, string srvName, List methodInfo, bool spiltProto)
{
var sb = new StringBuilder();
sb.AppendLine("syntax = \"proto3\";");
if (!string.IsNullOrWhiteSpace(GrpcExtensionsOptions.Instance.ProtoNameSpace))
{
sb.AppendLine("option csharp_namespace = \"" + GrpcExtensionsOptions.Instance.ProtoNameSpace.Trim() + "\";");
}
if (!string.IsNullOrWhiteSpace(pkgName))
{
sb.AppendLine($"package {pkgName.Trim()};");
}
if (spiltProto)
{
sb.AppendLine(string.Format("import \"{0}\";", msgProtoName));
}
sb.AppendLine(Environment.NewLine);
sb.AppendLine("service " + srvName + " {");
var template = @" rpc {0}({1}) returns({2})";
methodInfo.ForEach(q => {
var requestName = q.RequestName;
var responseName = q.ResponseName;
switch (q.MethodType)
{
case Core.MethodType.Unary:
break;
case Core.MethodType.ClientStreaming:
requestName = "stream " + requestName;
break;
case Core.MethodType.ServerStreaming:
responseName = "stream " + responseName;
break;
case Core.MethodType.DuplexStreaming:
requestName = "stream " + requestName;
responseName = "stream " + responseName;
break;
}
ProtoCommentGenerator.AddServiceComment(q,sb);
sb.AppendLine(string.Format(template, q.MethodName, requestName, responseName) + ";" + Environment.NewLine);
});
sb.AppendLine("}");
return sb.ToString();
}
4.프로토 생성에 주석이 없으면 제3자가 연결할 때 어색해진다. 명명규범이지만 주석은 있어야 한다. 소통 원가를 줄인다.
(1).우리는 클래스와 방법에 주석을 추가한 다음 프로젝트에 xml 주석 문서를 생성하도록 설정합니다
(2).프로토를 생성할 때 xml 주석 문서를 스캔해서 프로토에 주석을 추가하면 됩니다
미완
이러한 기능은 이미 2018년에 실현되었고 생산에서 운행되었다. 관심 있는 학생은github(grpc.extensions)에서 볼 수 있다. 네가 원하는 것은 모두 있다. issue를 환영한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.