什么是grpc

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

grpc 的主要优点是:

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

这些优点使 grpc 适用于:

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

更多介绍请前往 

 

开始

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

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

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

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

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

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

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

  • grpc.core,包含c-core客户端的c#api。
  • google.protobuf,包含c#的protobuf消息api。
  • grpc.tools,包含对protobuf文件的c#工具支持。

 

服务端代码

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();
}

 

运行

 

 

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/