概要

本文通过一个简单案例介绍如何在AspNetCore中集成gRPC并使用它。需要注意的是我的版本是.NET8,不同的版本可能会存在差异

整体流程

  • 创建两个WebAPI的项目,作为gRPC的服务端和客户端
  • 服务端编写一个服务并注册
  • 客户端集成gRPC服务,然后在控制器中调用

具体步骤

第一步、创建客户端和服务端的项目GRPCStudy.AspNet.Server和GRPCStudy.AspNet.Client

在这里插入图片描述

第二步、编写服务端

1、安装依赖的nuget包Grpc.AspNetCore 2.70.0

2、创建服务基类的描述文件mydate.proto(gRPC工具会根据这个文件生成一个基类),我们会新建一个类继承它并重写里面的方法(即服务的具体实现)
在这里插入图片描述
文件内容如下

syntax = "proto3";

option csharp_namespace = "GRPCStudy.AspNet.Server";

package mydate;

// The greeting service definition.
service MyDate {
  // Sends a greeting
  rpc GetCurrentDatetime (GetCurrentDatetimeRequest) returns (GetCurrentDatetimeReply);
}

// The request message containing the user's name.
message GetCurrentDatetimeRequest {
}

// The response message containing the greetings.
message GetCurrentDatetimeReply {
  string datetime=1;
}

参考C#类,其中包含命名空间GRPCStudy.AspNet.Server、类名MyDate 、方法名GetCurrentDatetime 、参数GetCurrentDatetimeRequest以及返回值GetCurrentDatetimeReply。后面则是对于参数和返回值类型的定义。详情可查看官方文档https://learn.microsoft.com/zh-cn/aspnet/core/grpc/protobuf?view=aspnetcore-8.0

3、项目文件csproj中配置proto文件的指向

	<ItemGroup>
		<Protobuf Include="gRPC\Protos\mydate.proto" GrpcServices="Server" />
	</ItemGroup>

4、重新生成服务端项目

5、创建实现类MyDateService 并继承前面所说的服务基类,重写服务实现GetCurrentDatetime
在这里插入图片描述

   public class MyDateService:MyDate.MyDateBase
   {
       public override Task<GetCurrentDatetimeReply> GetCurrentDatetime(GetCurrentDatetimeRequest request, ServerCallContext context)
       {
           return Task.FromResult(new GetCurrentDatetimeReply { Datetime=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")});
       }
   }

6、项目中集成gRPC,并注册服务
在这里插入图片描述

第三步、编写客户端

1、安装依赖的nuget包

 <PackageReference Include="Google.Protobuf" Version="3.30.1" />
 <PackageReference Include="Grpc.Net.Client" Version="2.70.0" />
 <PackageReference Include="Grpc.Net.ClientFactory" Version="2.70.0" />
 <PackageReference Include="Grpc.Tools" Version="2.71.0">
   <PrivateAssets>all</PrivateAssets>
   <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
 </PackageReference>

2、拷贝服务端的服务描述文件至客户端目录下
在这里插入图片描述
3、修改客户端服务描述文件,其中修改命名空间为GRPCStudy.AspNet.Client

在这里插入图片描述
4、重新生成客户端项目,生成客户端调用类

第四步、客户端项目Progam中集成gRPC,其中的ip和端口号在launchSetting.json中查看

在这里插入图片描述
在这里插入图片描述

第五步、最后就可以在控制器中通过DI注入客户端调用实例,调用服务了
public class Test : ControllerBase
{
    private readonly MyDate.MyDateClient myDateClient;

    public Test(MyDate.MyDateClient myDateClient)
    {
        this.myDateClient = myDateClient;
    }

    [HttpGet]
    public async Task<string> GetCurrentDatetime() 
    {
        var reply=await myDateClient.GetCurrentDatetimeAsync(new GetCurrentDatetimeRequest());
        return $"服务器的时间为:{reply.Datetime}";
    }
}

最终效果

先启动服务端再启动客户端,然后测试API接口

在这里插入图片描述

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐