.Net Core gRPC入门(二)——项目搭建、服务端、客户端

gRPC简介

在学习之前,需要先了解gRPC是做什么的,学习的目的以及能够解决什么问题,为什么选择gRPC?

gRPC以及RPC框架

gRPC是一款成熟的RPC框架,具有跨语言、支持双向流、Protobuf二进制序列化等优点。
RPC框架的作用是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的一个函数或方法(可以统称为服务)并得到返回的结果,简单来说就是远程过程调用。

远程过程调用

常用的远程过程调用方式有REST、SOAP、RPC。

REST基于HTTP进行调用,如GET\POST\PUT,在浏览器端可直接调用。
SOAP基于Xml封装成了HTTP协议,在VS中可直接添加服务引用,在浏览器端可直接调用。
RPC可基于TCP和HTTP通讯,在VS中可直接添加服务引用

RPC服务结构

1.服务端:提供对客户端开放的服务
2.客户端:调用服务端提供的服务

一、创建服务端项目

新建一个空白解决方案,命名为GrpcDemo
在这里插入图片描述
创建后 右键 > 添加 > 新建项目 > grpc,取名为GrpcDemo.Service

gRPC项目结构

在这里插入图片描述
项目中包含:

greet.proto

syntax = "proto3";

option csharp_namespace = "GrpcDemo.Service";

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

// The response message containing the greetings.
message HelloReply {
  string message = 1;
}

proto文件用于定义服务与数据结构,是一种高效数据交换格式,相对于Json,Protobuf有更高的转化效率,时间效率和空间效率都是JSON的3-5倍。

文件描述:

1.syntax 标识Protobuf版本为v3
2.option csharp_namespace 标识生成C#类的命名空间
3.package 标识proto文件的命名空间
4.service 定义服务
5.rpc FuncName (Input) returns (Output) 定义一个远程过程
message 声明数据结构

如上所示,在文件中定义了Greeter服务,包含一个SayHello过程,参数是HelloRequest,返回结果为HelloReply。

GreeterService.cs

public class GreeterService : Greeter.GreeterBase
{
    private readonly ILogger<GreeterService> _logger;
    public GreeterService(ILogger<GreeterService> logger)
    {
        _logger = logger;
    }

    public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
    {
        return Task.FromResult(new HelloReply
        {
            Message = "Hello " + request.Name
        });
    }
}

GreeterService继承于自动生成的Greeter.GreeterBase,实现了SayHello方法。

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
	//添加Grpc服务
    services.AddGrpc();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    //...省略
    app.UseEndpoints(endpoints =>
    {
    	//添加GreeterService服务终结点
        endpoints.MapGrpcService<GreeterService>();
        //...省略
    });
}

添加Grpc服务、添加GreeterService服务终结点。

二、创建客户端项目

新建控制台项目,命名为GrpcDemo.Client
在这里插入图片描述

1. 添加Nuget包

工具 > Nuget包管理器 > 程序包管理控制台 > 设置默认项目为GrpcDemo.Client
输入以下命令:

Install-Package Google.Protobuf
Install-Package Grpc.Tools
Install-Package Grpc.Net.Client

2. 添加Proto文件

右键GrpcDemo.Client项目 > 编辑项目文件
在Project内添加
我安装原文的设置有一些问题,我修改成如下图设置,
重点是GrpcServices=“Client”,客户端设置Client



在这里插入图片描述

3. 请求服务端

修改Program.cs

static void Main(string[] args)
{
    //创建grpc通道
    var channel = GrpcChannel.ForAddress("https://localhost:5001");
    //创建Greeter服务客户端
    var greetClient = new Greeter.GreeterClient(channel);
    //请求SayHello并且传参
    HelloReply reply = greetClient.SayHello(new HelloRequest()
    {
        Name = "Yuwei"
    });
    //输出返回结果
    Console.WriteLine(reply.Message);
}

三、运行并查看结果

右键解决方案 > 设置启动项目 > 多个启动项目 > 将Service和Client设置为启动 > 启动

输出:

Hello Yuwei

在这里插入图片描述
可以看到,Client发起了HTTP/2 POST请求,服务端返回了Hello Yuwei,运行成功。

源码地址

参考
https://docs.microsoft.com/zh-cn/aspnet/core/grpc/basics?view=aspnetcore-5.0

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值