RPC技术分享

一、微服务与RPC技术分享

1.1 微服务简介

微服务架构是一种软件设计和开发的模式,将应用程序拆分为一组小型、独立的服务。每个服务运行在自己的进程中,并使用轻量级通信机制进行协同工作。微服务架构通过提高灵活性、可维护性和可伸缩性来改进大型系统的开发和维护。

1.2 为什么使用RPC在微服务架构中

微服务之间的通信是构建整体系统的关键部分。使用RPC(Remote Procedure Call)作为微服务之间的通信机制有以下优势:

  • 抽象复杂性:RPC提供了一种抽象,使得开发者可以调用远程服务就像调用本地函数一样,无需关心底层通信细节。
  • 标准化通信:RPC框架定义了标准的通信协议,使得不同微服务之间的通信更加一致和可靠。
  • 性能优化:一些RPC框架,如gRPC,使用了高性能的通信协议(如HTTP/2),并支持多路复用,从而提高了通信效率。
  • 类型安全:使用IDL(Interface Definition
    Language)定义服务接口和消息格式,提供了类型安全的通信,减少了通信错误的可能性。

二、RPC协议介绍

2.1 RPC协议基本概念

RPC协议是一种通过网络在远程计算机上执行程序的协议。它建立在客户端和服务器之间,允许客户端调用远程服务器上的过程或方法,就像调用本地过程一样。RPC协议通常包括定义远程服务接口、数据序列化和网络传输等方面。

常用RPC技术或框架

应用级的服务框架:阿里的 Dubbo/Dubbox、Google gRPC、Spring Boot/Spring Cloud。
远程通信协议:RMI、Socket、SOAP(HTTP XML)、REST(HTTP JSON)。
通信框架:MINA 和 Netty

主流的gRPC、Thrift、Dubbo

  • gRPC:gRPC是Google开源软件,gRPC是基于HTTP2.0协议,而HTTP2.0是基于二进制的HTTP协议升级版本,底层使用Netty框架支持。
  • Thrift:Thrift是Facebook开源项目,其是一个跨语言的服务开发框架。用户只需在进行二开即可,对底层的RPC通讯透明。
  • Dubbo:Dubbo是阿里开源组件协议和序列化框架都可以插拔,依托Spring框架开发,远程接口是基于Java接口,适用于微服务架构。

使用场景

  • 大型网站:内部涉及多个子系统,服务、接口较多。
  • 注册发现机制:如Nacos、Dubbo等,一般都有注册中心,服务有多个实例,调用方调用的哪个实例无感知。
  • 安全性`:不暴露资源。
  • 服务化治理:微服务架构、分布式架构。

架构图

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/5da247808a3843cfbca4d4dcd3c587ea.png#pic_center
在这里插入图片描述

2.2 不同RPC框架的协议

不同的RPC框架可能使用不同的协议,如XML-RPC、JSON-RPC、Thrift等。每种协议都有其特定的优势和适用场景。

三、RPC技术分享

3.1 RPC简介

RPC(Remote Procedure Call)是一种远程过程调用的协议,允许程序调用另一台机器上的程序,就像调用本地函数一样。RPC的实现可以通过不同的协议和框架,如XML-RPC、JSON-RPC、Thrift等。

3.2 Python实现RPC的Demo

3.2.1 安装所需库

pip install xmlrpc.server

3.2.2 Python实现RPC的示例代码



from xmlrpc.server import SimpleXMLRPCServer

def add(x, y):
    return x + y

server = SimpleXMLRPCServer(("localhost", 8000))
server.register_function(add, "add")

print("RPC Server listening on port 8000...")
server.serve_forever()




from xmlrpc.client import ServerProxy

server = ServerProxy("http://localhost:8000")

result = server.add(3, 5)
print("Result from RPC call:", result)


3.3 RPC的好处

抽象远程调用的复杂性,使分布式系统开发更加简便。
提高系统的可维护性和可扩展性。
降低系统之间通信的复杂性。

四、gRPC技术分享

4.1 gRPC简介

gRPC是一种高性能、开源的RPC框架,由Google开发,基于HTTP/2协议。它支持多种编程语言,并提供强大的IDL(Interface Definition Language)工具,如Protocol Buffers。

4.2 Protobuf语法相关讲解

4.2.1 定义服务和消息格式

Protocol Buffers(Protobuf)是一种轻量级的数据交换格式,通过.proto文件定义消息的结构和服务的接口。以下是一个简单的Protobuf示例文件

// calculator.proto

syntax = "proto3";

service Calculator {
  rpc Add (AddRequest) returns (AddResponse);
}

message AddRequest {
  int32 x = 1;
  int32 y = 2;
}

message AddResponse {
  int32 result = 1;
}

- syntax = “proto3”;:指定使用Protocol Buffers的第三个版本。
- service Calculator:定义一个服务,其中包含一个RPC方法 Add。
- message AddRequest 和 message AddResponse:定义了请求和响应消息的格式。

4.2.2 编译生成代码

在终端中执行以下命令,将.proto文件编译为Python代码:

python -m grpc_tools.protoc -I . --python_out=. --grpc_python_out=. calculator.proto

4.3 gRPC的Demo分享
4.3.1 编写服务端代码


# server.py
from concurrent import futures
import grpc
import calculator_pb2
import calculator_pb2_grpc

class CalculatorServicer(calculator_pb2_grpc.CalculatorServicer):
    def Add(self, request, context):
        result = request.x + request.y
        return calculator_pb2.AddResponse(result=result)

server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
calculator_pb2_grpc.add_CalculatorServicer_to_server(CalculatorServicer(), server)


print("gRPC Server listening on port 50051...")
server.add_insecure_port("[::]:50051")
server.start()
server.wait_for_termination()


4.3.2 编写客户端代码


# client.py
import grpc
import calculator_pb2
import calculator_pb2_grpc

channel = grpc.insecure_channel("localhost:50051")
stub = calculator_pb2_grpc.CalculatorStub(channel)


request = calculator_pb2.AddRequest(x=3, y=5)
response = stub.Add(request)

print("Result from gRPC call:", response.result)

4.4 gRPC的好处

  • 性能优越:基于HTTP/2协议,支持多路复用和头部压缩,提高传输效率。

  • 多语言支持:支持多种编程语言,使得在不同技术栈之间进行通信更加方便。

  • 强大的IDL工具:使用Protocol Buffers定义服务和消息格式,提供更加强大的接口定义和类型约束。

五、总结

通过本文的技术分享与演示,我们了解了RPC的基本概念,并使用Python实现了一个简单的RPC示例。随后,介绍了gRPC作为一种现代化的RPC框架,通过示例演示了其强大的功能和优势。选择合适的RPC框架取决于项目的需求和复杂性,而gRPC以其高性能和多语言支持成为当今分布式系统开发中的重要选择。

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

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

相关文章

LeetCode.145. 二叉树的后序遍历

题目 145. 二叉树的后序遍历 分析 上篇文章我们讲了前序遍历,这道题目是后序遍历。 首先要知道二叉树的后序遍历是什么?【左 右 根】 然后利用递归的思想,就可以得到这道题的答案,任何的递归都可以采用 栈 的结构来实现&#…

备战蓝桥杯---动态规划(入门2)

今天主要介绍区间dp比较难的题: 下面是分析: 我们如果先固定点V0,那我们得去枚举两个点使它构成三角形,同时求目标值也比较难确定(起始与终止都带0),于是我们考虑固定边,我们固定v0…

16 亚稳态原理和解决方案

1. 亚稳态原理 亚稳态是指触发器无法在某个规定的时间段内到达一个可以确认的状态。在同步系统中,输入总是与时钟同步,因此寄存器的setup time和hold time是满足的,一般情况下是不会发生亚稳态情况的。在异步信号采集中,由于异步…

哈工大计算机网络考试经验及资源分享

如果你觉得资源对你有用,在收藏的同时不要忘记点个赞(●◡●),你的支持,是我坚持创作的最佳动力。 哈工大计算机网络是一门重要的课程,对于学习计算机网络知识非常有帮助。在学习这门课程时,我选择了中科大zq老师的网…

Spring Boot 笔记 008 创建接口_获取用户信息

1.1.1 编写userinfo接口 1.1.2 User实体类中增加转json忽略password注释 package com.geji.pojo;import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data;import java.time.LocalDateTime;//lombok 在…

PyQt Python 使用 VTK ITK 进行分割 三维重建 医学图像可视化系统 流程

效果: 重建流程: 1. 输入 可以读取DICOM ,nii nrrd 等数据 设置读取器以加载 DICOM 图像系列。 使用 itk::GDCMImageIO 作为 DICOM 图像的输入输出接口。 使用 itk::GDCMSeriesFileNames 获取指定路径下的所有 DICOM 文件名。 使…

Google刚刚推出了图神经网络Tensorflow-GNN

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

单片机学习笔记---AT24C02数据存储

目录 AT24C02数据存储 准备工作 代码讲解 I2C.c 模拟起始位置的时序 模拟发送一个字节的时序 模拟接收应答的时序 模拟接收一个字节的时序 模拟发送应答的时序 模拟结束位置的时序 I2C.h AT24C02.c 字节写:在WORD ADDRESS(字地址&#xff…

假期作业 10

1.整理磁盘操作的完整流程,如何接入虚拟机,是否成功识别,对磁盘分区工具的使用,格式化,挂载以及取消挂载 U盘接入虚拟机 在虚拟机--->可移动设备--->找到U盘---->连接 检测U盘是否被虚拟机识别 ls /dev/s…

活字格V9 嵌入的html与活字格页面数据交互

不想看分析请直接跳到解决方案 项目场景: 活字格V9 嵌入的html与活字格页面的数据交互(传值),嵌入的html用了WebSocket来控制硬件,获取的数据无法回传到活字格页面上,且嵌入的html无法使用活字格内置的js及…

【C++计算几何】点是否在线段上

题目描述 输入一个点Q和一条线段P1P2的坐标,判断这个点是否在该线段上。 输入 一行,共六个浮点数,依次表示Q,P1和P2的坐标。 输出 一行,一个字符数,“YES”或“NO”分别表示改点在或者不在线段上。 样…

WinCC、LabVIEW、InTouch组态软件比较,看后秒懂,超简洁。

WinCC、LabVIEW和InTouch是三种常见的组态软件,用于工业自动化和人机界面开发。以下是它们之间的比较和区别: 功能和应用领域: WinCC:WinCC是西门子公司的组态软件,主要用于监控和控制工业过程。它提供了丰富的功能&a…

线性代数的本质 1 向量

向量是线性代数中最为基础的概念。 何为向量? 从物理上看, 向量就是既有大小又有方向的量,只要这两者一定,就可以在空间中随便移动。 从计算机应用的角度看,向量和列表很接近,可以用来描述某对象的几个不同…

Linux运用fork函数创建进程

fork函数: 函数原型: pid_t fork(void); 父进程调用fork函数创建一个子进程,子进程的用户区父进程的用户区完全一样,但是内核区不完全一样;如父进程的PID和子进程的PID不一样。 返回值: RETURN VALUEO…

无人机概述及系统组成,无人机系统的构成

无人机的定义 无人驾驶航空器,是一架由遥控站管理(包括远程操纵或自主飞行)的航空器,也称遥控驾驶航空器,以下简称无人机。 无人机系统的定义 无人机系统,也称无人驾驶航空器系统,是指一架无人…

计网day2

三 物理层 3.1 物理层基本概念 物理接口特性: 物理层解决如何连接各种计算机的传输媒体上传输数据比特流,而不是指具体的传输媒体 3.2 编码&调制 3.3 数据交换方式 电路交换: 报文交换: 分组交换&#x…

day13笔记

static 在堆中静态区,可以用类调用.该类所有对象共有. 工具类 私有构造方法. 方法用static修饰方便调用(可以用类名直接调用). static特点(三条) 继承 方法的重写 在子类里面把父类方法再重写一遍 为什么需要重写呢? 因为父类提供的方法不能满足子类的需求

Java 三大并大特性-可见性介绍(结合代码、分析源码)

目录 ​编辑 一、可见性概念 1.1 概念 二、可见性问题由来 2.1 由来分析 三、可见性代码例子 3.1 代码 3.2 执行结果 四、Java 中保证可见性的手段 4.1 volatile 4.1.1 优化代码 4.1.2 测试结果 4.1.3 volatile原理分析 4.1.3.1 查看字节码 4.1.3.2 hotspot 层面…

【数据结构】二叉树的顺序结构及实现(堆)

目录 1.二叉树的顺序结构 2.堆的概念及结构 3.堆的实现 3.1堆向下调整算法 3.2堆的创建 3.3建堆的时间复杂度 3.4堆的插入 3.5堆的删除 3.6堆的代码实现 3.7堆的应用 3.71堆排序 3.72 TOP-K问题 1.二叉树的顺序结构 普通的二叉树是不适合用数组来存储的,因…

【linux系统体验】-ubuntu简易折腾

ubuntu 一、终端美化二、桌面美化2.1 插件安装2.2 主题和图标2.3 美化配置 三、常用命令 以后看不看不重要,咱就是想记点儿东西。一、终端美化 安装oh my posh,参考链接:Linux 终端美化 1、安装字体 oh my posh美化工具可以使用合适的字体&a…