手动实现简易版RPC(三)

news2024/11/23 3:03:10

手动实现简易版RPC(三)

往期内容

  • 手动实现简易版RPC(一):RPC简介及系统架构

  • 手动实现简易版RPC(二):简单RPC框架实现

前言

接上两篇博客我们实现了最简易RPC框架,接下来的几期重点在简易版的rpc框架上继续深耕。本文主要介绍简易版RPC 中mock假数据相关的内容。


RPC(Remote Procedure Call)框架的核心在于通过网络实现远程过程调用,使得调用远程服务如同调用本地服务一样方便。但是在实际开发中,可能在调用远程过程中不会特别的顺利,会遇到一些不可控的问题,比如网络不通?服务不稳定等不可预测的问题。

那么为了保证我们这边的开发顺利性,可能会使用mock这一服务来模拟远程返回的数据,进行更好的业务联调。

什么是mock?

简单介绍一下mock

"MOCK"通常指的是创建一个模拟的对象或功能,以替代实际的对象或功能,从而进行测试或其他操作。这样做的主要目的是隔离测试环境,使其只关注被测试的部分,而不受其他依赖项的影响。通过使用MOCK,开发者或测试人员可以模拟外部系统、数据库、网络请求或其他难以直接控制的依赖项,从而更容易地控制测试环境,确保测试的准确性和可靠性。

举个🌰

public class CatServiceImpl {
   void test(){
       doSomething();
       CatService.getCat();
       doSomething();
   }
}

在上述代码中,如果CatService.getCat()尚未开发完成或者由于一些不可控原因调不通,那么在测试这段代码的时候,整个流程是走不通的,只能注释掉CatService.getCat()这个方法。而mock的作用是能够模拟出一个CatService并调用它的getCat()方法。这样一来的话,可以比较顺了的跑通整个流程。

为什么支持mock?

虽然 mock 服务并不是 RPC 框架的核心能力,但是它的开发成本并不高。而且给 RPC 框架支持 mock后,开发者就可以轻松调用服务接口、跑通业务流程,不必依赖真实的远程服务,提高使用体验,何乐而不为呢?

我们希望能够用最简单的方式 – 比如一个配置,就让开发者使用 mock 服务。

设计方案

上文也讲到了mock旨在创建一个模拟对象,供调用方使用。

但是怎么调用产生一个模拟对象呢?

在这里插入图片描述

仔细想想,是不是可以通过动态代理的方式,产生一个对象,在调用方调用该对象的时候,返回一个固定的返回值,这样是不是就🆗了?

具体实现

1- 我们实现mock是可配置的,通过读取配置信息来获取用户是否开启mock。在之前的RpcConf中添加一个mock属性

....
 /***
     * 是否开启模拟数据模式
     * 默认不开启mock
     */
    private boolean mock = false;

2-在proxy包中添加MockServiceProxy类,用于生成mock模拟服务。其中通过自定义方法getDefaultObject根据方法返回值的类型进行默认值的返回,比如返回值类型为 int的方法,默认返回0,返回值为boolean的方法返回值默认为false。

/**
 * @version 1.0
 * @Author jerryLau
 * @Date 2024/4/12 15:42
 * @注释 MockServiceProxy 类
 * 采用JDK动态代理
 * 开启Mock服务代理
 */
@Slf4j
public class MockServiceProxy implements InvocationHandler {
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        Class<?> returnType = method.getReturnType();
        log.info("MockServiceProxy invoke method: {}, returnType: {}", method.getName(), returnType.getName());

        return getDefaultObject(returnType);
    }


    /***
     * 根据返回类型返回默认值
     * @param returnType
     * @return
     */
    public Object getDefaultObject(Class<?> returnType) {
        log.info("MockServiceProxy getDefaultObject returnType: {}", returnType.getName());
        if (returnType == int.class) {
            return 0;
        } else if (returnType == long.class) {
            return 0L;
        } else if (returnType == double.class) {     // double 类型默认值是 0.0
            return 0.0;
        } else if (returnType == boolean.class) {
            return false;        // boolean 类型默认值是 false
        } else if (returnType == Short.class) {
            return (short) 0;
        }
        //对象返回null
        return null;
    }
}

3-在代理工厂类ServiceProxyFactory中添加关于mock的判定以及返回一个mock代理对象,通过获取配置管理器中用户是否开启了mock,如果开启了mock,则返回一个mock代理对象。

//配置管理器中是否开启Mock模式
        if (RPCGlobalConfHolder.getRpcConfig().isMock()) {
            return (T) getMockProxy(serviceClass);
        }

/***
     * get mock proxy
     * @param serviceClass
     * @return
     * @param <T>
     */
    public static <T> T getMockProxy(Class<T> serviceClass) {
        return (T) Proxy.newProxyInstance(
                serviceClass.getClassLoader(),
                new Class[]{serviceClass}
                , new MockServiceProxy()
        );
    }

简单测试

上述过程简单实现了mock的自定义配置,接下来我们可以简单的进行测试。

1-将example-common模块中的获取cat接口中添加一个默认方法getCatCount,用于获取猫的数量

/**
     * 获取猫咪数量
     * @return
     */
    default int getCatCount() {
        return 100;
    }

在默认不开启mock的情况下,在example-consumerEasyConsumer简单消费者中调用获取猫咪数量的方法

在默认不开启mock的时候,可以看到获取到的猫咪数量是默认的数量100

在这里插入图片描述

修改application.yml文件 配置mock属性为 true,开启mock

RPC:
  name: "ape-rpc1"
  serverPort: 8080
  version: "1.0.0"
  serverHost: "localhost233"
  mock: true

在此运行消费者程序,发现获取到的猫咪的数量是0,而不是100,说明mock生效。

在这里插入图片描述


至此,我们实现了简易版的PRC框架中的mock功能

码字不易,希望大家能够一键三连🌝⭐🌟


代码仓库 ape-rpc: 轮子项目,手动实现rpc github🌐 || ape-rpc: 轮子项目,手动实现rpc gitee🌐

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

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

相关文章

深入解析C#特殊字符:概念、分类与使用方法

文章目录 前言一、特殊字符的定义二、特殊字符的分类与作用1.转义字符2. 格式字符3. 逻辑运算符4. 运算符5. 字符串6. 注释 三、$&#xff1a;字符串内插&#xff08;String Interpolation&#xff09;四、&#xff1a;逐字字符串&#xff08;Verbatim Strings&#xff09;五、…

ai绘画的今天,新人还能入行吗?

现在24年了&#xff0c;大趋势已经很明显&#xff0c;ai绘画现阶段处于如日中天的时候&#xff0c;无论是绘画&#xff0c;电商&#xff0c;小说推文。等等一系列的行业都能用到ai绘画&#xff01; 说明一下&#xff0c;我自己就是23年初偶然间刷到了ai绘画这个赛道&#xff0c…

SpringDI方式及Redis应用场景的分享

1、为什么Spring和IDEA 都不推荐使用 Autowired 注解 大家在使用IDEA开发的时候有没有注意到过一个提示&#xff0c;在字段上使用Spring的依赖注入注解Autowired后会出现如下警告Field injection is not recommended (字段注入是不被推荐的)&#xff1b;但是使用Resource却不会…

Git笔记-常用指令

Git笔记-常用指令 一、概述二、仓库管理二、缓存区操作1. 添加文件到缓存区2. 取消缓存文件3. 忽略列表 三、日志状态信息四、分支操作五、六、 一、概述 这里记录一些git常用的指令。 二、仓库管理 # 本地仓库初始化 git init# 克隆仓库 git clone git_url # git clone ht…

wordpress子比主题给文章内容加上密码查看

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么?二、使用步骤1.引入库2.读入数据第三步:文章内添加代码前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,…

三维重建(SFM)与实时定位建图(SLAM)的区分与联系

1、SLAM SLAM是Simultaneous Location and Mapping&#xff0c;同时定位与地图构建。是指搭载特定传感器的主体&#xff0c;在没有环境先验信息的情况下&#xff0c;于运动过程中建立环境的模型&#xff0c;同时估计自己的运动。目的是解决自主机器人“定位”和“建图”两个问题…

Spring JdbcTemplate使用临时表+事务会话管理实现数据新增、查询及自动清除功能

需求描述&#xff1a; 由于某些情况下当查询过滤参数过大时&#xff0c;执行sql由于参数过大而报错&#xff0c;此时 需要使用临时表的方式&#xff0c;即 当参数超过某个阀值&#xff08;如 1000&#xff0c;可调整&#xff09;新增一张临时表&#xff0c;将原表 与 该临时表进…

Vue3+vite优化基础架构(3)--- 优化vue-i18n国际化配置

Vue3vite优化基础架构&#xff08;3&#xff09;--- 优化vue-i18n国际化配置 说明全部页面进行中英文使用测试中英文切换对ElementPlus里面的所有组件进行中英文切换 说明 这里记录下自己在Vue3vite的项目增加全局中英文切换按钮对页面进行中英文切换及同时对ElementPlus里面的…

stm32单片机开发五、I2C通信

I2C这部分的时序单元可以看我另外一篇博客I2C基本知识 I2C发送数据时是高位先行&#xff0c;也就是先发送高位的&#xff0c;比如一个字节有8位B0-B7&#xff0c;先发送B7高位 I2C用的是同步时序&#xff0c;它有一个好处&#xff0c;比如传输过程中&#xff0c;出现了中断&…

深度学习之基于Pytorch姿态估计的仰卧起坐计数系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 仰卧起坐作为一种常见的健身动作&#xff0c;被广泛用于腹部肌肉的锻炼。然而&#xff0c;对于仰卧起…

(四)机器学习在银行中的典型应用场景(模型) #CDA学习打卡

本文总结了机器学习在银行中的典型业务应用场景&#xff0c;包括客户管理、零售智能营销、公司智能营销、自然语言处理、运营管理以及图像识别。

智慧园区sip对讲广播解决方案

智慧园区sip对讲广播解决方案18123651365 目前而言智慧园区管理者主要需要解决的问题是&#xff1a; 1.面对庞大的园区小区规模&#xff0c;能源管理全部依赖人工已经无法实现&#xff1b; 2.节能管理工作难度大&#xff0c;面对问题&#xff0c;没有好的解决方案&#xff1b; …

pyqt6的安装,使用-1

pyqt6安装的话&#xff0c;在自己所用的环境里安就可以&#xff0c;之前写有yolov5,yolov8的环境配置&#xff0c;python3.8的我安装就没有问题&#xff0c;打开anaconda&#xff0c;激活自己的环境 把这复制进去 pip install pyqt6 pip install pyqt6-tools 这个安装完了之后…

【JavaWeb】网上蛋糕项目商城-关键字搜索,购物车以及商品详情功能

概念 上文中已经实现热销和新品的商品列表功能&#xff0c;本文篇幅中实现关键字搜索商品&#xff0c;将商品加入购物车&#xff0c;以及查看商品的详情信息等功能 关键字搜索实现步骤 在head.jsp头部页面中&#xff0c;鼠标移动至搜索图标会显示隐藏的搜索框进行输入关键信…

数据结构(C):玩转链表

&#x1f37a;0.前言 言C之言&#xff0c;聊C之识&#xff0c;以C会友&#xff0c;共向远方。各位博友的各位你们好啊&#xff0c;这里是持续分享数据结构知识的小赵同学&#xff0c;今天要分享的数据结构知识是链表&#xff0c;在这一章&#xff0c;小赵将会向大家展开聊聊链表…

c语言排序算法之八(桶排序)

前言 以下内容是被验证可以有效理解桶排序&#xff0c;代码也较容易理解。如果你发现还有很多需要增加的&#xff0c;欢迎留言。 为什么要单独写排序算法这一系列&#xff0c;看过一些贴子普遍篇幅较长。看完依旧难以直观理解原理及整个过程。代码永远是基于理解的基础上才能…

Carla基础 | Carla预编译版安装与ROS联合仿真图文教程

目录 1 什么是Carla&#xff1f;2 Carla预编译版安装2.1 独立显卡配置2.2 安装ROS2.3 启动虚拟环境2.4 安装Carla预编译版2.5 安装carla-ros-bridge 3 测试案例常见问题 1 什么是Carla&#xff1f; Carla是由西班牙巴塞罗那自治大学计算机视觉中心指导开发的开源仿真模拟器&…

Redis-五大数据类型-Set(集合)

五大数据类型-Set&#xff08;集合&#xff09; 简介 与List类似是一个列表功能&#xff0c;但Set是自动排重的&#xff0c;当需要存储一个列表数据&#xff0c;又不希望出现重复数据时&#xff0c;Set是一个很好的选择。 Set是String类型的无序集合&#xff0c;它底层其实是…

学生宿舍智能电表系统改造升级意义

石家庄光大远通电气有限公司学生宿舍智能电表控制系统改造升级功能与意义** 一、实时监测 宿舍智能电表控制系统具备实时监测功能&#xff0c;能够实时收集、记录和分析每个宿舍的用电数据。这种监测不仅可以帮助管理者掌握用电情况&#xff0c;还可以为用户提供详细的用电报…

重生奇迹mu魔剑士怎么转职

重生奇迹MU中的魔剑士怎么才可以转职? 随便建个角色升级到220级&#xff0c;然后小退重建就有魔剑士了。另外魔剑不用二转。400的三转和其他职业一样。 战士不能转魔剑的。当帐号中已经拥有一位等级超过220级以上的角色时&#xff0c;才可以创造职业为魔剑士的新角色。 魔剑…