本文介绍在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 = ;
string content = ;
} // The response message containing the greetings.
message SmsResponse {
int32 code = ;
string message = ;
}

三、新建一个服务端

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 = ,
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

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

  1. ASP.NET Core 3.0 使用gRPC

    一.简介 gRPC 是一个由Google开源的,跨语言的,高性能的远程过程调用(RPC)框架. gRPC使客户端和服务端应用程序可以透明地进行通信,并简化了连接系统的构建.它使用HTTP/2作为通信协 ...

  2. ASP.NET Core学习系列

    .NET Core ASP.NET Core ASP.NET Core学习之一 入门简介 ASP.NET Core学习之二 菜鸟踩坑 ASP.NET Core学习之三 NLog日志 ASP.NET C ...

  3. WebAPI调用笔记 ASP.NET CORE 学习之自定义异常处理 MySQL数据库查询优化建议 .NET操作XML文件之泛型集合的序列化与反序列化 Asp.Net Core 轻松学-多线程之Task快速上手 Asp.Net Core 轻松学-多线程之Task(补充)

    WebAPI调用笔记   前言 即时通信项目中初次调用OA接口遇到了一些问题,因为本人从业后几乎一直做CS端项目,一个简单的WebAPI调用居然浪费了不少时间,特此记录. 接口描述 首先说明一下,基于 ...

  4. ASP.NET Core学习指导

    ASP.NET Core 学习指导 "工欲善其事必先利其器".我们在做事情之前,总应该做好充分的准备,熟悉自己的工具.就像玩游戏有一些最低配置一样,学习一个新的框架,也需要有一些基 ...

  5. Asp.Net Core学习笔记:入门篇

    Asp.Net Core 学习 基于.Net Core 2.2版本的学习笔记. 常识 像Django那样自动检查代码更新,自动重载服务器(太方便了) dotnet watch run 托管设置 设置项 ...

  6. ASP.NET Core 学习笔记 第一篇 ASP.NET Core初探

    前言 因为工作原因博客断断续续更新,其实在很早以前就有想法做一套关于ASP.NET CORE整体学习度路线,整体来说国内的环境的.NET生态环境还是相对比较严峻的,但是干一行爱一行,还是希望更多人加入 ...

  7. ASP.Net Core 3.1 使用gRPC入门指南

    主要参考文章微软官方文档: https://docs.microsoft.com/zh-cn/aspnet/core/grpc/client?view=aspnetcore-3.1 此外还参考了文章 ...

  8. ASP.NET Core学习零散记录

    赶着潮流听着歌,学着.net玩着Core 竹子学Core,目前主要看老A(http://www.cnblogs.com/artech/)和tom大叔的博客(http://www.cnblogs.com ...

  9. ASP.NET Core学习之三 NLog日志

    上一篇简单介绍了日志的使用方法,也仅仅是用来做下学习,更何况只能在console输出. NLog已是日志库的一员大佬,使用也简单方便,本文介绍的环境是居于.NET CORE 2.0 ,目前的版本也只有 ...

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

    一.入门简介 在学习之前,要先了解ASP.NET Core是什么?为什么?很多人学习新技术功利心很重,恨不得立马就学会了. 其实,那样做很不好,马马虎虎,联系过程中又花费非常多的时间去解决所遇到的“问 ...

随机推荐

  1. Linux开机启动项总结

    在应急响应时有时会遇到系统被植入后门,添加启动项等操作,如果不清楚启动项的话,可能会被黑客植入一些开机启动项,无法彻底清除后门程序,所以在这梳理下启动项的东西 1.操作系统接管硬件以后,首先读入 /b ...

  2. spark not serializable异常分析及解决方案

    转载自: http://bigdataer.net/?p=569 1.背景 在使用spark开发分布式数据计算作业过程中或多或少会遇到如下的错误: Serialization stack: objec ...

  3. C#readonly和const对比

    readonly:常量,只能在声明时或构造函数中赋值,与static连用表示静态常量 const:静态常量,只能在声明时赋值

  4. JAVA遇见HTML——JSP篇(2、JSP基础语法)

    <%@ page language="java" import="java.util.*" contentType="text/html; ch ...

  5. Alpha项目测试--个人第五次作业

    img {border:solid 1px black} 这个作业属于哪个课程 <https://edu.cnblogs.com/campus/xnsy/2019autumnsystemanal ...

  6. 第八章 用SQL语句操作数

    --切换数据库:手动切换和命令切换 use MySchool --向Student表中插入数据 --语法:INSERT [INTO] 表名 (列名) VALUES (值列表) --注意事项: --1. ...

  7. com.atomikos.datasource.ResourceException: XA resource 'masterDB': resume for XID异常

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/u014172271/article/det ...

  8. 007_linuxC++之_构造函数的初级应用

    (一)构造函数:用来在创建对象时初始化对象, 即为对象成员变量赋初始值 (二)构造函数的命名必须和类名完全相同 (三)更对具体的查看:构造函数 (四)直接分析程序 运行结果 解析上面程序: 1. 当程 ...

  9. 014_linux驱动之_信号符号名、描述和它们的信号值

    符号名 信号值 描述 是否符合POSIX SIGHUP 1 在控制终端上检测到挂断或控制线程死 亡 是 SIGINT 2 交互注意信号 是 SIGQUIT 3 交 互中止信号 是 SIGILL 4 检 ...

  10. Shell 07 项目案例

    案例1:编写一键部署软件脚本 案例2:启动脚本 案例3:编写监控脚本 案例4:编写安全检测脚本 案例5:编写进度显示脚本   一.编写一键部署软件脚本 #!/bin/bash N=$(yum repo ...