欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

asp.net core 3.0 gRPC框架小试

程序员文章站 2022-07-11 08:32:27
什么是gRPC gRPC是google开源的一个高性能、跨语言的RPC框架,基于HTTP2协议,采用ProtoBuf 定义的IDL。 gRPC 的主要优点是: 现代高性能轻量级 RPC 框架。 协定优先 API 开发,默认使用协议缓冲区,允许与语言无关的实现。 可用于多种语言的工具,以生成强类型服务 ......

什么是grpc

grpc是google开源的一个高性能、跨语言的rpc框架,基于http2协议,采用protobuf 定义的idl。

grpc 的主要优点是:

  • 现代高性能轻量级 rpc 框架。
  • 协定优先 api 开发,默认使用协议缓冲区,允许与语言无关的实现。
  • 可用于多种语言的工具,以生成强类型服务器和客户端。
  • 支持客户端、服务器和双向流式处理调用。
  • 使用 protobuf 二进制序列化减少对网络的使用。

这些优点使 grpc 适用于:

  • 效率至关重要的轻量级微服务。
  • 需要多种语言用于开发的 polyglot 系统。
  • 需要处理流式处理请求或响应的点对点实时服务。

更多介绍请前往 

 

开始

netcore3.0中已经加入了grpc的模板项目.

1,打开vs2019,创建一个asp.net core web项目

asp.net core 3.0 gRPC框架小试

asp.net core 3.0 gRPC框架小试

2,选择asp.net core 3.0就会出现grpc模板,点击创建。

如果没安装core3的sdk请前往下载最新版本安装,

如果你已经安装了core 3.0的sdk却还是无法显示其选项,工具 > 选项 ,勾选“使用 .net core sdk 预览版”

asp.net core 3.0 gRPC框架小试

3,模板只有一个服务端项目,需要自行创建一个客户端来做演示,创建一个.netcore的控制台程序即可。

客户端需要安装以下三个包

asp.net core 3.0 gRPC框架小试

 

服务端代码

greet.proto,proto相关语法只是,前往 ,可能需要*。

syntax = "proto3";

package greet;

// the greeting service definition.
service greeter {
  // sends a greeting
  rpc sayhello (hellorequest) returns (helloreply) {}
}

// the request message containing the user's name.
message hellorequest {
  string name = 1;
  enum language{
    en_us = 0; //枚举必须以0开始
    zh_cn = 1;
  }
  language languageenum = 2;
}

// the response message containing the greetings.
message helloreply {
  string message = 1;
  int32 num = 2;
  int32 adsa = 3;
}

 

 greeterservice

public class greeterservice : greeter.greeterbase
{
    public override task<helloreply> sayhello(hellorequest request, servercallcontext context)
    {
        var greeting = string.empty;
        switch (request.languageenum)
        {
            case hellorequest.types.language.enus:
                greeting = "hello";
                break;
            case hellorequest.types.language.zhcn:
                greeting = "你好";
                break;
        }

        return task.fromresult(new helloreply
        {
            message = $"{greeting} {request.name}",
            num = new random().next()
        });
    }
}

 

客户端代码

添加greet.proto文件,protos\greet.proto文件从服务端复制到客户端项目。greet.proto文件路径添加到项目文件grpcdemo.client.csproj的<itemgroup>节点内。

这里我们不复制,直接定位到相关路径即可。

grpcdemo.client.csproj

<project sdk="microsoft.net.sdk">

  <propertygroup>
    <outputtype>exe</outputtype>
    <targetframework>netcoreapp3.0</targetframework>
  </propertygroup>

  <itemgroup>
    <packagereference include="google.protobuf" version="3.7.0" />
    <packagereference include="grpc.core" version="1.20.1" />
    <packagereference include="grpc.tools" version="1.20.1">
      <privateassets>all</privateassets>
      <includeassets>runtime; build; native; contentfiles; analyzers; buildtransitive</includeassets>
    </packagereference>
    <!-- include支持*匹配 -->
    <!-- grpcservices="client"添加该属性构建相关客户端类文件(元数据) -->
    <protobuf include="..\grpcdemo.server\protos\*.proto" grpcservices="client" />
  </itemgroup>
  
</project>

program.cs

static async task main(string[] args)
{
    var serveraddress = "localhost:50051";
    //创建连接通道,端口80
    var channel = new channel(serveraddress, channelcredentials.insecure);
    var client = new greeter.greeterclient(channel);

    //请求
    var reply1 = await client.sayhelloasync(
        new hellorequest { name = "wu", languageenum = hellorequest.types.language.enus });
    console.writeline($"{reply1.message} num:{reply1.num}");
    var reply2 = await client.sayhelloasync(
        new hellorequest { name = "wu", languageenum = hellorequest.types.language.zhcn });
    console.writeline($"{reply2.message} num:{reply2.num}");

    //使用完后应释放资源
    await channel.shutdownasync();
    console.writeline("已断开连接");
    console.writeline("press any key to exit...");
    console.readkey();
}

 

运行

 asp.net core 3.0 gRPC框架小试

 

demo地址 https://github.com/wwwu/grpcdemo 

 

参考文档

https://docs.microsoft.com/zh-cn/aspnet/core/grpc/?view=aspnetcore-3.0

https://developers.google.com/protocol-buffers/docs/proto3

https://grpc.io/docs/guides/