当前位置: 首页 > news >正文

浅谈RPC的实现原理与RPC实战

浅谈RPC的实现原理与RPC实战

  • 什么是RPC?
  • RPC框架基本原理
  • gRPC框架介绍
    • Http/2
    • ProtoBuf
  • gRPC实战
    • 一、创建项目
    • 二、导入依赖
    • 三、编写proto文件
    • 编写服务端
    • 编写客户端

什么是RPC?

RPC(Remote Procedore Call),及远程过程调用,是一种在分布式系统中用于进程间通信的技术。 在分布式系统中,不同的进程可能运行在不同的机器上,RPC技术隐藏了底层通信细节和序列化机制,使得一个进程可以如同调用本地方法一般调用另一个进程的函数或方法,让远程调用变的简单直观。

常见的RPC框架有gRPC、Dubbo、Thrift等。

RPC框架基本原理

rpc框架的基本原理主要包含以下几个部分:

  • 网络通信:RPC框架的客户端与服务端需要通过网络通信来传输数据,网络通信涉及到协议的选择、底层I/O模型的实现等问题。对于网络协议的选择,可以使用HTTP,也可以基于TCP自定义协议。对于底层I/O模型,处于并发性能的考虑,一般不会选择使用阻塞式I/O,在Java生态中,会使用Netty作为网络通信框架,其底层使用了Java NIO来解决数据传输问题。
  • 序列化协议:在网络通信的过程中,所有数据都会被转化为字节进行传输,因此客户端与服务端之间的数据交互离不开序列化与反序列化。序列化是将数据对象转化为二进制数据的过程,反序列化则是将二进制数据转化为数据对象的过程。常见的序列化协议包括ProtoBuf、Json、Thrift、Hession等。
  • 动态代理:RPC框架中,客户端通过代理对象来调用远程服务,屏蔽了底层的实现细节,如同调用本地方法一般。动态代理可以在程序运行时动态生成代理对象,并且无需修改源代码。常见的动态代理技术包括Java中的JDK动态代理和CGLIB动态代理等。
  • 服务注册于发现:在分布式系统中,服务提供者与服务消费者需要将自身的元数据信息注册到一个服务注册中心。服务注册与发现是一种将服务提供者和服务消费者解耦的机制,使得服务提供者和服务消费者可以独立部署和扩展。常见的服务注册中心有:ZooKeeper、Nacos、Eureka等。
  • 负载均衡:负载均衡可以提供系统的性能与可用性,服务提供者可以集群部署,服务注册中心维护了多个服务提供者的服务地址,RPC框架会根据负载均衡算法将请求均匀地打到不同的服务实例,从而减少单个服务提供者的压力。
  • 高可用与容错:在分布式系统中,由于各种原因,服务提供者可能会出现宕机、网络故障等问题,因此需要通过一些服务治理机制(如集群容错、重试、熔断降级、限流等)来保证可靠性和高可用。

gRPC框架介绍

gRPC是一款基于Http/2协议传输,使用Protocol Buffers进行序列化的高性能开源RPC框架,支持多种开发语言以及跨语言通信。以上是gRPC的见解,也是其优势所在,gRPC的优势由Http/2和Protobuf继承而来。

  • 高效的传输协议:gRPC基于Http/2协议传输,具有多路复用、服务端推送和流量控制等功能,能够提高网络传输的效率。
  • 跨语言兼容性:gRPC使用Protocol Buffers进行序列化,支持多种编程语言,能够提供强大的统一跨语言能力。
  • 丰富的生态环境:gRPC已经成为云原生环境中的事实标准协议,并得到了k8s、etcd等组件的天然支持。

Http/2

由于使用了Http/2,gRPC天然享受Http/2带来的诸多优越特性:

  • 多路复用:Http/2使用了多路复用技术,允许在同一个Tcp连接同时发送多个请求和接收多个响应,提升了并发性能、降低了响应延迟。
  • 头部数据压缩:Http/2使用HPACK算法压缩头部数据(Header),在服务器与客户端维护头信息表,通过序号(索引)来表示字段key,并对字段value使用哈夫曼编码压缩数据,减少了头部数据两,进一步提升传输效率。
  • 二进制格式:Http/2的头信息和数据体都是二进制数据,称为帧(Frame),并且每个请求的数据包可以被分割为多个二进制,减少了网络开销。
  • 服务器推送:Http/2允许服务器主动向客户端推送资源。
  • 流量控制:。。。。。。
  • 。。。。

ProtoBuf

序列化协议是RPC框架重要的组成部分,客户端使用序列化协议将内存数据转换为二进制数据,服务端接收到后将二进制数据再转换为内存数据。序列化协议对RPC框架在网络传输方面的性能起着至关重要的影响。

gRPC使用Protocol Buffers 进行序列化,将数据结构以.proto文件进行描述,通过代码生成工具(protoc)可以生成对应数据结构的POJO对象和相关方法。

  • 优点:码流小、性能高。ProtoBuf序列化后的码流相对于其他结构化数据存储格式,例如XML、JSON等,更小跟紧凑,能够提高数据传输的效率。ProtoBuf采用结构化的数据存储格式,能够更容易地定义和描述数据结构,更易于管理和维护。
  • 缺点:需要依赖于工具生成代码、增加了学习成本和开发成本。可读性也不如JSON、XML。

gRPC实战

一、创建项目

项目包含三个子模块,grpc-api负责存放proto文件,grpc-server模块作为服务端,grpc-client模块作为客户端。

二、导入依赖

在grpc-api模块的pom.xml文件导入grpc依赖,同时server与client依赖api模块。

三、编写proto文件

在grpc-api编写proto文件

syntax = "proto3";option java_multiple_files = true;
option java_package = com.demo;
option java_outer_classname = "DemoServiceProto";
//请求参数
message DemoRequest{string operator =  1;
}
//响应参数
message DemoResponse{int32 result =  1;string message = 2;
}
//方法接口
service DemoService{rpc DemoTest(DemoRequest) returns (DemoResponse){}
}

接下来编辑proto文件:

可以使用mvn compile install -pl命令执行。

编写服务端

首先编写实现类,DemoServiceGrpc.DemoServiceImplBase是编译proto文件后生成的服务接口,需要继承并覆盖其中的方法。

public class DemoServiceImpl extends DemoServiceGrpc.DemoServiceImplBase{@Overridepublic void demoTest(DemoRequest request,StreamObserver<DemoResponse> responseObserver){String operator = request.getOperator();DemoResponse demoResponse = DemoResponse.newBuilder().setResult(1).setMessage("你好,"+operator).build();responseObserver.onNext(demoResponse);responseObserver.onCompleted();}
}

然后编写服务端启动类

public class GrpcServer{public static void main(Striing[] args) throws IOException, InterruptedException{//绑定端口ServerBuilder serverBuilder = ServerBuilder.forPort(9000)'//发布服务serverBuilder.addService(new DemoServiceImpl());Server server = serverBuilder.build();server.start();server.awaitTermination();
}
}

编写客户端

public class GrpcClient{public static void main(String[] args){// 创建通信管道ManagedChannel managedChannel = ManagedChannelBuilder.forAddress("localhost", 9090).usePlaintext().build();try {// 获取代理对象 StubDemoServiceGrpc.DemoServiceBlockingStub demoServiceBlockingStub = DemoServiceGrpc.newBlockingStub(managedChannel);// 创建请求对象DemoRequest test = DemoRequest.newBuilder().setOperator("Jason").build();// 调用 RPC 接口DemoResponse demoResponse = demoServiceBlockingStub.demoTest(test);System.out.println(demoResponse.getMessage());} catch (Exception e) {throw new RuntimeException(e);} finally {managedChannel.shutdown();}}
}

运行后会得到:你好,Jason。 这样的结果,大功告成~

相关文章:

浅谈RPC的实现原理与RPC实战

浅谈RPC的实现原理与RPC实战 什么是RPC?RPC框架基本原理gRPC框架介绍Http/2ProtoBuf gRPC实战一、创建项目二、导入依赖三、编写proto文件编写服务端编写客户端 什么是RPC? RPC(Remote Procedore Call)&#xff0c;及远程过程调用&#xff0c;是一种在分布式系统中用于进程间…...

算法|牛客网华为机试31-40C++

牛客网华为机试 上篇&#xff1a;算法|牛客网华为机试21-30C 文章目录 HJ31 单词倒排HJ32 密码截取HJ33 整数与IP地址间的转换HJ34 图片整理HJ35 蛇形矩阵HJ36 字符串加密HJ37 统计每个月兔子的总数HJ38 求小球落地5次后所经历的路程和第5次反弹的高度HJ39 判断两个IP是否属于同…...

Mysql 大表limit查询优化原理

优化前( 查询耗时 114.1s) explain select * from link_exec_task limit 80000, 10 # 查询耗时 114.1s优化后( 查询耗时 0.121s) explain select * from link_exec_task a INNER JOIN (select id from link_exec_task limit 80000, 10) b on a.id b.id #0.121s原理&…...

封装axios、环境变量、api解耦、解决跨域、全局组件注入

官网&#xff1a;Axios中文文档 | Axios中文网 安装&#xff1a;npm install axios axios封装&#xff1a; // 1. 引入axios import axios from "axios"; import storage from /utils/storage // 2. 创建axios实例 const instance axios.create({baseURL: proces…...

CDGP|数据治理于企业而言到底有什么用?

在当今数字化时代&#xff0c;数据已成为企业最重要的资产之一。无论是大型跨国公司还是初创型企业&#xff0c;数据都扮演着驱动决策、优化运营和推动创新的关键角色。然而&#xff0c;仅仅拥有大量的数据并不足以确保企业的成功。如何有效管理、整合和利用这些数据&#xff0…...

Java学习教程,从入门到精通,Java数组(Arrays)语法知识点及案例(19)

1、Java数组&#xff08;Arrays&#xff09;语法知识点及案例 一、数组的基本概念 数组是多个相同类型的数据按照一定的顺序排列的集合&#xff0c;使用一个名字命名&#xff0c;通过编号&#xff08;索引&#xff09;的方式对这些数据进行统一管理。数组是引用数据类型&…...

11.4OpenCV_图像预处理习题02

1.身份证号码识别&#xff08;结果&#xff1a;身份证号识别结果为&#xff1a;911124198108030024&#xff09; import cv2 import numpy as np import paddlehub as hubdef get_text():img cv2.imread("images1/images/shenfen03.jpg")# 灰度化gray_img cv2.cvt…...

go的template示例

模板定义&#xff1a; type Config struct {{{- $len : len .DbConfigs -}}{{- $i : 0 -}}{{- range $key, $value : .DbConfigs}}{{title $key}} *DbConfig "yaml:\"{{lower $key}}\"" {{if lt $i (sub $len 1)}},{{end}}{{- $i add $i 1 -}}{{- end…...

『YOLO』| 断点训练、解决训练中断异常情况

文章目录 方法一方法二 当yolo在训练的时候&#xff0c;如果训练中断或者出现异常&#xff0c;可通过修改代码&#xff0c;从上一次断掉处重新训练&#xff0c;实现断点续训。 方法一 第一种方法&#xff1a; 按照官方给出的恢复训练代码&#xff0c;用yolo命令格式&#xff…...

MQTT+Disruptor 提高物联网高并发

基于springboot2.5.7 废话不多说&#xff0c;直接上干货&#xff1a; Slf4j Configuration EnableConfigurationProperties(MqttProperties.class) IntegrationComponentScan(basePackages {"扫描包路径","扫描包路径"}) public class MqttAutoConfig {…...

SpringBoot项目集成ONLYOFFICE

ONLYOFFICE 文档8.2版本已发布&#xff1a;PDF 协作编辑、改进界面、性能优化、表格中的 RTL 支持等更新 文章目录 前言ONLYOFFICE 产品简介功能与特点Spring Boot 项目中集成 OnlyOffice1. 环境准备2. 部署OnlyOffice Document Server3. 配置Spring Boot项目4. 实现文档编辑功…...

用于nodejs的开源违禁词检测工具 JavaScript node-word-detection

地址 : https://www.npmjs.com/package/node-word-detection github地址: https://github.com/xiaobaidadada/node-word-detection 非常节省内存的轻量级快速违禁词、词典库 检测工具 、 50万个词大约需要300MB内存、被检测的文本100字内结果在1毫秒左右。本项目没有提供词库请…...

FFmpeg 4.3 音视频-多路H265监控录放C++开发十二:在屏幕上显示多路视频播放,可以有不同的分辨率,格式和帧率。

上图是在安防领域的要求&#xff0c;一般都是一个屏幕上有显示多个摄像头捕捉到的画面&#xff0c;这一节&#xff0c;我们是从文件中读取多个文件&#xff0c;显示在屏幕上。...

Linux权限问题(账号切换,权限,粘滞位)

1.什么是权限&#xff1f; 在Linux下有两种用户&#xff0c;分别是超级用户&#xff08;root&#xff09;和普通用户。超级用户可以在Linux下做任何事情&#xff0c;几乎不受限制&#xff0c;而普通用户一般只能在自己的工作目录下&#xff08;/home/xxx&#xff09;工作&#…...

el-upload,上传文件,后端提示信息,前端需要再次重新上传(不用重新选择文件)

1.el-upload 上传附件&#xff1a; <el-uploadref"upload":action"upload.url ?updateSupport upload.updateSupport":auto-upload"false":disabled"upload.isUploading":headers"upload.headers":limit"1"…...

数字信号处理Python示例(5)使用实指数函数仿真PN结二极管的正向特性

文章目录 前言一、二极管的电流-电压关系——Shockley方程二、PN结二极管正向特性的Python仿真三、仿真结果分析写在后面的话 前言 使用Python代码仿真了描述二极管的电流-电压关系的Shockley方程&#xff0c;对仿真结果进行了分析&#xff0c;说明在正向偏置区域&#xff0c;…...

ctfshow(89,90,92,93)--PHP特性--intval函数

Web89 源代码&#xff1a; include("flag.php"); highlight_file(__FILE__);if(isset($_GET[num])){$num $_GET[num];if(preg_match("/[0-9]/", $num)){die("no no no!");}if(intval($num)){echo $flag;} }审计 GET传参num。 如果在参数num中…...

构建ubuntu22.04.4私有源服务以及配置ubuntu私有源

构建ubuntu22.04.4私有源服务以及配置ubuntu私有源 一、环境说明1.1 私有源服务器1.2 客户机二 、构建私有源服务2.1 服务构建2.2 发布新的deb包到源服务器1. 准备新的 `.deb` 包2. 将 `.deb` 包添加到仓库目录3. 更新 `Packages` 文件4. 更新仓库的发布文件(可选)5. 通知客户…...

模块功能的描述方法

目录 行为描述方法 语句块 过程赋值语句 高级程序语句 循环语句 数据流描述 结构描述 混合描述方法 module 模块名(端口列表); // 模块声明// 端口定义input [数据类型] [位宽] 输入端口列表; output [数据类型] [位宽] 输出端口列表; inout [数据类…...

【WPF】MatrixTransform类

【WPF】MatrixTransform类 主要特性使用场景示例 在WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;MatrixTransform 类是用于表示一个仿射变换的类&#xff0c;它允许开发者通过一个矩阵来定义一个二维空间中的线性变换。这种变换可以包括平移&…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...