首页 > 其他分享 >5.NET中GRPC服务端快速入门,服务端与客户端

5.NET中GRPC服务端快速入门,服务端与客户端

时间:2024-02-18 10:24:17浏览次数:24  
标签:GetUsers GRPC user UserService new NET NickName public 服务端

gRPC是一个现代的开源高性能远程过程调用(RPC)框架,可以在任何环境中运行。它可以有效地连接数据中心内和跨数据中心的服务,支持负载均衡、跟踪、健康检查和身份验证。它也适用于分布式计算,将设备、移动应用程序和浏览器连接到后端服务

1.创建一个空项目GrpcServer

安装包:Grpc.AspNetCore

添加GRPC服务,Program.cs里面

builder.Services.AddGrpc();

设置GRPC为http2.0,Program.cs里面

builder.WebHost.UseKestrel(p =>
{
    p.ConfigureEndpointDefaults(opt =>
    {
        opt.Protocols = HttpProtocols.Http2;
    });
});

也可以在配置文件内去设置,appsettings文件里

 "Kestrel": {
    "EndpointDefaults": {
      "Protocols": "Http2"
    }
  }

 

2.创建一个文件夹Apis里面存放服务

接口:IUserService

public interface IUserService
{
    List<UserInfo> GetUsers();
}

实现:UserServiceImpl

public class UserServiceImpl:IUserService
{
    public List<UserInfo> GetUsers()
    {
        return new()
        {
            new(){Id = 1,NickName = "张三"},
            new(){Id = 2,NickName = "李四"},
            new(){Id = 3,NickName = "王五"},
            new(){Id = 4,NickName = "赵交"}
        };
    }
}

 

3.创建Protos文件夹,里面中定义服务和消息

创建一个文件:user.proto

syntax="proto3"; //声明语法为proto3
option csharp_namespace = "GrpcServer";//声明命名空间,一般为项目的名称
package user;//定义包

//请求参数,1,2,....表示参数的下标。nick_name编译后NickName
message UserDtoGrpc{
  int32 id=1; // Id
  string nick_name=2; // NickName
}

// 入参对象,请求参数,没有可以不写,如果有参数和上面写法一样。
message UserReuqest{
  
}

// 出参对象,返回对象,为list集合,repeated表示一个集合。
message UserResponse{
  repeated UserDtoGrpc user_list=1;
}

//里面定义方法
service UserService{
  // 声明了需要暴露的Grpc方法
   rpc GetUsers(UserReuqest) returns (UserResponse);
}

 

编辑GrpcServer.csproj文件,将user.proto暴露出来生成C#的资产。

<ItemGroup>
      <PackageReference Include="Grpc.AspNetCore" Version="2.56.0" />
        <ProtoBuf Include="Protos/user.proto" GrpcService="Server" />
    </ItemGroup>

最后重新生成项目

4.创建一个文件夹Services,来存放GRPC的服务。

在Program.cs里面注册

builder.Services.AddTransient<IUserService, UserServiceImpl>();

 

添加一个类UserServiceGrpc继承的UserService其实就是user.proto文件里面的UserService。

重写的GetUsers方法其实就是UserServiceBase的GetUsers方法。

public class UserServiceGrpc:UserService.UserServiceBase
{
    private readonly IUserService _userService;

    public UserServiceGrpc(IUserService userService)
    {
        _userService = userService;
    }

    public override Task<UserResponse> GetUsers(UserReuqest request, ServerCallContext context)
    {
        UserResponse response = new();

        var userInfos = _userService.GetUsers();
        foreach (var userInfo in userInfos)
        {
            response.UserList.Add(new UserDtoGrpc()
            {
                Id = userInfo.Id,
                NickName = userInfo.NickName
            });
        }

        return Task.FromResult(response);
    }
}

添加到管道里面去

app.MapGrpcService<UserServiceGrpc>();

 

 

5.创建一个客户端空项目GrpcClient

安装包:

Swashbuckle.AspNetCore

Grpc.Net.Client

Grpc.Tools

Google.Protobuf

 

Program.cs里面配置

builder.Services.AddControllers();
builder.Services.AddSwaggerGen();

app.UseSwagger();
app.UseSwaggerUI();
app.UseRouting();

app.MapControllers();

launchSettings.json里面配置Swagger页面。

 "http": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "launchUrl": "swagger",
      "applicationUrl": "http://localhost:5290",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }

 

创建一个文件夹Protos,添加user.proto文件

syntax="proto3";
option csharp_namespace = "GrpcClient";
package user;


message UserDtoGrpc{
  int32 id=1; // Id
  string nick_name=2; // NickName
}

// 入参对象
message UserReuqest{
  
}

// 出参对象
message UserResponse{
  repeated UserDtoGrpc user_list=1;
}


service UserService{
  // 声明了需要暴露的Grpc方法
   rpc GetUsers(UserReuqest) returns (UserResponse);
}

 

生成后注意GrpcClient.csproj文件内是否有生成

 <Protobuf Include="Protos\user.proto">
      <GrpcServices>Client</GrpcServices>
      <Access>Public</Access>
      <ProtoCompile>True</ProtoCompile>
      <CompileOutputs>True</CompileOutputs>
      <OutputDir>obj\Debug\net7.0\</OutputDir>
      <Generator>MSBuild:Compile</Generator>
    </Protobuf>

 

添加控制器文件夹Controllers

[ApiController]
    [Route("[controller]/[action]")]
    public class UserController : ControllerBase
    {
        private readonly UserService.UserServiceClient _userServiceClient;

        public UserController(UserService.UserServiceClient userServiceClient)
        {
            _userServiceClient = userServiceClient;
        }

        [HttpGet]
        public IActionResult Get()
        {
             // 创建通信频道
             var channel = GrpcChannel.ForAddress("http://localhost:5023");
             // 创建客户端
             var userServiceClient = new UserService.UserServiceClient(channel);
            var userResponse = _userServiceClient.GetUsers(new UserReuqest());

            return Ok(userResponse.UserList);
        }
    }

 

标签:GetUsers,GRPC,user,UserService,new,NET,NickName,public,服务端
From: https://www.cnblogs.com/MingQiu/p/18018843

相关文章

  • kubernetes对接kadalu使用GlusterFS作为存储
    1.安装glusterfsgluster官网:https://www.gluster.org部署参考:https://cloud-atlas.readthedocs.io/zh-cn/latest/kubernetes/storage/k8s_gluster.html前期需要准备3个节点作为glusterfs集群slave,并且每个节点至少需要个提供1块磁盘。节点名称ip地址磁盘k8s-master0......
  • Asp.Net Core访问阿里云MongoDB云数据库
    Asp.NetCore访问阿里云MongoDB云数据库选择.NetCore技术栈开发跨平台软件解决方案,投入少,产出快,有助于企业内部降本增效。MongoDB的实体类增加字段不用迁移数据库,适合需求经常变化的应用场景。如果是企业内部小型应用,拉一个MongoDB容器即可,如果要进一步考虑多节点冗余,高可用,异地......
  • .NET 8 中 使用 IFormFile 上传大文件报错解决方案
    前言:项目中使用IFormFile写了一个上传文件的api,测试小文件时正常,当上传大文件(几十兆)时如下报错:使用默认的http启动,如下提示使用IIS启动,如下报错Error:RequestEntityTooLarge原因:.NET官方出于安全考虑,对body的大小做了限制,超出了限制就会form转化失败,导致我们Reuest.......
  • dotnet-cnblog tool 测试案例
    这是测试donet-cnblog工具是否能将正常的Typora图片转换为博客园格式测试1:本地图片导入测试2:QQ截图测试3:urlhttps://pics3.baidu.com/feed/9345d688d43f8794105499b2ead60ef819d53ad8.jpeg@f_auto?token=d70fe4868ac1356d70833be721199be3结论成功!!!随后整理出自己的实践......
  • 【译】我为 .NET 开发人员准备的 2023 年 Visual Studio 10 大新功能
    原文|JamesMontemagno翻译|郑子铭VisualStudio2022在2023年发布了许多令人难以置信的功能,为.NET开发人员提供了大量新工具来提高他们的工作效率。有这么多可供选择,我精心挑选了一个包括编辑器改进、生产力更新和人工智能辅助的选项。让我们来探讨一些最有影响力的功......
  • dotnet asp.net seer agv 后台服务 单例注入
    常驻后台的数据导出服务/常驻后台的数据导出服务.csproj<ProjectSdk="Microsoft.NET.Sdk.Web"><PropertyGroup><TargetFramework>net7.0</TargetFramework><Nullable>enable</Nullable><ImplicitUsings>enable</Implic......
  • Net 8 Blazor Web App项目访问Identity Server 4
    Net8BlazorWebApp项目访问IdentityServer4IdentityServer系列目录BlazorServer访问IdentityServer4单点登录-SunnyTrudeau-博客园(cnblogs.com)BlazorServer访问IdentityServer4单点登录2-集成Asp.Net角色-SunnyTrudeau-博客园(cnblogs.com)BlazorSe......
  • 《AI驱动下的开发者新生态》-2024长沙.NET技术社区活动-诚邀大家报名
    回顾2019年初,在.NET中文社区及包括苏州、广州、深圳等地区社区等大力推动、在众多企业的大力支持下,长沙地区的开发者们发起成立了长沙.NET技术社区,并组织了《2019年长沙开发者技术大会》,当时参会人数超过200多人,会上宣讲的约6个话题,也一度成为长沙地区比较热门的技术话题,在社区激......
  • Mac arm 调试 maui 提示 iOS 构建没有“net8.0-ios/iossimulator-x64”的目标解决办法
    在arm芯片mac调试,使用macforvs,出现以下错误obj/project.assets.json”没有“net8.0-ios/iossimulator-x64”的目标。确保已运行还原,且“net8.0-ios”已包含在项目的TargetFrameworks中。可能需要在项目RuntimeIdentifiers中包括“iossimulator-x64”。(NETSDK1047......
  • 03 \| 换个角度解决问题:服务端推送技术
    作者:四火完成时间:总结时间:你好,我是四火。今天我们继续和HTTP“过不去”。在上一讲,我们讲到了HTTP在安全传输方面的局限,并介绍了怎样使用经过TLS加密的HTTPS连接来解决这样的弊端。今天,我要给你讲讲传统HTTP的另一个在交互模式上的局限,就是只能由客户端主动发起......