后端学习 -gRPC

news2024/12/27 0:11:30

gRPC

何为 RPC

  • RPC 和 HTTP 的关系

    1. 基于 HTTP 的远程调用方案(包含了接口规范、序列化反序列化等)和 RPC 是并列的
    2. 单从 HTTP 协议来看,RPC 可以使用 HTTP 作为通信协议
      在这里插入图片描述
  • 基于 HTTP 的远程调用方案和 RPC 的相同点、不同点

    • 相同点
      1. 都可以实现远程调用(上图的顶端节点)
    • 不同点
      1. 基于 HTTP RESTful 的远程调用可读性更好
      2. RPC 可以针对场景选用不同的框架(如 Dubbo、gRPC 等),不同的通信协议(HTTP、TCP、UDP),以及不同的序列化方式(JSON、PB 等),效率更高
  • RPC 执行流程:调用方和被调用方

  1. Client 调用以本地调用方式调用服务;
  2. Client Stub 接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体(桩代码是未实现的接口,此处使用动态代理);
  3. Client Stub 找到服务地址,并将消息发送到服务端;
  4. Server Stub 收到消息后进行解码;
  5. Server Stub 根据解码结果调用本地的服务;
  6. 本地服务执行并将结果返回给 Server Stub;
  7. Server Stub 将返回结果打包成消息并发送至消费方;
  8. Client Stub 接收到消息,并进行解码;
  9. Client 得到最终结果
  • Stub (桩代码)指满足形式要求但没有实现实际功能的占位或代理代码
  • RPC 中的桩代码负责远程请求或响应

ProtocolBuffer

  • PB 是一种语言无关、平台无关、可扩展的序列化结构数据的接口描述语言(Interface Description Language, IDL),可用于通信协议、数据存储等
  1. 编写 .proto 文件,假设场景是根据地址,查询地址对应的联系方式,以及该号码是否活跃
syntax = "proto3"  // 语法版本

package com.hit.demo;

service PhoneLookup {
	rpc QueryPhoneByAddress (Request) returns (Response) {}
}

message Requset {
	required string id = 1;  // required:必须传入1个参数
	optional string name = 2;  // optional:可以传入0或1个参数,如果不传入则为默认0值
	repeated string address = 3;  // repeated:可以传入0或多个参数
}

message Response {
	string id = 1;
	ResultCode result = 2 [default = SUCCESS];  // 声明默认值
	repeated int64 number = 3;
	repeated bool active = 4;
	
	enum ResultCode {
		SUCCESS = 0;
		FAIL = 1;
		UNKNOWN = 3;
	}
}
  1. 编译 .proto 文件得到桩代码,此时在文件中声明的类已可用,并支持序列化、反序列化
public static void main(String[] args) {
    // 构造查询请求
    Request req0 = Request.newBuilder()
        			.setId("Request01")
        			.setName("dino")
        			.setAddress(Collections.singletonList("hita08"))
        			.build();
    // 序列化
    byte[] reqBytes = req.toByteArray();
    // 反序列化
    Request req1 = Request.parseFrom(reqBytes);
}
  1. Client 和 Server 使用编译生成的桩代码,分别实现业务逻辑

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

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

相关文章

RabbitMQ 快速入门 7 种简单模式

RabbitMQ 快速入门 7 种简单模式起步七种模式项目依赖1、"Hello World!"(1) Connection 方式(2) RabbitTemplate 方式2、Work Queues生产者消费者3、Publish/Subscribe关系绑定生产者消费者4、Routing消费者生产者5. Topics消费者生产者起步 七种模式 这七种模型其…

ch1_系统启动_bootsect.s

这里介绍, 操作系统启动中的 bootsect.S 文件 1. bootsect.s的作用概览 bootsect.s代码是磁盘引导块程序,驻留在磁盘的第一个扇区中(引导扇区,0磁道(柱面),0磁头,第一个扇区, 如图中的黄色区域) 图一&…

springboot+jsp学生心理健康测评网

基于JSP技术设计并实现了学生心理健康网。该系统基于B/S即所谓浏览器/服务器模式,应用SSM框架,选择MySQL作为后台数据库。系统主要包括个人中心、用户管理、知识分类管理、知识信息管理、心理测试管理、交流论坛、试卷管理、系统管理、考试管理等功能模块…

Redis实战——优惠券秒杀(超卖问题)

1 实现优惠券秒杀功能 下单时需要判断两点:1.秒杀是否开始或者结束2.库存是否充足 所以,我们的业务逻辑如下 1. 通过优惠券id获取优惠券信息 2.判断秒杀是否开始,如果未返回错误信息 3.判断秒杀是否结束,如果已经结束返回错误…

第十三章《集合》第2节:List集合

List这个单词意为“列表”,List类型的集合的特点是:元素呈线性排列,致密且有序。下面的图13-3展示了List类型集合的特点。 图13-3 List类型集合 图13-3中的每一个小圆形代表一个元素,可以看到,这些元素被放到List集合中后被排成一列,这就是“线性排列”。List集合中的元…

美国海运专线有哪些港口?美国海运专线有哪些路线?

随着全球物流的日益密切和跨境电商的活跃,跨境物流连接买卖双方的作用越来越重要。美国是中国亚马逊卖家的重要市场之一,那么美国海运专线有哪些港口?又有哪些路线?方联物流以亚马逊平台为例,跟大家聊聊美国海运专线那点事。美国海运专线有…

Android Studio Gradle相关

一、区分gradle version与gradle plugin version 参考博客 gradle是一个构建工具,理论上来说,它可以用来构建任何项目(如java项目,ios项目)。它可以与任何类型的IDE集成(如ecllipse,android st…

2023年上半年软考中级数据库系统工程师如何高效备考?难吗?

考试题型介绍: (1)基础知识,考试时间为150分钟,笔试,满分75分。45分及格。 (2)应用技术,考试时间为150分钟,笔试,满分75分。45分及格。 &#…

思维导图之设计原则

设计原则是指导我们代码设计的一些经验总结,对于某些场景下,是否应该应用某种设计模式,具有指导意义。 设计原则总结如下图所示:

[附源码]SSM计算机毕业设计学生互评的在线作业管理系统JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

pycare检测时间序列异常

1. 获取时间序列数据(官方文档是多特征,本文举例是单特征) 未安装pycaret的先安装:pip install --pre pycaret (也可以pip install pycaret) 2.用pycaret检测异常一般用pycaret.anomaly pycaret.anomaly…

七、【React-Router5】嵌套路由

文章目录1、实现效果2、嵌套路由规则3、修改上一节代码3.1、项目结构变更如下3.2、CODE3.2.1、Home.jsx3.2.2、Message.jsx3.2.3、News.jsx3.3、Result1、实现效果 2、嵌套路由规则 注册子路由时要写上父路由的path值路由的匹配是按照注册路由的顺序进行的 3、修改上一节代码…

SparkMlib 之决策树及其案例

文章目录什么是决策树?决策树的优缺点决策树示例——鸢尾花分类什么是决策树? 决策树及其集成是分类和回归机器学习任务的流行方法。决策树被广泛使用,因为它们易于解释,处理分类特征,扩展到多类分类设置,…

信号类型(雷达)——连续波雷达(二)

系列文章目录 《信号类型(雷达通信)》 《信号类型(雷达)——雷达波形认识(一)》 文章目录 目录 一、连续波雷达信号 1.1 单频雷达信号 1.2 调频连续波雷达 1.3 相位编码连续波雷达 1.4 多频连续波雷…

【AI学习笔记】TensorFlow GPU版本的安装(超详细)

安装步骤:1. 确认显卡是否支持CUDA2. 安装CUDA3. 安装cuDNN3.1 安装 cudnn3.2 将cudnn64_8.dll存放的位置加入Path环境变量4. 安装TensorFlow GPU版本4.1 在Anaconda建立TensorFlow GPU虚拟环境4.2 安装Tensorflow-gpu4.3 安装Keras总结1. 确认显卡是否支持CUDA 在…

【计算机】可信平台模块Trusted Platform Module - TPM

简述 Brief Introduction TPM内部功能模块示意图: 引述 Trusted Platform Module Technology Overview (Windows) | Microsoft Learn: Trusted Platform Module (TPM) technology is designed to provide hardware-based, security-related functions.…

速锐得解码理想汽车L8方向盘转向角度应用随动大灯照明升级

前日,速锐得解码了理想汽车L8车型,由于理想L8是新款车型,架构和理想L9十分相似,与理想ONE这一代有比较大的差异,这恰恰也是我们很好的一次学习机会,也让我们重新认识了理想汽车。 我这里,只挑有…

PCL 点云的法向量

一,点的法向量 点云法线 法向量的概念是很小的时候我们就已经说的,法向量是我们点云中一个非常重要的属性,诸如饿哦们常说的三维重建、点云分割,点云去噪 以及特种描述算法等。 特性: 点云中每一点的法向量夹角和曲率…

【即将开源】⽤于3D激光雷达SLAM闭环检测的词袋模型BoW3D

​以下内容来自从零开始机器人SLAM知识星球 每日更新内容 点击领取学习资料 → 机器人SLAM学习资料大礼包 #论文# BoW3D: Bag of Words for Real-time Loop Closing in 3D LiDAR SLAM 论文地址:https://arxiv.org/abs/2208.07473 作者单位:中国沈阳自动…

C++基础语法

cout输出 cin是键盘输入 //i input 输入 o output输出 stream流 输入输出流头文件&#xff08;类似stdio.h&#xff09; 2 #include <iostream> 3 4 //std(标准) 使用标准的命名空间using namespace std;//命名空间,此标识符作为此组群的名字 5 using namespace std; 6…