【高性能网关soul学习】15. 插件之sofa实现流程_genericservice.$genericinvoke-程序员宅基地

技术标签: java  Soul  rpc  网关  

【高性能网关soul学习】15. 插件之sofa实现流程

本文目标:

  1. 简单介绍 sofa 插件原理

sofa 插件

sofa 插件作为插件链的一环,处理 sofa 的请求,依次启动各个服务。

根据调用路径获取,SofaPlugin 相关的核心大致流程图:

  1. doExecute:异常情况检查
    1. sofaProxyService.genericInvoker
      1. 根据 metaData.path 去缓存 ApplicationConfigCache 获取或者创建一个 ConsumerConfig
      2. 从ConsumerConfig 中获取一个 GenericService
        1. GenericService 远程的一个服务代理类
      3. sofaParamResolveService.buildParameter :构建请求参数
      4. 设置请求回调函数
        1. new CompletableFuture<>()
        2. RpcInvokeContext.getContext().setResponseCallback( )
      5. genericService.$genericInvoke:调用结果返回
        1. return Mono.fromFuture(future.thenApply(ret -> {})
  2. SofaResponsePlugin: 对结果进行处理,封装为webflux的结果进行返回
    1. WebFluxResultUtils.result
SofaPlugin SofaProxyService AlibabaDubboProxyService ApplicationConfigCache sofaParamResolveService sofa服务 SofaResponsePlugin 泛化调用 获取或请求创建 GenericService 构建请求参数 泛化调用 泛化调用调用结果返回 泛化调用调用结果返回 请求返回的结果封装 SofaPlugin SofaProxyService AlibabaDubboProxyService ApplicationConfigCache sofaParamResolveService sofa服务 SofaResponsePlugin
protected Mono<Void> doExecute(final ServerWebExchange exchange, final SoulPluginChain chain, final SelectorData selector, final RuleData rule) {
    
    String body = exchange.getAttribute(Constants.SOFA_PARAMS);
    SoulContext soulContext = exchange.getAttribute(Constants.CONTEXT);
    assert soulContext != null;
    MetaData metaData = exchange.getAttribute(Constants.META_DATA);
    // 。。。参数检查
  // 泛化调动返回结果
    final Mono<Object> result = sofaProxyService.genericInvoker(body, metaData, exchange);
    return result.then(chain.execute(exchange));
}

public Mono<Object> genericInvoker(final String body, final MetaData metaData, final ServerWebExchange exchange) throws SoulException {
    
  // 从cache中维护和创建 genericService 
  // ...
    GenericService genericService = reference.refer();
  // 构建参数
  // ...
// 设置返回结果回调函数,调用之后结果可以通过future异步获取到
    CompletableFuture<Object> future = new CompletableFuture<>();
    RpcInvokeContext.getContext().setResponseCallback(new SofaResponseCallback<Object>() {
    
    });
  // 泛化调用
    genericService.$genericInvoke(metaData.getMethodName(), pair.getLeft(), pair.getRight());
    return Mono.fromFuture(future.thenApply(ret -> {
    
        // future -> result
        return ret;
    })).onErrorMap(SoulException::new);
}

总结

  • 介绍了 soul 中 sofa 的调用流程,可以发现 soul 实现的该部分的代码和dubbo非常相似。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_33159770/article/details/113449825

智能推荐

java处理rdf文件_Java-使用Jena APi-从RDF文件获取数据-程序员宅基地

文章浏览阅读500次。我的问题与数据类型属性hasFirstName,hasLastName,hasDateOfBirth,hasGender的类Person有关.我正在使用Java和Jena API.这是我的RDF文件中代表一个人的方式.H04/02/1980DS Bruno如果性别是女性,我想在下面写下这一行:[label= \"" +firstName+ " \"\n\n\"D.Naiss:"+dnai1+"\..._java 读取rdf文件 dt: 后面值如何获取

SRM高维特征隐写分析原理与应用_srm隐写分析-程序员宅基地

文章浏览阅读5.2k次,点赞8次,收藏41次。一、SRM简介  SRM(Spatial Rich Model) 为基于空域富模型的隐写分析方法,由Fridrich等人[1] 提出,主要用于空域编码图像的隐写分析,在基于传统的提取手工特征的方式中占据主流地位。SRM采用了多个子模型(sub-model)以提取更多类型的特征,使得能够更好地表征隐写对邻域像素多种相关性的破坏。所谓“子模型”,指的是图像经过特定的滤波后再提取相应特征,由于邻域相关性可以通过局部像素之间的预测误差表示,这里滤波一般指输出这种预测误差的操作,这类误差一般被称为残差(residu_srm隐写分析

spark-shell计算某大学计算机系的成绩_使用 spark-shell 读取数据集 /data/bigfiles/data01.txt 中的内-程序员宅基地

文章浏览阅读3.9k次,点赞4次,收藏37次。数据集Data01.txt如下Aaron,OperatingSystem,100Aaron,Python,50Aaron,ComputerNetwork,30Aaron,Software,94Abbott,DataBase,18Abbott,Python,82Abbott,ComputerNetwork,76Abel,Algorithm,30Abel,DataStructure,38Abel,OperatingSystem,38Abel,ComputerNetwork,92Abrah_使用 spark-shell 读取数据集 /data/bigfiles/data01.txt 中的内容,完成交互式编

Androidx-下-Fragment-懒加载的新实现,新老方案对比,你喜欢哪种呢-_behavior_resume_only_current_fragment-程序员宅基地

文章浏览阅读982次。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-54ROfsN3-1647696809581)(//upload-images.jianshu.io/upload_images/2824145-1567d443a5150d6e.png?imageMogr2/auto-orient/strip|imageView2/2/w/954/format/webp)]观察上图我们可以发现,同级的Fragment_1、Fragment_2、Fragment_3 都调用了 onAttach._behavior_resume_only_current_fragment

Jmeter读取CSV中文显示乱码问题的解决方法_jmeter取csv文件乱码-程序员宅基地

文章浏览阅读5.2k次。和往常测试接口一样,编写脚本,将测试数据写入CSV文件,然后执行,结果,Jmeter读取CSV的中文内容,显示为了乱码。 废话不多说,直接上我遇到问题的解决方案。进入CSV文件配置,在文件字符集中,选择UTF-8【默认是空的】。问题排查思路:1. 发现字段问题后,显示百度了几个原因,大多数的结果都是字符集出现了问题,然后就想着改CSV文件字符集2. 更改的..._jmeter取csv文件乱码

【现代机器人学】学习笔记八:轨迹生成-程序员宅基地

文章浏览阅读3.6k次。本节主要讲述机器人学中的轨迹生成,内容包括:定义,多项式插值,三次多项式与五次多项式,梯形运动,S曲线时间标度,Waypoint规划,时间最优的时间标度,时间标度算法算法。_轨迹生成

随便推点

HF-Net(三)基于NetVLAD及superpoint构建的sfm场景模型的查询图像位姿解算_superpoint netvlad-程序员宅基地

文章浏览阅读2.8k次。参考:HF-Net git地址0.数据准备0.1NetVLAD预训练权重,存放在编译hfnet后生成的$DATA_PATH/weights/路径下0.2aachen数据下载,存放在编译hfnet后生成的$DATA_PATH/路径下0.3基于superpoint生成的aachen三维点云场景0.4aachen数据对应的每张图像相机内参文件1.基于NetVLAD生成aachen所有图像的g..._superpoint netvlad

PGM:概率图模型Graphical Model-程序员宅基地

文章浏览阅读184次。http://blog.csdn.net/pipisorry/article/details/51461878 概率图模型Graphical Models简介 完全通过代数计算来对更加复杂的模型进行建模和求解。然而,我们会发现,使用概率分布的图形表示进行分析很有好处。这种概率分布的图形表示..._graphical models建图

基于机器学习的心脏病预测方法(7)——K最近邻算法(KNN)_heart disease prediction datasetknn算法-程序员宅基地

文章浏览阅读3k次。可以发现,当k=8时,测试集准确率最高,达到68.85%。KNN算法的准确率是: 68.85%_heart disease prediction datasetknn算法

基于java的企业员工信息管理系统的设计与实现_java员工管理系统-程序员宅基地

文章浏览阅读815次。企业员工信息管理系统主要用于实现公司的员工相关信息管理,基本功能包括:密码修改、员工管理、部门管理、出勤管理、工资管理、请假审核、我的请假、我的工资等。本系统结构如下:(1)管理员端密码修改:修改自己的密码。员工管理:对员工的基本信息进行管理,包括查询、删除、录入。部门管理:包括添加部门以及添加子部门,删除部门等操作,便于及时更新部门信息。出勤管理:用于对员工的出勤月份以及天数进行管理,便于计算员工的工资等。工资管理:用于对员工的每个月的工资进行管理,便于对员工的工资进行管理。请假审核:用于管_java员工管理系统

Win32 API 封装类总结_demo_01_createchildwindow.c-程序员宅基地

文章浏览阅读1.1w次,点赞6次,收藏23次。以下是一些封装的Win32 API类;备用;重温WIN32 API ------ 最简单的Windows窗口封装类http://blog.csdn.net/smstong/article/details/423668991 开发语言抉择 1.1 关于开发Win32 程序的语言选择 C还是C++在决定抛弃MFC,而使用纯Win32 API 开发Window桌面_demo_01_createchildwindow.c

数据库简介与MySQL编译安装-程序员宅基地

文章浏览阅读338次,点赞5次,收藏10次。数据库(Database)是一个有组织的数据存储系统,用于有效地存储、检索、管理和维护数据。数据库系统允许用户以结构化的方式存储和操作大量数据,并提供了一种可靠的方法来管理和维护这些数据,以满足不同应用程序和用户的需求。数据库分为关系型与非关系型,关系型数据库是一种基于关系模型的数据库管理系统(DBMS)。在关系型数据库中,数据以表格的形式组织,表格由行和列组成,每一行代表一个数据记录,而每一列代表一个数据字段。关系型数据库的核心思想是将数据组织成易于理解和管理的表格,这些表格之间可以建立关系。

推荐文章

热门文章

相关标签