ToB企服应用市场:ToB评测及商务社交产业平台

标题: .NetCore|.Net6 gRPC服务开发及本地调试 [打印本页]

作者: 干翻全岛蛙蛙    时间: 2022-8-24 22:01
标题: .NetCore|.Net6 gRPC服务开发及本地调试
前言

    最近在项目中实装应用了gRPC技术,本着能把技术描述出来给别人能看的懂的思想及作为自己学习笔记的心态编写了此文。因为在实际项目中是webApi接口和gRPC接口使用在同一项目服务中,所以本文的例子也是建立在webApi项目而非控制台项目中。1、gRPC介绍

gRPC 是Google发起的一个开源远程过程调用 系统。该系统基于HTTP/2 协议传输,使用Protocol Buffers 作为接口描述语言。 其他功能: 认证 双向流 流控制 超时 最常见的应用场景是: 微服务框架下,多种语言服务之间的高效交互。 将手机服务、浏览器连接至后台 产生高效的客户端库-- 维基百科
微软官网介绍:
gRPC是一种与语言无关的高性能远程过程调用 (RPC) 框架。
gRPC 的主要好处是:
现代、高性能、轻量级的 RPC 框架。
合约优先的 API 开发,默认使用 Protocol Buffers,允许语言无关的实现。
可用于多种语言的工具来生成强类型服务器和客户端。
支持客户端、服务器和双向流式调用。
通过 Protobuf 二进制序列化减少网络使用。
这些优势使 gRPC 非常适合:
效率至关重要的轻量级微服务。
需要多种语言进行开发的多语言系统。
需要处理流请求或响应的点对点实时服务。
2、gRPC服务端开发

   服务端的接口以传入一个组织id作为入参,返回该组织用户基本信息为例子 * 首先创建一个webApi项目作为服务端  ![](https://img2022.cnblogs.com/blog/855221/202207/855221-20220709130715436-144401422.png)
点击查看代码
  1. syntax = "proto3";
  2. option csharp_namespace = "GrpcUser";
  3. package UserApi;
  4. service User {
  5.         rpc GetUserByOrganizationId(OrganizationUserRequest) returns (OrganizationUserRequestResponse) {}
  6. }
  7. message OrganizationUserRequest {
  8.         string organizationid = 1;
  9. }
  10. message OrganizationUserRequestResponse {
  11.         string organizationid = 1;
  12.         repeated OrganizationUserItemResponse items = 2;
  13. }
  14. message OrganizationUserItemResponse {
  15.         string id = 1;
  16.         string name =2;
  17.         int32 sex = 3;
  18. }
复制代码
点击查看代码
  1. <Project Sdk="Microsoft.NET.Sdk.Web">
  2.         <PropertyGroup>
  3.                 <TargetFramework>net6.0</TargetFramework>
  4.                 <Nullable>enable</Nullable>
  5.                 <ImplicitUsings>enable</ImplicitUsings>
  6.         </PropertyGroup>
  7.         <ItemGroup>
  8.                 <PackageReference Include="Grpc.AspNetCore" Version="2.47.0" />
  9.                 <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
  10.         </ItemGroup>
  11.         <ItemGroup>
  12.                 <Folder Include="Grpc" />
  13.         </ItemGroup>
  14.         <ItemGroup>
  15.                 <Protobuf Include="Proto\user.proto" GrpcServices="Server" Generator="MSBuild:Compile"/>
  16.         </ItemGroup>
  17. </Project>
复制代码
  点击查看代码
  1. using Grpc.Core;
  2. using GrpcUser;
  3. namespace gRPCServer.Grpc
  4. {
  5.     public class UserService : User.UserBase
  6.     {
  7.         public override Task<OrganizationUserResponse> GetUserByOrganizationId(OrganizationUserRequest request, ServerCallContext context)
  8.         {
  9.             /*******此处实际业务从持久层获取数据**********/
  10.             var organizationUser = new OrganizationUser(request.Organizationid);
  11.             organizationUser.Items = GetUserInfos();
  12.             return Task.FromResult(MapToResponse(organizationUser));
  13.         }
  14.         private List<UserInfo> GetUserInfos()
  15.         {
  16.             var userInfos = new List<UserInfo>();
  17.             userInfos.Add(new UserInfo
  18.             {
  19.                 Id = 1,
  20.                 Name = "用户1",
  21.                 Sex = 0
  22.             });
  23.             userInfos.Add(new UserInfo
  24.             {
  25.                 Id = 2,
  26.                 Name = "用户2",
  27.                 Sex = 1
  28.             });
  29.             return userInfos;
  30.         }
  31.         private OrganizationUserResponse MapToResponse(OrganizationUser organizationUser)
  32.         {
  33.             var response = new OrganizationUserResponse()
  34.             {
  35.                 Organizationid = organizationUser.OrganizationId
  36.             };
  37.             organizationUser.Items.ForEach(item => response.Items.Add(new OrganizationUserItemResponse
  38.             {
  39.                 Id = item.Id,
  40.                 Name = item.Name,
  41.                 Sex = item.Sex
  42.             }));
  43.             return response;
  44.         }
  45.     }
  46.     public class OrganizationUser
  47.     {
  48.         public string? OrganizationId { get; set; }
  49.         public List<UserInfo> Items { get; set; }
  50.         public OrganizationUser(string organizationId)
  51.         {
  52.             OrganizationId = organizationId;
  53.         }
  54.     }
  55.     public class UserInfo
  56.     {
  57.         public int Id { get; set; }
  58.         public string Name { get; set; }
  59.         public int Sex { get; set; }
  60.     }
  61. }
复制代码

  1. //启用grpc
  2. builder.Services.AddGrpc();
  3. //映射grpc服务
  4. app.MapGrpcService<UserService>();
复制代码
  1. builder.WebHost.ConfigureKestrel(
  2.     options =>
  3.     {
  4.         //webApi监听端口
  5.         options.Listen(System.Net.IPAddress.Any, 5157, listenOptions =>
  6.         {
  7.             listenOptions.Protocols = Microsoft.AspNetCore.Server.Kestrel.Core.HttpProtocols.Http1AndHttp2;
  8.         });
  9.         //grpc监听端口
  10.         options.Listen(System.Net.IPAddress.Any, 5158, listenOptions =>
  11.         {
  12.             listenOptions.Protocols = Microsoft.AspNetCore.Server.Kestrel.Core.HttpProtocols.Http2;
  13.         });
  14.     }
  15.     );
复制代码
点击查看代码
  1. using gRPCServer.Grpc;var builder = WebApplication.CreateBuilder(args);builder.WebHost.ConfigureKestrel(
  2.     options =>
  3.     {
  4.         //webApi监听端口
  5.         options.Listen(System.Net.IPAddress.Any, 5157, listenOptions =>
  6.         {
  7.             listenOptions.Protocols = Microsoft.AspNetCore.Server.Kestrel.Core.HttpProtocols.Http1AndHttp2;
  8.         });
  9.         //grpc监听端口
  10.         options.Listen(System.Net.IPAddress.Any, 5158, listenOptions =>
  11.         {
  12.             listenOptions.Protocols = Microsoft.AspNetCore.Server.Kestrel.Core.HttpProtocols.Http2;
  13.         });
  14.     }
  15.     );// 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();app.UseAuthorization();app.MapControllers();app.Run();
复制代码

3、gRPC客户端开发

    客户端项目我们也是新建一个webApi项目,并在webapi接口中调用我们的gRPC服务接口获取数据并以json格式输出* 首先新建一个webApi项目
  1. <Project Sdk="Microsoft.NET.Sdk.Web">
  2.         <PropertyGroup>
  3.                 <TargetFramework>net6.0</TargetFramework>
  4.                 <Nullable>enable</Nullable>
  5.                 <ImplicitUsings>enable</ImplicitUsings>
  6.         </PropertyGroup>
  7.         <ItemGroup>
  8.                 <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
  9.         </ItemGroup>
  10.         <ItemGroup>
  11.                 <Folder Include="Controllers" />
  12.         </ItemGroup>
  13.         <ItemGroup>
  14.                 <Protobuf Include="Proto\user.proto" GrpcServices="Client" Generator="MSBuild:Compile"/>
  15.         </ItemGroup>
  16. </Project>   
复制代码
  1. //注入grpc客户端
  2. builder.Services.AddGrpcClient<GrpcUser.User.UserClient>(
  3.     options =>
  4.     {
  5.         options.Address = new Uri("http://localhost:5158"); //grpcServer项目配置的grpc服务监听端口
  6.     });
复制代码
  1. using Microsoft.AspNetCore.Mvc;
  2. using GrpcUser;
  3. namespace gRPCClient.Controllers
  4. {
  5.     [ApiController]
  6.     [Route("[controller]")]
  7.     public class UserController : ControllerBase
  8.     {
  9.         private User.UserClient _userClient;
  10.         public UserController(User.UserClient userClient)
  11.         {
  12.             _userClient = userClient;
  13.         }
  14.         /// <summary>
  15.         /// 获取用户
  16.         /// </summary>
  17.         /// <param name="organizationId"></param>
  18.         /// <returns></returns>
  19.         [HttpGet]
  20.         
  21.         public async Task<OrganizationUserResponse> GetUser(string organizationId)
  22.         {
  23.             var user = await _userClient.GetUserByOrganizationIdAsync(new OrganizationUserRequest { Organizationid = organizationId });
  24.             return user;
  25.         }
  26.     }
  27. }
复制代码
4、gRPC服务端接口本地调试

grpcServer的接口服务不能像webApi一样直接启动就能进行调试,需要借助一些第三方中间件进行协助测试。我这边使用的是grpcui 进行对本地grpc服务接口的开发调试,下面是grpcui的安装及使用步骤
  1. using gRPCServer.Grpc;var builder = WebApplication.CreateBuilder(args);builder.WebHost.ConfigureKestrel(
  2.     options =>
  3.     {
  4.         //webApi监听端口
  5.         options.Listen(System.Net.IPAddress.Any, 5157, listenOptions =>
  6.         {
  7.             listenOptions.Protocols = Microsoft.AspNetCore.Server.Kestrel.Core.HttpProtocols.Http1AndHttp2;
  8.         });
  9.         //grpc监听端口
  10.         options.Listen(System.Net.IPAddress.Any, 5158, listenOptions =>
  11.         {
  12.             listenOptions.Protocols = Microsoft.AspNetCore.Server.Kestrel.Core.HttpProtocols.Http2;
  13.         });
  14.     }
  15.     );// 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();//映射grpc反射服务app.MapGrpcReflectionService();app.UseAuthorization();app.MapControllers();app.Run();
复制代码
在此页面我们就可以像使用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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4