RPC框架(一)——简易RPC

news2025/1/15 6:35:09

RPC介绍

RPC,Remote Procedure Call 即远程过程调用,远程过程调用其实对标的是本地过程调用
在这里插入图片描述
一个RPC框架要进行使用应该要具有如下的组件(功能)
在这里插入图片描述
从整体层次来看,一个RPC协议的框架应该具有三个层面:

  • 服务的注册中心
  • 请求服务的客户端
  • 提供服务的服务端。

关于这三个层面,其实细分的话,又可以分为以下几个部分,每一部分完成各自的任务。

1.客户端(客户端发起请求,调用远程方法)

2.客户端存根(存放服务端地址信息,将客户端的请求参数数据信息打包成网络消息,再通过网络传输发送给服务端)作为一个代理类

3.网络传输 通过网络传输,把我们调用的远程接口中的参数传输给服务端,这样服务端的接口实现类才能进行处理,在处理完成之后,还要通过网络传输的方式把返回的结果发送回来。网络传输一般有原生的Soket方式,还有现在常用的Netty

4.服务端存根( 接收客户端发送过来的请求消息并进行解析,然后再调用服务端的方法进行处理)作为一个代理类

5.服务端 (提供服务的一方,有远程接口和实现类)

简易RPC实现

通用接口

Service接口:

public interface HelloService {
    String hello(HelloObject object);
}

传输数据的实体类(在网络传输的过程中,实体类都需要实现Serializable接口,代表可序列化):

@Data
@NoArgsConstructor
@AllArgsConstructor
public class HelloObject implements Serializable {
    private Integer id;
    private String message;
}

Service接口的实现类:

@Service
public class HelloServiceImpl implements HelloService {
    private static final Logger logger = LoggerFactory.getLogger(HelloServiceImpl.class);
    @Override
    public String hello(HelloObject object) {
        logger.info("接收到消息:{}", object.getMessage());
        return "这是Impl1方法";
    }
}

传输格式

RpcRequest对象:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class RpcRequest implements Serializable {

    /**
     * 请求号
     */
    private String requestId;
    /**
     * 待调用接口名称
     */
    private String interfaceName;
    /**
     * 待调用方法名称
     */
    private String methodName;
    /**
     * 调用方法的参数
     */
    private Object[] parameters;
    /**
     * 调用方法的参数类型
     */
    private Class<?>[] paramTypes;

    /**
     * 是否是心跳包
     */
    private Boolean heartBeat;

}

RpcResponse对象:

@Data
@NoArgsConstructor
public class RpcResponse<T> implements Serializable {

    /**
     * 响应对应的请求号
     */
    private String requestId;
    /**
     * 响应状态码
     */
    private Integer statusCode;
    /**
     * 响应状态补充信息
     */
    private String message;
    /**
     * 响应数据
     */
    private T data;

    public static <T> RpcResponse<T> success(T data, String requestId) {
        RpcResponse<T> response = new RpcResponse<>();
        response.setRequestId(requestId);
        response.setStatusCode(ResponseCode.SUCCESS.getCode());
        response.setData(data);
        return response;
    }
    public static <T> RpcResponse<T> fail(ResponseCode code, String requestId) {
        RpcResponse<T> response = new RpcResponse<>();
        response.setRequestId(requestId);
        response.setStatusCode(code.getCode());
        response.setMessage(code.getMessage());
        return response;
    }

}

状态枚举类:

@AllArgsConstructor
@Getter
public enum ResponseCode {
    SUCCESS(200, "调用方法成功"),
    FAIL(500, "调用方法失败"),
    METHOD_NOT_FOUND(500, "未找到指定方法"),
    CLASS_NOT_FOUND(500, "未找到指定类");
    private final int code;
    private final String message;
}

客户端实现(动态代理)

客户端方面,由于在客户端这一侧我们并没有接口的具体实现类,就没有办法直接生成实例对象。这时,我们可以通过动态代理的方式生成实例,并且调用方法时生成需要的RpcRequest对象并且发送给服务端

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

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

相关文章

RSE2021/云检测:基于小波变换和连续多尺度空间注意的上下块深度网络云检测

RSE2021/云检测Deep network based on up and down blocks using wavelet transform and successive multi-scale spatial attention for cloud detection基于小波变换和连续多尺度空间注意的上下块深度网络云检测0.摘要1.概述2.方法3.背景4.实验数据5.我们的方法5.1.UD-NET5.1…

frp内网穿透

文章目录原理如果没有配置ssh&#xff0c;需要先配置ssh免密登录到pc内网穿透流程frp自启动frps自启动frpc自启动原理 1、在公网中转服务器上面搭建FRP服务器。同时&#xff0c;在内网服务器上面安装FRP客户端。 2、按照UP的FRP客户端配置文件进行说明。7000端口是FRP服务端开放…

tk跨境电商好做吗?有什么技巧吗?

最近tiktok大热&#xff0c;不少小伙伴都在蠢蠢欲动了&#xff0c;但他们都在担心tk跨境电商到底好不好做&#xff1f;有什么技巧没有&#xff1f;因为怕耗时耗力最后一场空。这里我们大家就来简单聊聊吧&#xff01; tk跨境电商好做吗&#xff1f; 其实个人认为tk跨境电商现阶…

fork函数相关资源复制问题验证

前言 fork是什么&#xff1f;克隆当前的进程&#xff0c;然后创建一个子进程。本文分几个验证实例代码&#xff0c;主要是为解决验证一些小问题。 一 fork与文件描述符 fork之前打开一个文件的测试。 问题&#xff1a;fork之后&#xff0c;父进程关闭文件&#xff0c;子进程是…

14天学习训练营导师课程-Pygame学习笔记-Part1(环境准备)

14天学习训练营导师课程&#xff1a; 李宁《Python Pygame游戏开发入门与实战》 李宁《计算机视觉OpenCV Python项目实战》1 李宁《计算机视觉OpenCV Python项目实战》2 李宁《计算机视觉OpenCV Python项目实战》3 学习知识点 学习先从环境安装和配置开始&#xff1a; 环境安装…

微积分在金融投资的应用

目 录 摘 要 I ABSTRACT II 1绪论 1 1.1选题背景及意义 1 1.2国内外研究现状 1 1.3微积分发展概述 2 1.3.1微积分学的创立 2 1.3.2微积分诞生的重要意义 3 1.3.3微积分理论内容介绍 3 1.3研究主要内容 4 2微积分在金融投资中的应用 5 2.1导数在金融投资中的应用 5 2.1.1导数在金…

Springboot疫苗接种管理系统-JAVA.JSP【数据库设计、源码、开题报告】

摘 要 预防预接种工作实行网络信息化管理&#xff0c;是我国免疫规划工作发展的需要。接种信息实行网络信息化不仅是预防接种工作步入了一个新的台阶&#xff0c;更重要的是解决了多年疫苗接种过程种&#xff0c;免疫接种剂次不清&#xff0c;难以全程有效接种的问题&#xff…

SpringBoot + openFeign实现远程接口调用

SpringBoot服务之间通过openFeign实现远程接口调用 现在的微服务项目不少都使用的是springbootspring cloud构建的项目&#xff0c;微服务之间的调用都离不开feign来进行远程调用。那么我们一个服务需要调用第三方的服务的时候&#xff0c;我们常常可能使用httpclient或者rest…

正大国际期货:2022正大期货在国际市场热度不减的几点原因

2022年国际期货是金融行业重点关注的对象&#xff0c;从今年市场数据中可以看出&#xff0c;正大国际期货之所以还能一如既往领跑&#xff0c;每年交易量都在递增&#xff0c;和正大后台的实力雄厚&#xff0c;坚守合作互赢的理念重大相关&#xff0c;接下来重点说说正大国际越…

【ML-SVM案例学习】svm实现手写数字识别

文章目录前言一、源码分步解析1.引入库2. 设置属性防止中文乱码3.加载数字图片数据4.获取样本数量&#xff0c;并将图片数据格式化5.模型构建6.测试数据部分实际值和预测值获取7.进行图片展示8.把预测错的值的 x值 y值 和y的预测值取出9.通过enumerate&#xff0c;分别拿出x值 …

Java的三大特性之继承

封装详见&#xff1a;Java的三大特性之封装 多态详见&#xff1a;Java的三大特性之多态 1.认识继承 继承的本质是对某一批类的抽象&#xff0c;从而实现对显示世界更好的建模。 extends “扩展” 子类是父类的扩展&#xff0c;子类继承了父类&#xff0c;就会有父类的全部方法…

强推这款键盘利器(Keychron),这次我彻底入坑了

嗨喽&#xff0c;大家好。还记得我今年五月份的时候&#xff0c;发布了一篇关于自己使用键盘的文章——>程序猿必备键盘推荐&#xff08;Keychron&#xff09;&#xff0c;实用炫酷两不误&#xff0c;这篇文章发布后引起了强烈的反响。身边的同学、朋友&#xff0c;包括一些…

Ubuntu20.4系统隐藏顶栏

注&#xff1a;Ubuntu20.4以上版本安装gnome-tweak-tool可以实现隐藏顶栏了&#xff0c;但20.4还需要安装一下扩展模块&#xff0c;教程如下&#xff1a; 在Ubuntu中有两个扩展工具都支持隐藏顶栏。 1、安装autohidetopbar。 sudo apt install gnome-shell-extension-autohid…

【web】JavaScript——Web APIs笔记小结 dom 样式属性(自定义属性+节点操作部分)

期中考完回来更新了 感觉进度真的好慢T^T&#xff0c;已经摸了快一个月的鱼了qwq&#xff01;&#xff01;&#xff01; 来源&#xff1a;JavaScript基础语法-dom-bom-js-es6新语法-jQuery-数据可视化echarts 目录 ⑦H5自定义属性 V.节点操作 ①节点层级 ※※父级节点 ※…

react事件系统(新老版本)

带着问题阅读探索 React 为什么有自己的事件系统&#xff1f;什么是事件合成 &#xff1f;如何实现的批量更新&#xff1f;事件系统如何模拟冒泡和捕获阶段&#xff1f;如何通过 dom 元素找到与之匹配的fiber&#xff1f;为什么不能用 return false 来阻止事件的默认行为&…

SpringCloudGateway--自动路由映射

目录 一、GateWay项目创建 二、子项目创建 三、测试调用 一、GateWay项目创建 首先启动本地nacos&#xff0c;具体可参考&#xff1a;Nacos Windows安装_雨欲语的博客-CSDN博客 新建工程项目spring_cloud_test,pom引入依赖&#xff1a; <parent><groupId>org.s…

单片机只会调库和复制别人的代码是什么水平?

单片机只会调库和复制别人的代码是什么水平&#xff1f;前言什么是调库&#xff1f;如何不调库点亮一个LED调库与不调库的区别为什么要操作寄存器结语前言 相信对于学习过单片机的同学对于调库这个操作都不陌生&#xff0c;大家都是从调别人的库阶段过来的&#xff0c;今天看到…

便捷记账本小程序+后台管理系统-JAVA【数据库设计、源码、开题报告】

第一章 绪 论 1.1选题背景 互联网是人类的基本需求&#xff0c;特别是在现代社会&#xff0c;个人压力增大&#xff0c;社会运作节奏高&#xff0c;随着互联网的快速发展&#xff0c;用户的需求也越来越高&#xff0c;用户也将越来越多依靠互联网而不是自己获取信息&#xff…

Go:进度条工具库 vbauerster/mpb 简介

文章目录简介核心能力示例单进度条渲染多进度条渲染小结简介 mpb是一个在终端进行进度条渲染的工具库 核心能力 支持多进度条 Multiple Bars: Multiple progress bars are supported支持动态设置进度条总值 Dynamic Total: Set total while bar is running支持动态增加 / 删…

【Unity Shader】屏幕后处理4.0:基于高斯模糊的Bloom

原本打算写高斯模糊和双重模糊两个实现Bloom方法的对比&#xff0c;但两个加在一起篇幅过长&#xff0c;于是拆成两篇文章来进行。 学习前建议应先搞清楚的几个概念 HDRLDRToneMapping几种模糊算法1 高斯模糊实现Bloom 最近一直在学习Unity Shader实现各种后处理效果&#x…