首页 > 其他分享 >7.NET中GRPC进阶,可空类型,返回集合

7.NET中GRPC进阶,可空类型,返回集合

时间:2024-02-18 14:00:30浏览次数:29  
标签:google protobuf GRPC response 可空 var new public 进阶

 

1.添加两个类,一个类型可空,一个不可空

public class Person1
{
    public int Id { get; set; }
    public double Money { get; set; }
    public float Weight { get; set; }
    public bool Gender { get; set; }
    public long PhoneNum { get; set; }
    public string Email { get; set; }
    public System.DateTime Birthday { get; set; }
}

 

public class Person2
{
    public int? Id { get; set; }
    public double? Money { get; set; }
    public float? Weight { get; set; }
    public bool? Gender { get; set; }
    public long? PhoneNum { get; set; }
    public string? Email { get; set; }
    public DateTime? Birthday { get; set; }
}

 

 

2.在GrpcServer项目中的Apis文件夹中添加

 public interface IPersonService
    {
        Person1 GetPerson1();
        
        Person2 GetPerson2();
    }
public class PersonServiceImpl:IPersonService
{
    public Person1 GetPerson1()
    {
        var person = new Person1
        {
            Id = 1,
            Money = 3000.00d,
            Weight = 1.78f,
            Gender = true,
            PhoneNum = 13823784433,
            Email = "[email protected]",
            Birthday = DateTime.Parse("2000-02-20").ToUniversalTime()
        };
        return person;
    }

    public Person2 GetPerson2()
    {
        var person = new Person2
        {
            Id = 1,
            Money = 3000.00d,
            Weight = 1.78f,
            Gender = true,
            PhoneNum = 13823784433,
            Email = "[email protected]",
            Birthday = DateTime.Parse("2000-02-20")
        };
        return person;
    }
}

 

3.然后再Protos文件中添加person.proto文件

syntax = "proto3";
option csharp_namespace = "GrpcServer";
package person;
// 时间类型
import "google/protobuf/timestamp.proto";
// 无参/无返回值
import "google/protobuf/empty.proto";
// 引用可空类型
import "google/protobuf/wrappers.proto";


message Person1Dto{
  int32 id=1;
  double money=2;
  float weight=3;
  bool gender=4;
  int64 phone_num=5;
  string email=6;
  google.protobuf.Timestamp birthday=7;
}

// 出参1,返回类型
message Person1Response{
    Person1Dto person =1;
}
//入参,传入参数
message Person1Request{
  
}


// 可空类型
message Person2Dto{
  google.protobuf.Int32Value id = 1;
  google.protobuf.DoubleValue money = 2;
  google.protobuf.FloatValue weight = 3;
  google.protobuf.BoolValue gender = 4;
  google.protobuf.Int64Value phone_num = 5;
  google.protobuf.StringValue email = 6;
  google.protobuf.Timestamp birthday = 7;
}
//出参,返回类型 message Person2Response{ Person2Dto person =1; } //入参,参数 集合请求对象 message CollectionRequest{ } // 集合响应对象 message CollectionResponse{ repeated Person1Dto person=1; map<int32,Person1Dto> dict=2; } //服务 service PersonService{ rpc GetPerson1(google.protobuf.Empty) returns (Person1Response); rpc GetPerson2(google.protobuf.Empty) returns (Person2Response); // 返回集合 rpc GetCollection(CollectionRequest) returns (CollectionResponse); }

 

看GrpcServer.csproj内是否生成

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

 

在Services文件夹内添加PersonServiceGrpc.cs

public class PersonServiceGrpc:PersonService.PersonServiceBase
{
    private readonly IPersonService _personService;

    public PersonServiceGrpc(IPersonService personService)
    {
        _personService = personService;
    }

    public override Task<Person1Response> GetPerson1(Empty request, ServerCallContext context)
    {
         Person1 person1 =  _personService.GetPerson1();
         Person1Response response = new();
         response.Person = new()
         {
             Id = person1.Id,
             Money = person1.Money,
             Weight = person1.Weight,
             Gender = person1.Gender,
             PhoneNum = person1.PhoneNum,
             Email = person1.Email,
             // timestamp 类型需要UTC时间
             Birthday = DateTime.Parse("2000-02-20").ToUniversalTime().ToTimestamp()
         };
         

         return Task.FromResult(response);
    }

    public override Task<Person2Response> GetPerson2(Empty request, ServerCallContext context)
    {
        Person2 person2 =  _personService.GetPerson2();
        Person2Response response = new();
        response.Person = new()
        {
            Id = person2.Id,
            Money = person2.Money,
            Weight = person2.Weight,
            Gender = person2.Gender,
            PhoneNum = person2.PhoneNum,
            Email = person2.Email,
            // timestamp 类型需要UTC时间
            Birthday = DateTime.Parse("2000-02-20").ToUniversalTime().ToTimestamp()
        };
        
        return Task.FromResult(response);
    }

    public override Task<CollectionResponse> GetCollection(CollectionRequest request, ServerCallContext context)
    {
        CollectionResponse response = new();
        Person1Dto dto1 = new()
        {
            Id = 1,
            Money = 3000.00d,
            Weight = 1.78f,
            Gender = true,
            PhoneNum = 13823784433,
            Email = "[email protected]",
            Birthday = DateTime.Parse("2000-02-20").ToUniversalTime().ToTimestamp()
        };
        Person1Dto dto2 = new()
        {
            Id = 2,
            Money = 2000.00d,
            Weight = 2.78f,
            Gender = true,
            PhoneNum = 13823782222,
            Email = "[email protected]",
            Birthday = DateTime.Parse("2022-02-22").ToUniversalTime().ToTimestamp()
        };
        List<Person1Dto> list = new() {dto1, dto2};

        response.Person.AddRange(list);
        response.Dict.Add(1,dto1);
        response.Dict.Add(2,dto2);

        return Task.FromResult(response);
    }
}

 

在Program.cs添加注册服务和添加管道

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddGrpc();//添加GRPC服务

//设置GRPC为http2.0
builder.WebHost.UseKestrel(p =>
{
    p.ConfigureEndpointDefaults(opt =>
    {
        opt.Protocols = HttpProtocols.Http2;
    });
});


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



var app = builder.Build();


app.MapGrpcService<UserServiceGrpc>();
app.MapGrpcService<PersonServiceGrpc>();

app.Run();

 

客户端

GrpcClient客户端项目中的Protos文件夹中添加person.proto文件

syntax = "proto3";
option csharp_namespace = "GrpcClient";
package person;
// 时间类型
import "google/protobuf/timestamp.proto";
// 无参/无返回值
import "google/protobuf/empty.proto";
// 引用可空类型
import "google/protobuf/wrappers.proto";


message Person1Dto{
  int32 id=1;
  double money=2;
  float weight=3;
  bool gender=4;
  int64 phone_num=5;
  string email=6;
  google.protobuf.Timestamp birthday=7;
}

// 出参1
message Person1Response{
  Person1Dto person =1;
}

message Person1Request{

}


// 可空类型
message Person2Dto{
  google.protobuf.Int32Value id = 1;
  google.protobuf.DoubleValue money = 2;
  google.protobuf.FloatValue weight = 3;
  google.protobuf.BoolValue gender = 4;
  google.protobuf.Int64Value phone_num = 5;
  google.protobuf.StringValue email = 6;
  google.protobuf.Timestamp birthday = 7;
}
message Person2Response{
  Person2Dto person =1;
}

// 集合请求对象
message CollectionRequest{

}

// 集合响应对象
message CollectionResponse{
  repeated Person1Dto person=1;
  map<int32,Person1Dto> dict=2;
}




service PersonService{
  rpc GetPerson1(google.protobuf.Empty) returns (Person1Response);
  rpc GetPerson2(google.protobuf.Empty) returns (Person2Response);

  // 返回集合
  rpc GetCollection(CollectionRequest) returns (CollectionResponse);
}

生成后查看GrpcClient.csproj是否以下

 <ItemGroup>
    <Protobuf Include="Protos\person.proto">
      <GrpcServices>Client</GrpcServices>
      <Access>Public</Access>
      <ProtoCompile>True</ProtoCompile>
      <CompileOutputs>True</CompileOutputs>
      <OutputDir>obj\Debug\net7.0\</OutputDir>
      <Generator>MSBuild:Compile</Generator>
    </Protobuf>
    <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>
  </ItemGroup>

 

添加PersonController控制器

[ApiController]
[Route("[controller]/[action]")]
public class PersonController : ControllerBase
{
    private readonly PersonService.PersonServiceClient _personServiceClient;


    public PersonController(PersonService.PersonServiceClient personServiceClient)
    {
        _personServiceClient = personServiceClient;
    }

    [HttpGet]
    public async Task<IActionResult> GetPerson1()
    {
        // 创建通信频道
         var channel = GrpcChannel.ForAddress("http://localhost:5023");
         var client = new PersonService.PersonServiceClient(channel);
         var response = client.GetPerson1Async(new Empty());
        // 等待获取头
        // var resultHeaders = await response.ResponseHeadersAsync;
        // var resultResponse = await response.ResponseAsync;

        var response = _personServiceClient.GetPerson1(new Empty());

        return Ok(response.Person);
    }
    
    [HttpGet]
    public IActionResult GetPerson2()
    {
        // 创建通信频道
         var channel = GrpcChannel.ForAddress("http://localhost:5023");
         var client = new PersonService.PersonServiceClient(channel);
        var response = _personServiceClient.GetPerson2(new Empty());

        return Ok(response.Person);
    }
    
    [HttpGet]
    public IActionResult GetCollection()
    {
        // 创建通信频道
         var channel = GrpcChannel.ForAddress("http://localhost:5023");
         var client = new PersonService.PersonServiceClient(channel);
        var response = _personServiceClient.GetCollection(new CollectionRequest());

        return Ok(new{response.Person,response.Dict});
    }
}

 

 

标签:google,protobuf,GRPC,response,可空,var,new,public,进阶
From: https://www.cnblogs.com/MingQiu/p/18019185

相关文章

  • 5.NET中GRPC服务端快速入门,服务端与客户端
    gRPC是一个现代的开源高性能远程过程调用(RPC)框架,可以在任何环境中运行。它可以有效地连接数据中心内和跨数据中心的服务,支持负载均衡、跟踪、健康检查和身份验证。它也适用于分布式计算,将设备、移动应用程序和浏览器连接到后端服务1.创建一个空项目GrpcServer安装包:Grpc.AspNe......
  • 【Vue前端】vue使用笔记0基础到高手第2篇:Vue进阶知识点介绍(附代码,已分享)
    本系列文章md笔记(已分享)主要讨论vue相关知识。Vue.js是前端三大新框架:Angular.js、React.js、Vue.js之一,Vue.js目前的使用和关注程度在三大框架中稍微胜出,并且它的热度还在递增。Vue.js是一个轻巧、高性能、可组件化的MVVM库,同时拥有非常容易上手的API。Vue.js是一个构建数据驱动......
  • 大数进阶(3)——稳定(单段)
    前言接下来的稳定序数是真正的空白地带,其行为多种多样,层级复杂嵌套,并且还没有被完全解析\(\Sigma_1\)稳定定义定义:若\(L_\alpha\prec_{\Sigma_1}L_\beta\),则称\(\alpha\)是\(\Sigma_1\)稳定(stable)序数,\(\alpha\)稳定到\(\beta\),记为\(\lambda\alpha.\beta\)或者\(\alpha\ri......
  • 大数进阶(2)——反射($\Pi_2$及其上)
    前言\(\Pi_1\)反射看上去行为非常简单,强度也不高,那为什么要用这种奇怪的东西?真正上强度是从\(\Pi_2\)反射开始,随着强度的大幅度提升,序数的行为逐渐复杂,这需要对其行为更深刻的理解,也即对于数学基础的更高要求在进入\(\Pi_2\)反射之前,需要更多的基础来往后推进,否则只会一头雾水......
  • 线段树进阶
    线段树进阶动态开点定义动态存储数据的线段树,可以优化空间复杂度实现为了避免\(N<<1\),不再使用完全二叉树存储,而记录左右儿子\(ls,rs\)此外需要\(tot\)记录已经开了多少点在递归时要记录点的左右区间,确保开点时能知道区间大小voidmodify(int&p,intL,intR,intl,i......
  • 线段树进阶
    线段树进阶线段树分治P5787判断二分图可以用扩展域并查集,采用线段树分治,线段树上的每一个结点作为每一段时间。每个结点上的修改和回溯需要用到可撤销的并查集。时间复杂度\(O(n\logk\logn)\)扫描线扫描线求矩形面积#include<bits/stdc++.h>usingnamespacestd;typ......
  • 大数进阶(1)——反射(Π1)
    一点吐槽序数分析(OrdinalAnalysis)这一脉实际上是从证明论衍生出来的,因此去找文献通常会找到各种证明某一公理系统强度的文献,并没有系统的综述踏入序数之后,几乎没有统一记号,需要在各人的记号中切换,加之数理逻辑本身就需要一堆新记号,可谓是乱七八糟,有一种踏入前沿的美(确实即使从G......
  • 字符串进阶题目选做
    字符串进阶一些不那么裸的字符串题,甚至出现了parent树优化建图这种离谱的东西。前置知识:kmp,字符串哈希,AC自动机,SA,SAM,ManacherCF914FSubstringsinaString题意:给定字符串,要求支持单点修改,询问时给出字符串,求在\([l,r]\)中出现多少次。思路:考虑一般的字符串维护方法都......
  • 线段树进阶奇淫巧计
    看本文文字部分可以少带脑子,但是代码部分仔细看了因为不一定编译了不一定对动态开点一般来说线段树的空间开销是比较巨大的,需要\(4n\)的空间,一般其实是可以支撑的,但是权值线段树就不一定了。值域级别的代价是支持不了的。一般在动态开点的前提下只需要支持单点操作一旦是序......
  • 最新Burp Suite进阶技术
    Burp Suite进阶1.Burp ScannerBurpScanner主要用于自动检测Web系统的各种漏洞。本节介绍BurpScanner的基本使用方法,在实际使用中可能会有所改变,但大体环节如下。首先,确认BurpSuite正常启动并完成浏览器代理的配置。然后进入BurpProxy,关闭代理拦截功能,快速浏览需要扫描的域......