gRPC 是Google发起的一个开源远程过程调用 系统。该系统基于HTTP/2 协议传输,使用Protocol Buffers 作为接口描述语言。 其他功能: 认证 双向流 流控制 超时 最常见的应用场景是: 微服务框架下,多种语言服务之间的高效交互。 将手机服务、浏览器连接至后台 产生高效的客户端库-- 维基百科
微软官网介绍:
gRPC是一种与语言无关的高性能远程过程调用 (RPC) 框架。
gRPC 的主要好处是:
现代、高性能、轻量级的 RPC 框架。
合约优先的 API 开发,默认使用 Protocol Buffers,允许语言无关的实现。
可用于多种语言的工具来生成强类型服务器和客户端。
支持客户端、服务器和双向流式调用。
通过 Protobuf 二进制序列化减少网络使用。
这些优势使 gRPC 非常适合:
效率至关重要的轻量级微服务。
需要多种语言进行开发的多语言系统。
需要处理流请求或响应的点对点实时服务。
程序包管理器控制台添加 Grpc.AspNetCore nuget包引用Install-Package Grpc.AspNetCore -Version 2.47.0*
新建一个Grpc及Proto文件夹分别放置 gRPC服务和proto文件(方便管理)
在proto文件夹下新建一个 user.proto 文件(vs 文件模板没有该后缀名文件,直接新建任意文件改文件名即可),在 user.proto文件中定义gRPC服务方法、入参及返回值
syntax = "proto3";option csharp_namespace = "GrpcUser";package UserApi;service User { rpc GetUserByOrganizationId(OrganizationUserRequest) returns (OrganizationUserRequestResponse) {} }message OrganizationUserRequest { string organizationid = 1;} message OrganizationUserRequestResponse { string organizationid = 1; repeated OrganizationUserItemResponse items = 2;}message OrganizationUserItemResponse { string id = 1; string name =2; int32 sex = 3; }
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>net6.0</TargetFramework> <Nullable>enable</Nullable> <ImplicitUsings>enable</ImplicitUsings> </PropertyGroup> <ItemGroup> <PackageReference Include="Grpc.AspNetCore" Version="2.47.0" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" /> </ItemGroup> <ItemGroup> <Folder Include="Grpc\" /> </ItemGroup> <ItemGroup> <Protobuf Include="Proto\user.proto" GrpcServices="Server" Generator="MSBuild:Compile"/> </ItemGroup></Project>using Grpc.Core;using GrpcUser;namespace gRPCServer.Grpc{ public class UserService : User.UserBase { public override Task<OrganizationUserResponse> GetUserByOrganizationId(OrganizationUserRequest request, ServerCallContext context) { /*******此处实际业务从持久层获取数据**********/ var organizationUser = new OrganizationUser(request.Organizationid); organizationUser.Items = GetUserInfos(); return Task.FromResult(MapToResponse(organizationUser)); } private List<UserInfo> GetUserInfos() { var userInfos = new List<UserInfo>(); userInfos.Add(new UserInfo { Id = 1, Name = "用户1", Sex = 0 }); userInfos.Add(new UserInfo { Id = 2, Name = "用户2", Sex = 1 }); return userInfos; } private OrganizationUserResponse MapToResponse(OrganizationUser organizationUser) { var response = new OrganizationUserResponse() { Organizationid = organizationUser.OrganizationId }; organizationUser.Items.ForEach(item => response.Items.Add(new OrganizationUserItemResponse { Id = item.Id, Name = item.Name, Sex = item.Sex })); return response; } } public class OrganizationUser { public string? OrganizationId { get; set; } public List<UserInfo> Items { get; set; } public OrganizationUser(string organizationId) { OrganizationId = organizationId; } } public class UserInfo { public int Id { get; set; } public string Name { get; set; } public int Sex { get; set; } }}
//启用grpcbuilder.Services.AddGrpc();//映射grpc服务app.MapGrpcService<UserService>();builder.WebHost.ConfigureKestrel( options => { //webApi监听端口 options.Listen(System.Net.IPAddress.Any, 5157, listenOptions => { listenOptions.Protocols = Microsoft.AspNetCore.Server.Kestrel.Core.HttpProtocols.Http1AndHttp2; }); //grpc监听端口 options.Listen(System.Net.IPAddress.Any, 5158, listenOptions => { listenOptions.Protocols = Microsoft.AspNetCore.Server.Kestrel.Core.HttpProtocols.Http2; }); } );using gRPCServer.Grpc;var builder = WebApplication.CreateBuilder(args);builder.WebHost.ConfigureKestrel( options => { //webApi监听端口 options.Listen(System.Net.IPAddress.Any, 5157, listenOptions => { listenOptions.Protocols = Microsoft.AspNetCore.Server.Kestrel.Core.HttpProtocols.Http1AndHttp2; }); //grpc监听端口 options.Listen(System.Net.IPAddress.Any, 5158, listenOptions => { listenOptions.Protocols = Microsoft.AspNetCore.Server.Kestrel.Core.HttpProtocols.Http2; }); } );// Add services to the container.builder.Services.AddControllers();// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbucklebuilder.Services.AddEndpointsApiExplorer();builder.Services.AddSwaggerGen();//启用grpcbuilder.Services.AddGrpc();var app = builder.Build();// Configure the HTTP request pipeline.if (app.Environment.IsDevelopment()){ app.UseSwagger(); app.UseSwaggerUI();}//映射grpc服务app.MapGrpcService<UserService>();app.UseAuthorization();app.MapControllers();app.Run();

Install-Package Grpc.AspNetCore -Version 2.47.0
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>net6.0</TargetFramework> <Nullable>enable</Nullable> <ImplicitUsings>enable</ImplicitUsings> </PropertyGroup> <ItemGroup> <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" /> </ItemGroup> <ItemGroup> <Folder Include="Controllers\" /> </ItemGroup> <ItemGroup> <Protobuf Include="Proto\user.proto" GrpcServices="Client" Generator="MSBuild:Compile"/> </ItemGroup></Project> //注入grpc客户端builder.Services.AddGrpcClient<GrpcUser.User.UserClient>( options => { options.Address = new Uri("http://localhost:5158"); //grpcServer项目配置的grpc服务监听端口 }); using Microsoft.AspNetCore.Mvc;using GrpcUser;namespace gRPCClient.Controllers{ [ApiController] [Route("[controller]")] public class UserController : ControllerBase { private User.UserClient _userClient; public UserController(User.UserClient userClient) { _userClient = userClient; } /// <summary> /// 获取用户 /// </summary> /// <param name="organizationId"></param> /// <returns></returns> [HttpGet] public async Task<OrganizationUserResponse> GetUser(string organizationId) { var user = await _userClient.GetUserByOrganizationIdAsync(new OrganizationUserRequest { Organizationid = organizationId }); return user; } }}先启动 grpcSever项目,然后再启动 client项目,在swagger页面调用 GetUser方法即可获取到grpc接口返回数据,Grpc服务于客户端调用就搭建好了

完整项目结构
grpcui是Go语言编写的,所以第一步我们先要进行Go环境的搭建。
打开Go官网 ,下载并安装
安装完成,以管理员身份打开PowerShell,并修改Go环境变量go env -w GO111MODULE=on
因为Go 包源在外网,所以我们要设置一些代理,方便安装go env -w GOPROXY=https://goproxy.cn,direct
安装grpcuigo install github.com/fullstorydev/grpcui/cmd/grpcui@latest
安装完成即可使用命令测试是否安装成功grpcui --help
安装完调试工具还需要修改一些我们的grpcService项目,让项目把grpc服务接口给反射出来,grpcui工具才能获取到相应接口并以webUi的方式进行调试
程序包管理器控制台添加 Grpc.AspNetCore.Server.Reflection nuget包引用Install-Package Grpc.AspNetCore.Server.Reflection -Version 2.47.0
项目注入grpc服务反射包服务 builder.Services.AddGrpcReflection();
启用grpc映射app.MapGrpcReflectionService();
最终gRPCServer项目的Program 文件配置如下
using gRPCServer.Grpc;var builder = WebApplication.CreateBuilder(args);builder.WebHost.ConfigureKestrel( options => { //webApi监听端口 options.Listen(System.Net.IPAddress.Any, 5157, listenOptions => { listenOptions.Protocols = Microsoft.AspNetCore.Server.Kestrel.Core.HttpProtocols.Http1AndHttp2; }); //grpc监听端口 options.Listen(System.Net.IPAddress.Any, 5158, listenOptions => { listenOptions.Protocols = Microsoft.AspNetCore.Server.Kestrel.Core.HttpProtocols.Http2; }); } );// Add services to the container.builder.Services.AddControllers();// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbucklebuilder.Services.AddEndpointsApiExplorer();builder.Services.AddSwaggerGen();//启用grpcbuilder.Services.AddGrpc();//启用grpc反射builder.Services.AddGrpcReflection();var app = builder.Build();// Configure the HTTP request pipeline.if (app.Environment.IsDevelopment()){ app.UseSwagger(); app.UseSwaggerUI();}//映射grpc服务app.MapGrpcService<UserService>();//映射grpc反射服务app.MapGrpcReflectionService();app.UseAuthorization();app.MapControllers();app.Run();启动gRPC项目
PowerShell 执行命令 grpcui -plaintext {grpc服务的ip端口地址} 即可开启webUi界面调试grpc接口
启动的WebUI调试页面
在此页面我们就可以像使用Postman调试webApi一样调试我们的grpc接口了
参考资料:
微软gRPC使用教程:https://docs.microsoft.com/en-us/aspnet/core/grpc/?view=aspnetcore-6.0
grpcui测试grpc服务教程:https://docs.microsoft.com/en-us/aspnet/core/grpc/test-tools?view=aspnetcore-6.0
grpcui项目教程:https://github.com/fullstorydev/grpcui