.NET 6 中 gRPC 使用

一、简介

 

简单解析一下gRPCgRPC 是一个由 Google 开源的,跨语言的,高性能的远程过程调用(RPC)框架。

特点:

  • 跨语言

  • 内容 protobuf 格式(比 json 体积小),网络传输快

  • 使用 HTTP/2 进行传输

适合高性能轻量的微服务,一般对外的接口用 restful api,内部服务的调用用gRPCgRPC是一个分布式服务框架,和以前的 WebService,WCF 类似。

二、创建gRPC服务端

1、创建gRPC项目

新建一个 gRPC 模板的项目

.NET 6 中 gRPC 使用
.NET 6 中 gRPC 使用
.NET 6 中 gRPC 使用

特别的地方就这里 4 点。

1、基于 http2 来通信。

2、proto 协议文件,greet.proto 是项目默认给我们的一个 hello world 的示例。它会根据协议自动生成需要的类。

.NET 6 中 gRPC 使用

3、服务类,Greeter.GreeterBase 来自于 2 中的 proto 文件自动生成的类,生成的类在 objDebugnet6.0Protos 目录下。

.NET 6 中 gRPC 使用

自动生成的类:

.NET 6 中 gRPC 使用

4、Program.cs 添加了 gRPC 服务,和把 GreeterService 注册到管道中。

2、编写自己的服务

怎么样写自己的调用服务呢?

1、创建 proto 文件

参照上面的示例创建自己的 Proto 文件

.NET 6 中 gRPC 使用

代码


syntax = "proto3";

option csharp_namespace = "GrpcDemo.Service";

package order;

// 订单服务定义
service Order {
  // 创建订单
  rpc CreateOrder (CreateRequest) returns (CreateResult);
  //查询订单
  rpc QueryOrder (QueryRequest) returns (QueryResult);
}

//创建订单请求参数
message CreateRequest {
  string orderNo = 1;
  string orderName=2;
  double price=3;
}

//创建订单返回结果
message CreateResult {
  bool result = 1;
  string message=2;
}

//查询订单请求参数
message QueryRequest{
    int id=1;
}
//查询订单返回结果
message QueryResult{
    int id=1;
    string orderNo=2;
    string orderName=3;
    double price=4;
}

生成一下就能看到对应的类已经生成了。

.NET 6 中 gRPC 使用

2、实现定义的服务

创建 OrderService.cs


public class OrderService:Order.OrderBase
{
    private readonly ILogger _logger;
    public OrderService(ILogger logger)
    {
        _logger = logger;
    }
    /// 
    /// 创建订单
    /// 
    /// 
    /// 
    /// 
    public override Task CreateOrder(CreateRequest request, ServerCallContext context)
    {
        //报存数据库 todo

        return Task.FromResult(new CreateResult
        {
            Result=true,
            Message="订单创建成功"
        });
    }
    /// 
    /// 查询订单
    /// 
    /// 
    /// 
    /// 
    public override Task QueryOrder(QueryRequest request, ServerCallContext context)
    {
        //查询数据库 //todo

        return Task.FromResult(new QueryResult
        {
            OrderInfo=new OrderInfo
            {
                Id = request.Id,
                OrderNo = DateTime.Now.ToString("yyyyMMddHHmmss"),
                OrderName = "冰箱",
                Price = 1288
            }
        });
    }
}

继承的 Order.OrderBase 是上面的 proto 文件生成的,然后实现了 proto 里面定义的两个服务。

然后在 program.cs 里面把服务注入管道。

.NET 6 中 gRPC 使用

到这里服务端就完成了,就可以启动服务端了。

.NET 6 中 gRPC 使用

浏览器访问不了,要通过 gRPC 客户端才能访问,下面就建一个 gRPC 客户端。

三、创建 gRPC 客户端

1、创建客户端项目

1.1、这里创建一个控制台程序。

1.2、然后添加 Nuget 包


Google.Protobuf
Grpc.Net.Client
Grpc.ToolsGrpc.Net.clientFactory

1.3、把服务端的 proto 文件拷贝过来

.NET 6 中 gRPC 使用

1.4、编辑项目文件,把 proto 里面的内容替换掉,默认是服务端的配置

.NET 6 中 gRPC 使用




生成的时候,客户端也生成了对应 proto 的类

.NET 6 中 gRPC 使用

2、grPC 服务 https 的调用

因为服务端提供了 http 和 https 的端口,这里先调用 https 的

创建 GrpcRequestTest.cs 类


/// 
/// gRPC 请求测试
/// 
public class GrpcRequestTest
{
    public void CreateOrder()
    {
        //常规使用,https
        string url = "https://localhost:7246";
        using(var channel=GrpcChannel.ForAddress(url))
        {
            var client = new Order.OrderClient(channel);
            var reply = client.CreateOrder(new CreateRequest()
            {
                OrderNo = DateTime.Now.ToString("yyyMMddHHmmss"),
                OrderName = "冰箱 22 款",
                Price = 1688
            });

            Console.WriteLine($"结果:{reply.Result},message:{reply.Message}");
        }
        Console.ReadKey();
    }
}

结果

.NET 6 中 gRPC 使用

3、gRPC 内网 http 调用


public void CreateOrder()
{
     //使用 http
    AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
    string url = "http://localhost:5246";

    using(var channel=GrpcChannel.ForAddress(url))
    {
        var client = new Order.OrderClient(channel);
        var reply = client.CreateOrder(new CreateRequest()
        {
            OrderNo = DateTime.Now.ToString("yyyMMddHHmmss"),
            OrderName = "冰箱 22 款",
            Price = 1688
        });

        Console.WriteLine($"结果:{reply.Result},message:{reply.Message}");
    }
    Console.ReadKey();
}

比起 https,前面多了一行。

结果

.NET 6 中 gRPC 使用

4、IOC 注入的方式调用 gRPC

program.cs 里面注入 gRPCClient


// See https://aka.ms/new-console-template for more information
using GrpcDemo.Client;
using GrpcDemo.Service;
using Microsoft.Extensions.DependencyInjection;

Console.WriteLine("Hello, World!");

IServiceCollection services = new ServiceCollection();
services.AddTransient();

#region gRPC Client 注册
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
services.AddGrpcClient(options =>
{
    options.Address = new Uri("http://localhost:5246");
}).ConfigureChannel(grpcOptions =>
{
    //可以完成各种配置,比如 token
});
#endregion

//构建容器
IServiceProvider serviceProvider = services.BuildServiceProvider();
//解析 grpc 请求测试
var grpcRequestTest = serviceProvider.GetService();
//执行
grpcRequestTest.CreateOrder();

grpcRequestTest 里代码:


/// 
/// gRPC 请求测试
/// 
public class GrpcRequestTest
{
    private Order.OrderClient _orderClient;
    public GrpcRequestTest(Order.OrderClient orderClient)
    {
        _orderClient = orderClient;
    }
    public void CreateOrder()
    {
        var reply = _orderClient.CreateOrder(new CreateRequest()
        {
            OrderNo = DateTime.Now.ToString("yyyMMddHHmmss"),
            OrderName = "冰箱 22 款",
            Price = 1688
        });
        Console.WriteLine($"结果:{reply.Result},message:{reply.Message}");
        Console.ReadKey();
    }
}

结果

.NET 6 中 gRPC 使用

四、WebAPI 中加入 gRPC

通常我们的服务有对外提供对外接口,又要对内提供 gRPC 服务,那怎么做呢,下面在 webapi 中加入 gRPC 服务

1、创建 ASP.NET Core MVC 项目

2、安装 nuget 包


Grpc.AspNetCore

3、添加 protebuf 文件

把上面的 proto 文件复制过来

.NET 6 中 gRPC 使用

4、添加 Service

.NET 6 中 gRPC 使用


public class OrderService : Order.OrderBase
{
    private readonly ILogger _logger;
    public OrderService(ILogger logger)
    {
        _logger = logger;
    }
    /// 
    /// 创建订单
    /// 
    /// 
    /// 
    /// 
    public override Task CreateOrder(CreateRequest request, ServerCallContext context)
    {
        //报存数据库 todo

        return Task.FromResult(new CreateResult
        {
            Result = true,
            Message = "订单创建成功"
        });
    }
    /// 
    /// 查询订单
    /// 
    /// 
    /// 
    /// 
    public override Task QueryOrder(QueryRequest request, ServerCallContext context)
    {
        //查询数据库 //todo

        return Task.FromResult(new QueryResult
        {
            OrderInfo = new OrderInfo
            {
                Id = request.Id,
                OrderNo = DateTime.Now.ToString("yyyyMMddHHmmss"),
                OrderName = "冰箱",
                Price = 1288
            }
        });
    }
}

5、注册 gRPC 服务

在 Program.cs 文件中

.NET 6 中 gRPC 使用

到这里,就把 gRPC 加入到 webapi 里面了。

6、验证

启动 ASP.NET Core MVC 程序

.NET 6 中 gRPC 使用

浏览器能访问,证明 restful api 是没问题的。

然后再用上面的客户端访问一下 gRPC 的服务。

.NET 6 中 gRPC 使用

结果

.NET 6 中 gRPC 使用

这样就成功对外提供 api 接口和对内提供 gRPC 服务了。

源码地址:https://github.com/weixiaolong325/GrpcDemo.Service


转自:cnblogs.com/wei325/p/16128279.html

© 版权声明

☆ END ☆
喜欢就点个赞吧
点赞0 分享
图片正在生成中,请稍后...