Net Core Grpc - 01. WebApi整合gRPC并简单调用
Net Core gRPC 系列
1. 基础包导入
.csproj1 2 3 4 5 6
| <PackageReference Include="Grpc.AspNetCore" Version="2.34.0" /> <PackageReference Include="Grpc.Core" Version="2.34.0" /> <PackageReference Include="Grpc.Tools" Version="2.34.0"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </PackageReference>
|
2. 创建proto文件
WebApi 项目根目录下创建 Protos 文件夹。添加文件 xxx.proto
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| //proto协议 syntax = "proto3"; // csharp 命名空间 option csharp_namespace = "WebApi.Protos"; // java 命名空间 package greet; // 导入常用类型包 import "google/protobuf/duration.proto"; import "google/protobuf/timestamp.proto"; import "google/protobuf/wrappers.proto"; import "google/protobuf/any.proto";
// 定义接口 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; }
|
proto类型可以详见官方文档 - 为 .NET 应用创建 Protobuf 消息
3. 指定项目为服务端
.csproj1 2 3
| <ItemGroup> <Protobuf Include="Protos\Greet.proto" GrpcServices="Server" /> </ItemGroup>
|
在项目的.csproj文件中指定当前的proto文件生成服务端代码
4. 实现接口
proto文件实际上定义的是接口以及接口使用的数据类型。在编译项目后,通过导入的nuget包工具会生成对应的cs代码。具体位置在obj目录中。
代码也只是将proto文件转换为csharp对应的接口和抽象类。具体业务逻辑需要自定义service类来实现。接口的入参和出参都必须是message类型而不能是基本数据类型。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| using Google.Protobuf.WellKnownTypes; using Grpc.Core; using Newtonsoft.Json; using WebApi.Protos;
namespace WebApplication1Test;
public class GreeterService : Greeter.GreeterBase { private readonly ILogger<GreeterService> _logger; public GreeterService(ILogger<GreeterService> logger) { _logger = logger; }
public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context) { return Task.FromResult(new HelloReply { Message = "Hello webApi " + request.Name }); } }
|
接口实现了proto文件当中定义的接口方法SayHello,方法入参为 HelloRequest 对象,该对象是一个message类型。方法返回 HelloReply 对象,同样也是message对象。此时服务端代码完成。
5. 客户端导入nuget包
.csproj1 2 3 4 5 6 7 8
| <PackageReference Include="Google.Protobuf" Version="3.13.0" /> <PackageReference Include="Grpc.Net.Client" Version="2.34.0" /> <PackageReference Include="Grpc.Net.ClientFactory" Version="2.32.0" /> <PackageReference Include="Grpc.Tools" Version="2.32.0"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </PackageReference>
|
6. 客户端创建protos文件夹并以link的形式引入proto文件,并指定当前为client客户端
.csproj1 2 3 4 5 6
| <ItemGroup> <Protobuf Include="..\WebApplication1Test\Protos\greet.proto" GrpcServices="Client"> <Link>Protos\greet.proto</Link> </Protobuf> </ItemGroup>
|
7. 调用gRPC接口
1 2 3 4 5 6 7 8 9 10
| var channel = GrpcChannel.ForAddress("http://localhost:5004");
var helloReply = client.SayHelloAsync(new HelloRequest { Name = "odin-sam" }); var resultOnce = await helloReply;
Console.WriteLine(resultOnce.Message);
|
完整代码可以在 GitHub
WebApplication1Test 整合了gRPC,ConsoleApp1Test有具体调用示例