【ASP.NET Core学习】远程过程调用 - gRPC使用

本文介绍在gRPC使用,将从下面几个方面介绍

  1. 什么是RPC
  2. 什么时候需要RPC
  3. 如何使用gRPC

什么是RPC

RPC是Remote Procedure Call简称,翻译过来是远程过程调用。它是一个进程间的通讯技术,基于Client-Server模式,让程序像调用本地方法一样使用,而无需去关系它细节如何实现。

上面是我的理解,怕理解有错或者表达不准确,下面引用维基百科

维基百科 a remote procedure call (RPC) is when a computer program causes a procedure (subroutine) to execute in a different address space (commonly on another computer on a shared network), which is coded as if it were a normal (local) procedure call, without the programmer explicitly coding the details for the remote interaction

网上找到一个图,比较形象描述RPC调用过程

什么时候需要RPC

RPC是解决进程间通讯(可以是同一个服务器,也可以是不同服务器的进程间,但是通常是内网的不同服务器之间进程通讯)。

解决进程间通信,Web Api也是可以解决,为什么还需要RPC?我认为可以从下面几点

1. Web Api是基于HTTP,RPC可以是HTTP,也可以是TCP,甚至基于Socket,RPC框架通常都是隐藏通讯细节,让我们无感知使用

2. Web Api 通常基于JSON格式,XML格式,这种格式易读性强,但是随之带来就是传输过程需要把数据的元数据也带进去传输

3. Web Api更多应用场景是提供方定义好接口,由客户端按需调用,RPC通常需要调用方和提供方沟通一起定义接口

所以PRC更多是使用以下场景

  1. 对通讯性能要求较高
  2. 微服务
  3. 点到点通讯

gRPC使用

gRPC是Google开源的高性能RPC框架,有以下几个特点

  1. 现代高性能轻量级 RPC 框架。
  2. 协定优先 API 开发,默认使用protobuf,允许与语言无关的实现。(这里涉及两点,1.面向接口开发,依赖抽象而不是具体,2. 可以不同语言实现协作)
  3. 使用 Protobuf 二进制序列化减少对网络的使用。(减少网络传输)
  4. 可用于多种语言的工具,以生成强类型服务器和客户端。
  5. 支持客户端、服务器和双向流式处理调用。

下面开始介绍如何在Net Core上使用gRPC

一、安装dotnet-gRPC工具(用于引用protobuf文件,生成客户端/服务端代码)

dotnet tool install dotnet-grpc -g

二、新建一个protobuf文件

syntax = "proto3";

option csharp_namespace = "gRPC.Services";

package sms;

// The greeting service definition.
service SmsSender {
  // Sends a greeting
  rpc SendSms (SmsRequest) returns (SmsResponse);
}

// The request message containing the user‘s name.
message SmsRequest {
  string tel = 1;
  string content = 2;
}

// The response message containing the greetings.
message SmsResponse {
  int32 code = 1;
  string message = 2;
}

三、新建一个服务端

1. 新建一个gRPC工程

dotnet new grpc -n gRPC.Services

2. 引入步骤二生成的protobuf文件(可以使用通配符引入多个protobuf文件)

dotnet-grpc add-file ..\gRPC.Protos\*.proto -s Serve

3. 新建服务类

public class SmsService : SmsSender.SmsSenderBase
{
    private readonly ILogger<SmsService> _logger;
    public SmsService(ILogger<SmsService> logger)
    {
        _logger = logger;
    }

    public override Task<SmsResponse> SendSms(SmsRequest request, ServerCallContext context)
    {
        return Task.FromResult(new SmsResponse
        {
            Code = 1,
            Message = "发送成功"
        });
    }
}

SmsSender 是生成工具生成的服务端代码

4. 配置grpc服务类终结点

app.UseEndpoints(endpoints =>
{
    endpoints.MapGrpcService<SmsService>();
});

四、新建客户端

1. 新建控制台程序

dotnet new console -n gRPC.Client

2. 添加包(Google.Protobuf)

dotnet add package Google.Protobuf

3. 引入步骤二生成的protobuf文件(可以使用通配符引入多个protobuf文件),注意:这里需要生成是客户端代码,当然也可以用Both参数生成

dotnet-grpc add-file ..\gRPC.Protos\*.proto -s Client

五、运行

1. 运行服务端

2. 启动客户端

客户端输出下面信息

{"Code":1,"Message":"\u53D1\u9001\u6210\u529F"}

六、小结

gRPC的生命周期

Client(发送请求) -> Client stub(压缩/解压) -> Client RPC Transfer(发送/接收) -> Server RPC Transfer(接收/发送) -> Server stub(解压/压缩) -> Server (处理响应)

gPRC帮我们隐藏中间的环节,只剩下两头的代码(俗称业务逻辑代码)

protobuf它是一种可序列化的数据结构,但它更重要是定义接口,让服务端和客户端能分离出来

转发请标明出处:https://www.cnblogs.com/WilsonPan/p/12000796.html

示例代码:https://github.com/WilsonPan/AspNetCoreExamples/tree/master/gRPC

原文地址:https://www.cnblogs.com/WilsonPan/p/12000796.html

时间: 2024-08-26 17:47:19

【ASP.NET Core学习】远程过程调用 - gRPC使用的相关文章

ASP.NET Core学习系列

.NET Core ASP.NET Core ASP.NET Core学习之一 入门简介 ASP.NET Core学习之二 菜鸟踩坑 ASP.NET Core学习之三 NLog日志 ASP.NET Core学习之四 在CentOS上部署.net core LINUX学习系列 DOCKER学习系列 微服务学习系列 原文地址:https://www.cnblogs.com/xcsn/p/8306854.html

ASP.NET Core学习零散记录

赶着潮流听着歌,学着.net玩着Core 竹子学Core,目前主要看老A(http://www.cnblogs.com/artech/)和tom大叔的博客(http://www.cnblogs.com/TomXu/),当然还有我们博客园的Core中国学习小组啦(http://www.cnblogs.com/dotNETCoreSG/),只是笔记作用,所以很多图片,文字都是来源于他们~ 中间件(middleware): 原文:随着WebHost的Start方法的调用,按照具体需求进行定制的请求处理

ASP.NET Core学习之一 入门简介

一.入门简介 在学习之前,要先了解ASP.NET Core是什么?为什么?很多人学习新技术功利心很重,恨不得立马就学会了. 其实,那样做很不好,马马虎虎,联系过程中又花费非常多的时间去解决所遇到的“问题”,是简单的问题,对,就是简单,就是因为觉得简单被忽略的东西,恰恰这才是最重要的. 1.学习资料 首先,介绍下哪里可以获得学习资料 英文官网,最好的文档,英语得过硬 https://docs.microsoft.com/en-us/aspnet/core/ 可惜当年英语就是马马虎虎过来的,所以找了

ASP.NET Core学习之三 NLog日志

上一篇简单介绍了日志的使用方法,也仅仅是用来做下学习,更何况只能在console输出. NLog已是日志库的一员大佬,使用也简单方便,本文介绍的环境是居于.NET CORE 2.0 ,目前的版本也只有beta版. 一.安装和配置 1.安装 命令如下 PM> Install-Package NLog.Web.AspNetCore -Version 4.5.0-beta04 2.创建配置文件 在web项目根目录下,创建配置文件nlog.config ,并且将文件的属性“复制到输出目录”设置为"

ASP.NET Core学习总结(1)

经过那么长时间的学习,终于想给自己这段时间的学习工作做个总结了.记得刚开始学习的时候,什么资料都没有,光就啃文档.不过,值得庆幸的是,自己总算还有一些Web开发的基础.至少ASP.NET的WebForm和MVC那一套还是有所了解的,虽然也不是很精通.说起来,那时候对整个网络应用的整体流程以及什么HTTP协议都不是很了解.终归是在微软爸爸的庇护下艰难的成长. 1.概念 概念这种东西,感觉还是太过于学术化.也就是时间长了,慢慢就能理解的一些经常用到的词而已.对于大多数人来说,我们几乎每天都会浏览网页

ASP.NET Core 3.0 使用 gRPC无法编译问题

一.问题 创建了gRPC项目后,编译发现报错: 二.解决 1.检查项目路径是否存在中文 2.检查当前Windows用户目录是否为非英文字符,如果是则必须改为英文 修改方法: https://jingyan.baidu.com/article/c910274b347bd98d361d2da3.html https://blog.csdn.net/tanzey/article/details/82657816 我在 ASP.NET Core github提交的issues https://githu

ASP.NET Core学习——2

Application Startup ASP.NET Core为应用程序提供了处理每个请求的完整控制.Startup类是应用程程的入口(entry point),这个类可以设置配置(configuration),并且将应用程序将要使用的服务连接起来. 开发人员可以在Startup类中配置请求管道,该管道将用于处理应用程序的所有请求. 1.Startup类 在ASP.NET Core中,Startup类提供了应用程序的入口,而且在所有应用程序中都有Startup类. Startup类能够选择性地

ASP.NET Core学习——6

依赖注入DI ASP.NET Core的底层设计支持和使用依赖注入.ASP.NET Core应用程序可以利用内置的框架服务将它们注入到启动类的方法中,并且应用程序服务能够配置注入. 1.什么是依赖注入 依赖注入(Dependency injection, DI)是一种实现对象及其合作者或依赖项之间松散耦合的技术.将类来执行其操作(Action)的这些对象以某种方式提供给类,而不是直接实例化合作者或使用静态引用.通常,类会通过它们的构造函数声明其依赖关系,允许它们遵循显示依赖原则(Explicit

ASP.NET Core学习——7

多环境ASP.NET Core介绍了支持在多种环境中管理应用程序行为的改进,如开发(devlopment),预演(staging)和生成(production).环境变量用来指示应用程序正在运行的环境,允许应用程序适当地配置. 1.开发.预演和生成ASP.NET Core引用了一个特定的环境变量ASPNETCORE_ENVIRONMENT来描述应用程序当前运行的环境.这个变量可以被设置为任何你喜欢的值,但是有三个值被约定使用:Development(开发).Staging(预演)和Product

【ASP.NET Core学习】基础

新建项目时,程序入口调用CreateDefaultBuilder(args),下面是源代码 public static IHostBuilder CreateDefaultBuilder(string[] args) { var builder = new HostBuilder(); builder.UseContentRoot(Directory.GetCurrentDirectory()); builder.ConfigureHostConfiguration(config => { co