【协议】RPC

文章目录

  • 概述
  • 与web service/web api/wcf区别
    • 简介
    • 区别和联系
  • grpc
    • .Net Core示例
  • 参考

概述

与web service/web api/wcf区别

简介

RPC(Remote Procedure Call Protocol)即远程过程调用协议,是分布式系统间通信的一种协议。通过网络从远程计算机上请求服务,用户无需了解底层网络技术(例如TCP/IP)。RPC的主要特点包括透明性、伸缩性、容错性、适应性和安全性。

WebService是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,它使用开放的XML标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的交互操作的应用程序。WebService能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件,就可相互交换数据或集成。

Web API则是一种用于发布和使用不同应用程序之间功能的API接口,其应用范围主要在于浏览器和服务器之间的通信,旨在轻量级的数据传输,使得客户端应用程序可以随时获得所需数据。

WCF(Windows Communication Foundation)是微软为构建面向服务的应用程序提供的统一编程模型,它整合了现有的.NET远程通信技术,如.NET Remoting、ASMX、WSE和WCF的早期版本。WCF的主要特性是它的互操作性,它支持多种传输协议(如HTTP、TCP、命名管道和MSMQ)、消息格式(文本/XML、MTOM/SOAP和二进制/SOAP)和安全模式。

RPC与WebService的主要区别在于通信协议和数据格式。RPC更加轻量级,通信过程更加高效,适用于同一系统内部或者具有相同技术栈的系统间的通信。而WebService更加标准化,支持跨平台和跨技术栈的通信,可适用于不同组织之间或不同语言环境下的通信。WebService通常使用SOAP协议,以XML为基础架构,使用HTTP作为数据传输协议。

至于Web API和WCF,它们与WebService和RPC在功能和应用场景上有所不同。Web API主要关注于轻量级的数据传输和浏览器与服务器之间的通信,而WCF则提供了一个更统一的编程模型来构建面向服务的应用程序,并整合了多种.NET远程通信技术。
在这里插入图片描述

区别和联系

首先,关于它们之间的区别:

通信协议和数据格式:

  • RPC通常使用自定义的二进制协议进行通信,数据格式也通常是二进制的,因此通信过程较为高效。
  • WebService通常使用SOAP协议,基于XML进行数据编码和传输,这使得它具有良好的跨平台性和互操作性。
  • Web API则主要使用HTTP协议,支持多种数据格式如JSON和XML,使其更适用于Web应用之间的通信。
  • WCF则是一个更为综合的通信框架,它支持多种传输协议(如HTTP、TCP等)和消息格式,以适应不同的通信需求。

适用场景:

  • RPC主要用于同一系统内部或具有相同技术栈的系统间的通信,因其高效性而得到广泛应用。
  • WebService适用于不同组织之间或不同语言环境下的通信,因其标准化和跨平台性而受到青睐。
  • Web API则更适用于Web应用之间的通信,特别是在前后端分离架构中。
  • WCF则适用于构建面向服务的应用程序,整合了多种.NET远程通信技术。

接下来,关于它们之间的联系:

这些技术都是分布式系统间通信和数据交换的手段,它们都是为了解决不同系统或应用之间的通信问题而存在的。虽然它们在实现方式和适用场景上有所不同,但它们的最终目标都是实现数据的可靠传输和系统的互操作性。

此外,这些技术也在不断发展和演进中相互借鉴和融合。例如,Web API在某些方面借鉴了WebService的跨平台性和互操作性优势,而WCF则整合了多种.NET远程通信技术以提供更统一的编程模型。

grpc

gRPC(gRPC Remote Procedure Calls)是Google开发并开源的一款高性能、开源和通用的RPC(远程过程调用)框架,面向移动和HTTP/2设计。它使用ProtoBuf作为接口描述语言,并支持多种语言。gRPC基于HTTP/2设计,带来诸如双向流、流控制、头部压缩、单TCP连接上的多路复用请求等特性。这些特性使得其在移动设备上表现更优,更省电和节省空间占用。

gRPC的核心优势包括:

  • 高性能:gRPC是基于HTTP/2设计的,因此它充分利用了HTTP/2的诸多特性,如多路复用、头部压缩等,从而实现了高性能的远程过程调用。
  • 跨语言性:gRPC支持多种编程语言,包括C、C++、Go、Java、Node.js、Python和Ruby等,这使得不同语言之间的服务调用变得简单直接。
  • 双向流式传输:gRPC支持双向流式传输,即客户端和服务器之间可以建立长期的连接,并在这个连接上发送和接收一系列的消息。
  • 强类型接口定义:使用ProtoBuf作为接口描述语言,可以明确地定义服务的输入和输出,保证接口的一致性和准确性。
  • 内置的服务发现和负载均衡:gRPC可以与Kubernetes、Consul等服务发现工具集成,实现服务的自动发现和负载均衡。
  • 认证和安全性:gRPC支持SSL/TLS来加密传输的数据,保证数据传输的安全性。此外,它还支持多种认证机制,如OAuth2、JWT等。

在实际应用中,gRPC常用于微服务架构中,实现服务之间的通信和调用。它特别适用于那些需要高性能、跨语言支持以及双向流式传输的场景。然而,需要注意的是,虽然gRPC具有诸多优势,但在某些场景下,如浏览器到服务器的通信,它可能不是最佳选择,此时Web API或RESTful API可能更为合适。

.Net Core示例

步骤1:创建一个gRPC服务
首先,让我们创建一个gRPC服务。在命令行中运行以下命令:

dotnet new grpc -n MyGrpcService

这将创建一个名为MyGrpcService的新项目,其中包含一个gRPC服务的定义和一个默认的服务实现。

步骤2:定义gRPC服务
在项目中,您将看到一个名为Greeter.proto的文件,它定义了gRPC服务和消息。您可以使用Protocol Buffers语言来定义消息和服务。

syntax = "proto3";option csharp_namespace = "MyGrpcService";service Greeter {rpc SayHello (HelloRequest) returns (HelloReply);
}message HelloRequest {string name = 1;
}message HelloReply {string message = 1;
}

在这个示例中,我们定义了一个Greeter服务,其中有一个SayHello方法,该方法接受一个HelloRequest消息并返回一个HelloReply消息。
步骤3:实现gRPC服务

现在,让我们实现Greeter服务。在GreeterService.cs文件中,您可以编写C#代码来实现SayHello方法。

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

这个方法接受一个HelloRequest对象,将其名字包含在回复消息中。

步骤4:启动gRPC服务

最后,我们需要将gRPC服务启动起来。在Program.cs文件中,编写以下代码:

public static void Main(string[] args)
{var host = WebHost.CreateDefaultBuilder(args).UseStartup<Startup>().Build();host.Run();
}

步骤5:创建一个gRPC客户端
现在,我们已经创建了一个gRPC服务,让我们创建一个gRPC客户端来调用该服务。

using Grpc.Net.Client;
using MyGrpcService;class Program
{static async Task Main(string[] args){using var channel = GrpcChannel.ForAddress("https://localhost:5001");var client = new Greeter.GreeterClient(channel);var reply = await client.SayHelloAsync(new HelloRequest { Name = "John" });Console.WriteLine("Greeting: " + reply.Message);}
}

这个客户端代码会连接到我们之前创建的gRPC服务,调用SayHello方法,并输出回复消息。

参考

从入门到实践:RPC协议详解
.NET Core和gRPC:构建高性能分布式应用程序

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/791496.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Apache Doris】周FAQ集锦:第 2 期

【Apache Doris】周FAQ集锦&#xff1a;第 2 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目&#xff01; 在这个栏目中&#xff0c;每周将筛选社区反馈的热门问题和话题&#xff0c;重点回答并进行深入探讨。旨在为广大用户和…

关键字:static

回顾类中的实例变量&#xff08;即非static的成员变量&#xff09; class Circle{ private double radius; public Circle(double radius){ this.radiusradius; } public double findArea(){ return Math.PI*radius*radius; } } 创建两个C…

计算机网络—TCP协议详解:特性、应用(2)

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;マリンブルーの庭園—ずっと真夜中でいいのに。 0:34━━━━━━️&#x1f49f;──────── 3:34 &#x1f504; ◀️…

抽象类与抽象方法(或abstract关键字)

由来 举例1&#xff1a; 随着继承层次中一个个新子类的定义&#xff0c;类变得越来越具体&#xff0c;而父类则更一般&#xff0c;更通用。类的设计应该保证父类和子类能够共享特征。有时将一个父类设计得非常抽象&#xff0c;以至于它没有具体的实例&#xff0c;这样的类叫做…

STM32G系 编程连接不上目标板,也有可能是软件不兼容。

由于一直用的老版本STM32 ST-LINK Utility 4.20 &#xff0c;找遍了所有问题&#xff0c;SWD就是连不上目标板。 电源脚 VDDA 地线&#xff0c;SWD的四条线&#xff0c;还是不行&#xff0c;浪费了一天&#xff0c;第二天才想起&#xff0c;是不是G系升级了 SWD协议。结果下载…

[InternLM训练营第二期笔记]2. 轻松分钟玩转书生·浦语大模型趣味 Demo

该系列是上海AI Lab举行的书生 浦语大模型训练营的相关笔记部分。 该笔记是第二节课&#xff0c;完成对话、多模态等demo&#xff0c;形成对InternLM的初步了解 1. 部署InternLM2-Chat-1.8B InternLM2-Chat-1.8B是一个对话小模型&#xff0c;只有1.8B参数&#xff0c;因此运行…

深度学习:神经网络模型的剪枝和压缩简述

深度学习的神经网路的剪枝和压缩&#xff0c;大致的简述&#xff0c; 主要采用&#xff1a; network slimming&#xff0c;瘦身网络... 深度学习网络&#xff0c;压缩的主要方式&#xff1a; 1.剪枝&#xff0c;nerwork pruing&#xff0c; 2.稀疏表示&#xff0c;sparse rep…

每日面经分享(python进阶 part2)

Python中的装饰器和上下文管理器区别是什么&#xff1f;它们分别适用于哪些场景&#xff1f; a. 装饰器用于在函数或类的外部添加额外功能&#xff0c;而上下文管理器用于管理资源的获取和释放。 b. 装饰器是一种用于修改函数或类行为的技术。适用于需要在函数或类的外部添加额…

鸿蒙实战开发-通过输入法框架实现自绘编辑框

介绍 本示例通过输入法框架实现自会编辑框&#xff0c;可以绑定输入法应用&#xff0c;从输入法应用输入内容&#xff0c;显示和隐藏输入法。 效果预览 使用说明 1.点击编辑框可以绑定并拉起输入法&#xff0c;可以从输入法键盘输入内容到编辑框。 2.可以点击attach/dettac…

【学习分享】小白写算法之冒泡排序篇

【学习分享】小白写算法之冒泡排序篇 前言一、什么是冒泡排序算法二、冒泡排序算法如何实现三、C语言实现算法四、复杂度计算五、算法稳定性六、小结 前言 最近我要学习下数据结构和算法&#xff0c;有兴趣的小伙伴可以点个关注&#xff0c;一起学习。争取写的浅显易懂。如果你…

解决Toad for Oracle显示乱中文码问题

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…

数据结构记录

之前记录的数据结构笔记&#xff0c;不过图片显示不了了 数据结构与算法(C版) 1、绪论 1.1、数据结构的研究内容 一般应用步骤&#xff1a;分析问题&#xff0c;提取操作对象&#xff0c;分析操作对象之间的关系&#xff0c;建立数学模型。 1.2、基本概念和术语 数据&…

CANoe自带的TCP/IP协议栈中TCP的keep alive机制是如何工作的

TCP keep alive机制我们已经讲过太多次,车内很多控制器的TCP keep alive机制相信很多开发和测试的人也配置或者测试过。我们今天想知道CANoe软件自带的TCP/IP协议栈中TCP keep alive机制是如何工作的。 首先大家需要知道TCP keep alive的参数有哪些?其实就三个参数:CP_KEEP…

Qt QML的枚举浅用

QML的枚举用法 序言概念命名规则在QML定义枚举的规范 用法QML的枚举定义方法供QML调用的&#xff0c;C的枚举定义方法 序言 概念 QML的枚举和C的其实差不多&#xff0c;但是呢&#xff0c;局限比较多&#xff0c;首先不能在main.qml里定义&#xff0c;也不能在子项中定义。 …

C++语言学习(二)——⭐缺省参数、函数重载、引用

1.⭐缺省参数 &#xff08;1&#xff09;缺省参数概念 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时&#xff0c;如果没有指定实参则采用该形参的缺省值&#xff0c;否则使用指定的实参。 void Func(int a 0) {cout<<a<<endl; } int…

MySQL的基本操作(超详细)

&#x1f468;‍&#x1f4bb;作者简介&#xff1a;&#x1f468;&#x1f3fb;‍&#x1f393;告别&#xff0c;今天 &#x1f4d4;高质量专栏 &#xff1a;☕java趣味之旅 &#x1f4d4;&#xff08;零基础&#xff09;专栏&#xff1a;MSQL数据库 欢迎&#x1f64f;点赞&…

flutter官方案例context_menus【搭建与效果查看】【省时】

案例地址 https://github.com/flutter/samples/tree/main/context_menus 1&#xff1a;运行查看有什么可以快捷使用的&#xff0c;更新了些什么&#xff0c;可不可以直接复制粘贴 主要内容&#xff1a;在web端中模拟手机类型的点击长按操作&#xff0c;不能直接运行在安卓与io…

如何处理Jenkins打包npm install没有拉取到最新依赖的问题

问题背景&#xff1a; 我们项目中有私有依赖包 frame&#xff0c;是私有服务器上通过 npm 去管理。frame包 publish 之后&#xff0c;通过Jenkins打包时&#xff0c;npm install 一直没有拉取最新的代码。 思考&#xff1a;通过在本地直接替换 node_modules 里的 frame 包&…

element-ui divider 组件源码分享

今日简单分享 divider 组件&#xff0c;主要有以下两个方面&#xff1a; 1、divider 组件页面结构 2、divider 组件属性 一、组件页面结构 二、组件属性 2.1 direction 属性&#xff0c;设置分割线方向&#xff0c;类型 string&#xff0c;horizontal / vertical&#xff0…

SQLite下一代查询规划器(十)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite 查询优化器概述&#xff08;九&#xff09; 下一篇&#xff1a;SQLite的架构&#xff08;十一&#xff09; 1. 引言 “查询规划器”的任务是弄清楚 找出完成 SQL 语句的最佳算法或“查询计划”。 从 SQLi…