grpc(El inicio de sesión del hipervínculo es visible.) es un framework RPC (Remote Procedure Call) de propósito general y de código abierto, publicado por Google, que utiliza el protocolo HTTP/2, soporta multiplexación y utiliza ProtoBuf como herramienta de serialización para ofrecer soporte tanto en lenguajes como en plataformas y en lenguajes. gRPC es un framework de llamadas a procedimientos remotos (RPC) de alto rendimiento que es independiente del lenguaje.
Los principales beneficios de gRPC son:
- Marco RPC moderno, de alto rendimiento y ligero.
- Desarrollo de API con enfoque contractual que utiliza búferes de protocolo por defecto, permitiendo implementaciones independientes del lenguaje.
- Herramientas disponibles en múltiples idiomas para generar servidores y clientes con tipes fuertes.
- Soporta llamadas de cliente, servidor y streaming bidireccional.
- Reducir el uso de la red con serialización binaria Protobuf.
Este artículo comienza con . Net Core utiliza el protocolo gRPC para la comunicación tanto en el lado del cliente como en el servidor.
Crear un servidor gRPC
Inicia Visual Studio y selecciona Crear Nuevo Proyecto. Alternativamente, selecciona Proyecto de Nuevo > en el menú de archivos de Visual Studio.
En el cuadro de diálogo Crear Nuevo Proyecto, selecciona Servicio gRPC y luego selecciona Siguiente:
Después de que se complete la creación, como se muestra en la siguiente figura:
Crear un cliente gRPC
Abre una segunda instancia de Visual Studio y selecciona Crear un nuevo proyecto. En el cuadro de diálogo Crear Nuevo Proyecto, selecciona Consola App (.NET Core) y luego selecciona Siguiente. En el cuadro de texto Nombre, introduce gRPC-Client y luego selecciona Crear.
Añade el paquete necesario
El proyecto cliente gRPC requiere los siguientes paquetes: Grpc.Net.Client, que contiene el cliente .NET Core. Google.Protobuf contiene mensajes Protobuf para C#. Grpc.Tools incluye soporte para herramientas C# para archivos Protobuf. El kit de herramientas no es necesario en tiempo de ejecución, por lo que las dependencias se marcan como PrivateAssets="All".
Añadir greet.proto
Crea una carpeta Protos en tu proyecto cliente gRPC. Copia el archivo Protos\greet.proto desde el servicio de saludo gRPC al proyecto cliente gRPC.
Edita el archivo de proyecto gRPC-Client.csproj, añade el grupo de elementos con el elemento que hace referencia al archivo <Protobuf> greet.proto:
Crear un cliente de Recibidor
Actualizar el archivo Program.cs del cliente gRPC con el siguiente código:
Instancia el GrpcChannel para que contenga la información utilizada para crear una conexión con el servicio gRPC. Construye un cliente Greeter usando GrpcChannel. El cliente Recibidor llama al método SayHello. Se muestra el resultado de la llamada SayHello.
Crea tu propia comunicación con archivos .proto
Crea un nuevo archivo userinfo.proto bajo la carpeta Protos del servicio, definido de la siguiente manera:
gRPC utiliza un enfoque basado en el contrato para el desarrollo de APIs. Define servicios y mensajes en el archivo *.proto.
Edita el archivo de proyecto GrpcService1.csproj, añade el <Protobuf> grupo de elementos con el elemento que hace referencia al archivo userinfo.proto:
<Proyecto Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup> <TargetFramework>netcoreapp3.0</TargetFramework> </PropertyGroup>
<ItemGroup> <Protobuf Include="Protos\greet.proto" GrpcServices="Server" /> <Protobuf Include="Protos\userinfo.proto" GrpcServices="Server" /> </ItemGroup>
<ItemGroup> <PackageReferenceInclude="Grpc.AspNetCore" Versión="2.23.1" /> </ItemGroup>
</Project>
Crea un nuevo archivo UserInfoService.cs en la carpeta Services, el código es el siguiente:
Registra el servicio UserInfoService en Startup.cs con el siguiente código:
Dejando de lado el cliente, por supuesto, tienes que copiar el archivo userinfo.proto más adelante, y el código es el siguiente:
Valor de devolución:
¡Hola mundo! Respuesta: Hola itsvse.com { "id": "1", "name": "architect", "age": 5, "isVip": true } { "id": "2", "name": "itsvse.com", "age": 5 } Excepción no gestionada. Grpc.Core.RpcException: Status(StatusCode=Cancelled, Detail="No se ha devuelto mensaje del método.") en Grpc.Net.Client.Internal.HttpClientCallInvoker.BlockingUnaryCall[TRequest,TResponse](método Method'2, String host, opciones de llamada, solicitud TRequest) en Grpc.Core.Interceptores.InterceptingCallInvoker. <BlockingUnaryCall>b__3_0[TRequest,TResponse](TRequest requis, ClientInterceptorContext'2 ctx) en Grpc.Core.ClienteBase.ClienteBaseConfiguración.ClienteBaseConfiguraciónInterceptor.BloqueandoUnaryLlamada[TRequest,TResponse](Solicitud TRequest, ClienteInterceptorContexto'2 contexto, BlockingUnaryCallContinuation'2 continuación) en Grpc.Core.Interceptors.InterceptingCallInvoker.BlockingUnaryCall[TRequest,TResponse](Método Method'2, String host, opciones de llamadas, solicitud TRequest) at UserInfo.UserInfoClient.GetUserInfo(solicitud GetUserInfoRequest, opciones CallOptions) en C:\Users\DELL\source\repos\GrpcService1\gRPC-Client\obj\Debug\netcoreapp3.0\ UserinfoGrpc.cs:línea 62 en UserInfo.UserInfoClient.GetUserInfo(solicitud GetUserInfoRequest, cabeceras de metadatos, fecha límite Nullable'1, cancellationToken cancellationToken) en C: \Users\DELL\source\repos\GrpcService1\gRPC-Client\obj\Debug\netcoreapp3.0\UserinfoGrpc.cs:line 58 en gRPC_Client.Program.Main(String[] args) en C:\Users\DELL\source\repos\GrpcService1\gRPC-Client\Program.cs:line 20 Por favor, pulse cualquier tecla para continuar...
Cuando el valor de retorno es nulo, el cliente lanza una excepción.
Fiddler, coge la bolsa
Para intentar usar Fiddler para capturar paquetes, primero configura el proxy en el cliente de la siguiente manera (de hecho, no puedes configurarlo, solo abre Fiddler directamente):
Error en el lado del servidor:
fail: Microsoft.AspNetCore.Server.Kestrel[0] HTTP/2 sobre TLS no se negociaba en un punto final solo HTTP/2. Error del cliente:
Excepción no gestionada. Grpc.Core.RpcException: Status(StatusCode=Internal, Detail="Respuesta gRPC mala. Protocolo de respuesta degradado a HTTP/1.1.") en Grpc.Net.Client.Internal.HttpClientCallInvoker.BlockingUnaryCall[TRequest,TResponse](método Method'2, String host, opciones de llamada, solicitud TRequest) en Grpc.Core.Interceptores.InterceptingCallInvoker. <BlockingUnaryCall>b__3_0[TRequest,TResponse](TRequest requis, ClientInterceptorContext'2 ctx) en Grpc.Core.ClienteBase.ClienteBaseConfiguración.ClienteBaseConfiguraciónInterceptor.BloqueandoUnaryLlamada[TRequest,TResponse](Solicitud TRequest, ClienteInterceptorContexto'2 contexto, BlockingUnaryCallContinuation'2 continuación) en Grpc.Core.Interceptors.InterceptingCallInvoker.BlockingUnaryCall[TRequest,TResponse](Método Method'2, String host, opciones de llamadas, solicitud TRequest) at UserInfo.UserInfoClient.GetUserInfo(solicitud GetUserInfoRequest, opciones CallOptions) en C:\Users\DELL\source\repos\GrpcService1\gRPC-Client\obj\Debug\netcoreapp3.0\ UserinfoGrpc.cs:línea 62 en UserInfo.UserInfoClient.GetUserInfo(solicitud GetUserInfoRequest, cabeceras de metadatos, fecha límite Nullable'1, cancellationToken cancellationToken) en C: \Users\DELL\source\repos\GrpcService1\gRPC-Client\obj\Debug\netcoreapp3.0\UserinfoGrpc.cs:line 58 en gRPC_Client.Program.Main(String[] args) en C:\Users\DELL\source\repos\GrpcService1\gRPC-Client\Program.cs:línea 23 Por favor, pulse cualquier tecla para continuar...
Dirección postal: https://localhost:5001/UserInfo/GetUserInfo
Contenido:
Host: localhost:5001
User-Agent: grpc-dotnet/2.25.0.0
TE: trailers
grpc-accept-encoding: identity,gzip
Content-Type: application/grpc
Content-Length: 7
Fiddler-Encoding: base64
Finalmente, adjunta el código fuente:
Turistas, si queréis ver el contenido oculto de esta publicación, por favor Respuesta
(Fin)
|