RPC 初识
RPC是什么
RPC(Remote Procedure Call) 释义是远程过程调用,常存在于分布式系统中。
比如说现在有两台服务器A, B,一个在A服务器上的应用想要调用B服务器上的应用提供的某个,由于不在两个方法不在一个内存空间,不能直接调用,需要通过网络表达调用的语义和传达调用的数据。
RPC要解决的问题
- 建立通信:在客户端与服务端建立起数据传输通道。著名的 gRPC 使用的 http2 协议,也有如dubbo一类的自定义报文的tcp协议。
- 寻址:A服务器上的应用需要告诉RPC框架,B服务器地址、端口,调用函数名称。所以必须实现待调用方法到远端ID的映射。
- 序列化与反序列化:由于网络协议都是二进制的,所以调用方法的参数在进行传递时首先要序列化成二进制,B服务器收到请求后要再对参数进行反序列化。
恢复为内存中的表达方式,找到对应的方法进行本地调用,得到返回值。返回值从B到A的传输仍要经过序列化与反序列化的过程。序列化协议如基于文本编码的Xml、Json,也有二进制编码的Protobuf、 Hessian等。
仅仅了解了RPC的相关文字概念,远远是不能理解RPC所带来的优势,RPC在作比较的时候,大多也是以HTTP作比较。不如先来了解一下HTTP,通过比较,我们加深对RPC的特性。
- HTTP 是建立在 TCP 协议之上,所以 HTTP 协议的瓶颈及其优化技巧都是基于 TCP 协议本身的特性,例如 tcp 建立连接的 3 次握手和断开连接的 4 次挥手以及每次建立连接带来的 RTT 延迟时间。
- HTTP 的基本优化:影响一个 HTTP 网络请求的因素主要有两个:带宽和延迟。
一个POST协议的格式大致如下:
HTTP/1.0 OK
Content-Type: text/plain
Content-Length:
Expires: Thu, Dec :: GMT
Last-Modified: Wed, August :: GMT
Server: Apache 0.84 <html>
<body>Hello World</body>
</html>
通过简单的了解到Http的一些特性外,我们能够看到http1.1协议的tcp报文包含太多废信息,简化协议内容,减少不必要的传输内容成为了关键。
gRPC
gRPC是谷歌开源的一个 RPC 框架,面向移动和 HTTP/2 设计。
内容交换格式采用ProtoBuf(Google Protocol Buffers),开源已久,提供了一种灵活、高效、自动序列化结构数据的机制,作用与XML,Json类似,但使用二进制,(反)序列化速度快,压缩效率高。
传输协议 采用http2,性能比http1.1好了很多。
和很多RPC系统一样,服务端负责实现定义好的接口并处理客户端的请求,客户端根据接口描述直接调用需要的服务。客户端和服务端可以分别使用gPRC支持的不同语言实现。
ProtoBuf 具有强大的IDL(interface description language,接口描述语言)和相关工具集(主要是protoc)。用户写好.proto描述文件后,protoc可以将其编译成众多语言的接口代码。
为什么要使用自定义 tcp 协议的 rpc 做后端进程通信?
即使编码协议也就是body是使用二进制编码协议,报文元数据也就是header头的键值对却用了文本编码,非常占字节数。如代码所使用的报文中有效字节数仅仅占约 30%,也就是70%的时间用于传输元数据废编码。当然实际情况下报文内容可能会比这个长,但是报头所占的比例也是非常可观的。
简单来说成熟的RPC库相对Http容器,更多的是封装了“服务发现”,"负载均衡",“熔断降级”一类面向服务的高级特性。可以这么理解,RPC框架是面向服务的更高级的封装。如果把一个Http Servlet容器上封装一层服务发现和函数代理调用,那它就已经可以做一个RPC框架了。
Dotnet gRPC Demo
创建gprc项目,并配置proto
dotnet new grpc -o GrpcGreeter - greet.proto syntax = "proto3"; option csharp_namespace = "GrpcGreeter"; 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 = ;
} // The response message containing the greetings.
message HelloReply {
string message = ;
} - Start.cs
public void ConfigureServices(IServiceCollection services){
services.AddGrpc();
} public void Configure(IApplicationBuilder app, IWebHostEnvironment env){
app.UseEndpoints(endpoints =>{
endpoints.MapGrpcService<GreeterService>();
endpoints.MapGet("/", async context => {
await context.Response.WriteAsync("Communication with gRPC endpoints");
});
});
}
RPC 初识的更多相关文章
- 初识RPC协议
什么是rpc框架 先回答第一个问题:什么是RPC框架? 如果用一句话概括RPC就是:远程调用框架(Remote Procedure Call) 那什么是远程调用? 通常我们调用一个php中的方法,比如 ...
- Hadoop2源码分析-RPC机制初识
1.概述 上一篇博客,讲述Hadoop V2的序列化机制,这为我们学习Hadoop V2的RPC机制奠定了基础.RPC的内容涵盖的信息有点多,包含Hadoop的序列化机制,RPC,代理,NIO等.若对 ...
- 初识Hadoop
第一部分: 初识Hadoop 一. 谁说大象不能跳舞 业务数据越来越多,用关系型数据库来存储和处理数据越来越感觉吃力,一个查询或者一个导出,要执行很长 ...
- [ActiveMQ]初识ActiveMQ
初识ActiveMQ ActiveMQ介绍 官方网站:http://activemq.apache.org/ 最新版本:ActiveMQ 5.14.1(2016-10-28) 最新版本下载链接:htt ...
- Hadoop2源码分析-RPC探索实战
1.概述 在<Hadoop2源码分析-RPC机制初识>博客中,我们对RPC机制有了初步的认识和了解,下面我们对Hadoop V2的RPC机制做进一步探索,在研究Hadoop V2的RPC机 ...
- Dubbo+Zookeeper(一)Zookeeper初识
前面花了一段时间去学习SpringCloud的相关知识,主要是理解微服务的概念并使用SpringCloud的一系列组件实现微服务落地.学习这些组件本身是简单的,跟着操作一遍基本就会了,这也得益于Spr ...
- 初识分布式:MIT 6.284系列(一)
前言 本系列是源于「码农翻身」所属知识星球发起的读书活动,由大佬 @我的UDP不丢包 推荐而来,这次的读书活动有一些另类,我们抛弃了传统的书籍,开始攻略最高学府的研究生顶级课程 <6.824&g ...
- 从 BIO、NIO 聊到 Netty,最后还要实现个 RPC 框架!
大家好,我是 「后端技术进阶」 作者,一个热爱技术的少年. 觉得不错的话,欢迎 star!ღ( ´・ᴗ・` )比心 Netty 从入门到实战系列文章地址:https://github.com/Snai ...
- RPC 框架设计
RPC 框架设计 初识 RPC 服务化有什么好处? 防止代码拷贝 防止底层复杂性的扩散 防止公共库的耦合 保证 SQL 的质量,能够解除数据库的耦合 什么是 RPC RPC:Remote Proced ...
随机推荐
- 新MySQL查询和删除重复记录
在工作中,我们经常会发现表中会存在重复数据,那么如何找出和删除这些数据呢? 下面,以一个小例子来说明: 1.创建学生表 1 CREATE TABLE student( 2 id INT PRIMARY ...
- JavaScript—图片与base64编码互相转换
图片转换为base64编码 <input type = "file" id = "file" onchange="popFileName(thi ...
- liteos CPU占用率(十六)
1. 概述 1.1 基本概念 CPU(中央处理器, Central Processing Unit)占用率可以分为系统CPU占用率和任务CPU占用率两种. 系统CPU占用率(CPU Percent)是 ...
- iPad替代midi键盘
下载安装rtpMIDI (网络MIDI驱动程序) 打开rtpMIDI,在“My session”那里按下+,就会自动显示你的电脑的名字 检查Bonjour服务正常运行,iPad与pc网络正常连接 iP ...
- 日志类shell脚本
Apache日志文件切割 #!/bin/bash year=`date -d '-1 day' +%Y` month=`date -d '-1 day' +%m` day=`date -d '-1 d ...
- 5.Java基础_Java算术/字符/字符串/赋值运算符
/* 算术/字符/字符串/赋值 运算符 */ public class OperatorDemo01 { public static void main(String[] args){ //算术运算符 ...
- 1.Java基础_Java核心机制简介
Java的两种核心机制 Java虚拟机机制 Java垃圾回收机制 解释名词 J2SDK&JRE: J2SDK=JDK=Software Development Kit(软件开发包) JRE=J ...
- 剑指Offer-11.二进制中1的个数(C++/Java)
题目: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 分析: 将数字和1先做与运算,然后将1右移一位,现在是判断数字的第二位是不是1,这样循环的做下去即可.也可以转换成字符串再统计 ...
- LG2996 「USACO10NOV」Visiting Cows
问题描述 LG2996 题解 和没有上司的舞会双倍经验? \(\mathrm{Code}\) #include<bits/stdc++.h> using namespace std; te ...
- ResultMap(还没细看)
前言 MyBatis是基于“数据库结构不可控”的思想建立的,也就是我们希望数据库遵循第三范式或BCNF,但实际事与愿违,那么结果集映射就是MyBatis为我们提供这种理想与现实间转换的手段了,而res ...