浅谈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。 这样的结果,大功告成~

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

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

相关文章

JeecgBoot入门

最近在了解低代码平台&#xff0c;其中关注到gitee上开源项目JeecgBoot&#xff0c;JeecgBoot官方也有比较完整的入门教学文档&#xff0c;这里我们将耕者官方教程学习&#xff0c;并将其记录下来。 一、项目简介 JeecgBoot 是一款基于代码生成器的低代码开发平台拥有零代码能力…

Java基础语法①Java特点+环境安装+IDEA使用

目录 1. Java的概念和用途 1.1 Java的概念和发展史 1.2 Java的重要性 1.3 Java的特点 2. Java环境 2.1 JVM 和 JDK 2.2 Java环境安装 2.3 安装IntelliJ IDEA并使用 2.4 IntelliJ IDEA常见快捷键 2.4.1 普通快捷键 2.4.2 调试快捷键 2.4.3 代码生成快捷键 本篇完 写…

windows与windows文件共享

目录 基础设置主机共享文件端设置从机接受文件端设置 基础设置 1、先确保两台电脑直接能够ping通&#xff0c;这是文件共享的前提&#xff0c;如果ping不通就去查找对应的原因&#xff0c;一般都是防火墙的原因。 在ping通的情况下&#xff1a; 2、先找到高级共享设置 3、对专…

Unity3D 开发教程:从入门到精通

Unity3D 开发教程&#xff1a;从入门到精通 Unity3D 是一款强大的跨平台游戏引擎&#xff0c;广泛应用于游戏开发、虚拟现实、增强现实等领域。本文将详细介绍 Unity3D 的基本概念、开发流程以及一些高级技巧&#xff0c;帮助你从零基础到掌握 Unity3D 开发。 目录 Unity3D…

[算法初阶]第二集 滑动窗口(已完结)

大家好啊,好久没有更新了,最近比较忙,所以来更新初阶算法,正好复习一下,感谢大家的观看,如有错误欢迎指出。 下面我们来看题目吧&#xff01; 1.209. 长度最小的子数组 这题大家想必一眼就看出了解法一暴力法 这个解法很简单 代码如下,不做多的解释 class Solution { publi…

恋爱脑学Rust之Box与RC的对比

在遥远的某个小镇&#xff0c;住着一对年轻的恋人&#xff1a;阿丽和小明。他们的爱情故事就像 Rust 中的 Rc 和 Box 智能指针那样&#xff0c;有着各自不同的「所有权」和「共享」的理解。 故事背景 阿丽和小明准备共同养一株非常珍贵的花&#xff08;我们称之为“心之花”&…

Move Dev Meetup@Beijing圆满结束,发掘Move生态新机会

Sui、Aptos 、Rooch 和 zkMove等为代表的 Move 生态在 2024 年展现出强劲的生命力和发展速度。随着技术的持续演进&#xff0c;Move 语言的独特优势吸引了大量优质项目、开发者、投资者和爱好者的参与&#xff0c;共同推动生态建设和创新应用。新一轮技术革新已经开启&#xff…

Python | Leetcode Python题解之第530题二叉搜索树的最小绝对差

题目&#xff1a; 题解&#xff1a; # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val x # self.left None # self.right Noneclass Solution(object):def isValidBST(self, root):"…

数字经济赋能新质生产力数据集-dta格式(2012-2022年)

数据简介&#xff1a;新质生产力以新发展理念为思想指引&#xff0c;驱动数字经济创新发展动力、推动区域协调发展、转变发展方式、拓宽国际市场、共享数据要素&#xff0c;为数字经济高质量发展提供强大 动力支持。数字经济在发展过程中可能会存在关键性技术创新能力不足、传统…

Oracle视频基础1.4.3练习

15个视频 1.4.3 できない dbca删除数据库 id ls cd cd dbs ls ls -l dbca# delete a database 勾选 # chris 勾选手动删除数据库 ls ls -l ls -l cd /u01/oradata ls cd /u01/admin/ ls cd chris/ ls clear 初始化参数文件&#xff0c;admin&#xff0c;数据文件#新版本了…

.net core 接口,动态接收各类型请求的参数

[HttpPost] public async Task<IActionResult> testpost([FromForm] object info) { //Postman工具测试结果&#xff1a; //FromBody,Postman的body只有rawjson时才进的来 //参数为空时&#xff0c;Body(form-data、x-www-form-urlencoded)解析到的数据也有所…

《JVM第5课》虚拟机栈

无痛快速学习入门JVM&#xff0c;欢迎订阅本免费专栏 Java虚拟机栈&#xff08;Java Virtual Machine Stack&#xff0c;简称JVM栈&#xff0c;又称Java方法栈&#xff09;是 JVM 运行时数据区的一部分&#xff0c;主要用于支持Java方法的执行。每当一个新线程被创建时&#xf…

Axure大屏可视化模板:赋能各行各业的数据展示与管理

如何高效、直观地展示和分析数据&#xff0c;成为企业和机构面临的重要挑战。Axure大屏可视化模板作为一种先进的数据展示工具&#xff0c;凭借其强大的交互性和直观性&#xff0c;在多个领域内得到了广泛应用。从农业生产的智能化管理到城市发展的精细化管理&#xff0c;再到企…

【软考】Redis不同的数据类型和应用场景。

Redis的不同数据类型和对应的应用场景&#xff1a; Redis 数据类型及其应用场景 String&#xff08;字符串&#xff09; 特点&#xff1a;简单的值存储&#xff0c;支持二进制数据。应用场景&#xff1a; 缓存用户会话。缓存小的配置文件。缓存计数器。文章浏览量&#xff0…

楼梯区域分割系统:Web效果惊艳

楼梯区域分割系统源码&#xff06;数据集分享 [yolov8-seg-FocalModulation&#xff06;yolov8-seg-GFPN等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Global Al l…

HarmonyOS Next星河版笔记--界面开发(3)

属性 1.1.设计资源-svg图标 需求&#xff1a;界面中展示图标→可以使用的svg图标(任意放大缩小不失真、可以改变颜色) 使用方式&#xff1a; ①设计师提供&#xff1a;基于项目的图标&#xff0c;拷贝到项目目录使用 Image($r(app.media.ic_dianpu)) .width(40) fillColor…

java项目之洗衣店订单管理系统源码(springboot)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的洗衣店订单管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 基于springboot的洗衣…

探索Unity:从游戏引擎到元宇宙体验,聚焦内容创作

unity是实时3D互动内容创作和运营平台&#xff0c;包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者&#xff0c;借助Unity将创意变成现实。提供一整套完善的软件解决方案&#xff0c;可用于创作、运营和变现任何实时互动的2D和3D内容&#xff0c;支持平台包括手机、…

(十二)JavaWeb后端开发——MySQL数据库

目录 1.数据库概述 2.MyQSL 3.数据库设计 DDL 4.MySQL常见数据类型 1.数据库概述 数据库&#xff1a;DataBase(DB)&#xff0c;是存储和管理数据的仓库 数据库管理系统&#xff1a;DataBase ManagementSystem(DBMS)&#xff0c;操纵和管理数据库的大型软件 SQL&#xff…

深入浅出 Spring Boot 与 Shiro:构建安全认证与权限管理框架

一、Shiro框架概念 &#xff08;一&#xff09;Shiro框架概念 1.概念&#xff1a; Shiro是apache旗下一个开源安全框架&#xff0c;它对软件系统中的安全认证相关功能进行了封装&#xff0c;实现了用户身份认证&#xff0c;权限授权、加密、会话管理等功能&#xff0c;组成一…