【协议】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:构建高性能分布式应用程序

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

三星加强Bixby智能:迈向生成式AI,抗衡谷歌Gemini

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

文件操作(详解)

该片博客有点长大家可以通过目录选择性阅读 这是个人主页 敲上瘾-CSDN博客 目录 1. 为什么使⽤⽂件&#xff1f; 2. 什么是⽂件&#xff1f; 2.1 程序⽂件 2.2 数据⽂件 2.3 ⽂件名 3. ⼆进制⽂件和⽂本⽂件&#xff1f; 4. ⽂件的打开和关闭 4.1 流和标准流 4.1.1 流…

29-控制流(下):iam-apiserver服务核心功能实现讲解

我们再来看下 iam-apiserver 中的核心功能实现。 这些关键代码设计分为 3 类&#xff0c;分别是应用框架相关的特性、编程规范相关的特性和其他特性。 应用框架相关的特性 应用框架相关的特性包括三个&#xff0c;分别是优雅关停、健康检查和插件化加载中间件。 优雅关停 …

二维码:技术、商业与未来

title: 二维码&#xff1a;技术、商业与未来 date: 2024/4/3 19:12:28 updated: 2024/4/3 19:12:28 tags: 二维码技术商业应用移动支付物联网AR/VR融合智能家居数字化社会 第一章&#xff1a;引言 1. 二维码在数字化时代的重要性和普及程度 在数字化时代&#xff0c;二维码作…

程序员的升级打怪之路

#程序人生 写在前面 转眼间&#xff0c;我已经进入程序员的大门已经近4个春秋了&#xff08;算上实习的话&#xff0c;那就是快5年了…&#x1f436;.&#x1f436;.&#x1f436;不能再展开了&#xff0c;再不就暴露年龄了&#x1f605;&#xff09;。 这段时间&#xff0c…

element-ui card 组件源码分享

今日简单分享 card 组件源码&#xff0c;主要从以下两个方面&#xff1a; 一、card 组件页面结构 二、card 组件属性 2.1 header 属性&#xff0c;设置 header&#xff0c;也可以通过 slot#header 传入 DOM&#xff0c;类型 string&#xff0c;无默认值。 组件使用部分&#…

[做cpu] 第二次仿真实验

实现ori指令后&#xff0c;还得解决流水中数据相关的事&#xff0c;MIPS中只需要解决RAW&#xff08;在写操作后读&#xff09;&#xff0c;利用数据前推解决 相隔两条指令&#xff0c; 通过标志位判断直接把回写的内容作为读入译码的数据。 仿真出错原因&#xff1a;在顶层模…

spring总结-基于XML管理bean超详细

spring ioc总结-基于XML管理bean 前言实验一 [重要]创建bean1、目标和思路①目标②思路 2、创建Maven Module3、创建组件类4、创建spring配置文件7、无参构造器8、用IOC容器创建对象和自己建区别 实验二 [重要]获取bean1、方式一&#xff1a;根据id获取2、方式二&#xff1a;根…

20.安全性测试与评估

每年都会涉及&#xff1b;可能会考大题&#xff1b;多记&#xff01;&#xff01;&#xff01; 典型考点&#xff1a;sql注入、xss&#xff1b; 从2个方面记&#xff1a; 1、测试对象的功能、性能&#xff1b; 2、相关设备的工作原理&#xff1b; 如防火墙&#xff0c;要了解防…

redis---主从复制

主从复制是指将一台redis服务器的数据复制到其他redis服务器&#xff0c;也叫主节点和从节点。 一个主节点可以有多个从节点。而每个从节点只能有一个主节点。数据的复制是单向的&#xff0c;只能由主节点到从节点。一般来说&#xff0c;主节点负责写操作&#xff0c;从节点负…

公众号搜索被降权后多久能恢复?

公众号搜索被降权后的恢复时间是一个复杂的问题&#xff0c;它涉及到多种因素的综合考量。首先&#xff0c;违规的严重程度是一个重要的因素。如果违规行为较为轻微&#xff0c;可能只需要较短的时间就能恢复搜索权重;而如果违规行为较为严重&#xff0c;可能需要更长的时间&am…

vue实现导出列表为xlsx文件

1.安装依赖 npm install --save xlsx file-saver 2.引入依赖 import FileSaver from file-saver; import * as XLSX from xlsx; 3.代码实现 <el-button type"primary" click"exportData">导出数据</el-button><el-tableid"table_ex…

与 ChatGPT 对话

原文&#xff1a;Conversing With ChatGPT 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 ChatGPT 人工智能 尽管人工智能带来了许多好处和进步&#xff0c;但仍有一些话题引发担忧并引发道德、社会和存在问题。以下是与人工智能相关的一些最可怕的话题&#xff1a…

数据结构算法题(力扣)——链表

以下题目建议大家先自己动手练习&#xff0c;再看题解代码。这里只提供一种做法&#xff0c;可能不是最优解。 1. 移除链表元素&#xff08;OJ链接&#xff09; 题目描述&#xff1a;给一个链表的头节点 head 和一个整数 val &#xff0c;删除链表中所有满足值等于 val 的节点…

954: 单链表的链接

学习版 【c语言】 【C艹】 #include<iostream>class LinkedList { public:struct LinkedNode {char val;LinkedNode* next;LinkedNode(char val) :val(val), next(NULL) {};};LinkedList(){dummyHead new LinkedNode(0);tail dummyHead;}~LinkedList() {while (dummy…

初探STM32f407VET6

一、买到了板子&#xff0c;自己分析引脚功能 我在某宝上买到一块stm32f407vet6的板子&#xff0c;图便宜&#xff0c;结果遇上了个态度差的客服。没有说明&#xff0c;没有资料。不能退换&#xff0c;只能自己想办法分析引脚 在嘉里创找到了芯片原理图&#xff08;LQFP-100封…

【智能排班系统】快速消费线程池

文章目录 线程池介绍线程池核心参数核心线程数&#xff08;Core Pool Size&#xff09;最大线程数&#xff08;Maximum Pool Size&#xff09;队列&#xff08;Queue&#xff09;线程空闲超时时间&#xff08;KeepAliveTime&#xff09;拒绝策略&#xff08;RejectedExecutionH…

Python学习笔记-Flask接收post请求数据并存储数据库

1.引包 from flask import Flask, request, jsonify from flask_sqlalchemy import SQLAlchemy 2.配置连接,替换为自己的MySQL 数据库的实际用户名、密码和数据库名 app Flask(__name__) #创建应用实列 app.config[SQLALCHEMY_DATABASE_URI] mysqlpymysql://ro…

微软文本转语音和语音转文本功能更新,效果显著!

今天我要和大家分享一个新功能更新——微软的文本转语音和语音转文本功能。最近&#xff0c;微软对其AI语音识别和语音合成技术进行了重大升级&#xff0c;效果非常好&#xff0c;现在我将分别为大家介绍这两个功能。 先来听下这个效果吧 微软文本转语音和语音转文本功能更新 …

二分答案(砍树,借教室)

二分的两种情况附代码&#xff1a; 二分查找条件&#xff1a;单调&#xff0c;二段性 例题1&#xff1a;P1873 [COCI 2011/2012 #5] EKO / 砍树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 上代码&#xff1a; #include<bits/stdc.h> using namespace std; const …