soul源码阅读(四)Sofa RPC应用示例运行

目录

Sofa RPC简介

Sofa RPC示例运行

soul-examples-sofa代码介绍

启动soul-examples-sofa项目

总结


Sofa RPC简介

Sofa RPC是一个高可扩展性、高性能、生产级的Java RPC框架,由蚂蚁进入开源,和阿里巴巴另外一个比较出名的RPC框架Dubbo类似,其实sofa-rpc提供的dubbo协议最终就是使用的Dubbo的功能(sofa-rpc直接将dubbo的jar引入)。在蚂蚁金服Sofa RPC已经经历了十多年及五代版本以上的发展。Sofa RPC致力于简化应用之间的RPC调用,为应用提供方便透明、稳定高效的点对点远程服务调用方案。为了用户和开发者方便的进行功能扩展,SofaRPC提供了丰富的模型抽象和可扩展接口,包括过滤器、路由、负载均衡等等。同时围绕Sofa RPC框架及其周边组件提供丰富的微服务治理方案。

功能热性如下:

  • 透明化、高性能的远程服务调用
  • 支持多种服务路由及负载均衡策略
  • 支持多种注册中心的集成
  • 支持多种协议,包括 Bolt、Rest、Dubbo 等
  • 支持同步、单向、回调、泛化等多种调用方式
  • 支持集群容错、服务预热、自动故障隔离
  • 强大的扩展功能,可以按需扩展各个功能组件

Sofa RPC示例运行

soul-examples-sofa代码介绍

和上一篇介绍dubbo示例运行的博客类似哈,这里就不做过多的介绍,留点篇幅做进一步的源码介绍。参考地址:https://blog.csdn.net/he_cha_bu/article/details/112714699。

启动soul-examples-sofa项目

run TestSofaApplication,运行结果如下,看到sofa client register success注册成功,sofa后台业务服务已正常运行

soul源码阅读(四)Sofa RPC应用示例运行_第1张图片

打开soul-admin,看到Sofa插件选择器也已正常注册,同时做下配置打开sofa插件,截图如下:

soul源码阅读(四)Sofa RPC应用示例运行_第2张图片

soul源码阅读(四)Sofa RPC应用示例运行_第3张图片

打开idea rest client发送/sofa/findById请求,报NullPointerException

soul源码阅读(四)Sofa RPC应用示例运行_第4张图片

与前两次一样,怀疑是打开插件后,加载有点问题,在soul-admin的sofa页面将选择器删除,依次重启,admin>test sofa->bootstrap,不幸运的是,这次是重启test sofa就报了一个错误了,错误截图如下:

soul源码阅读(四)Sofa RPC应用示例运行_第5张图片

点开查看报错的at org.dromara.soul.admin.service.impl.SoulClientRegisterServiceImpl.registerSofa,debug后发现红框处的查询返回报错,此时dto.getServiceName()为org.dromara.soul.examples.dubbo.api.service.DubboTestService,dto.getMethodName()为insert,发现库里已存在两条记录,分别为dubbo和sofa的,截图如下:

soul源码阅读(四)Sofa RPC应用示例运行_第6张图片

soul源码阅读(四)Sofa RPC应用示例运行_第7张图片

那么问题来了,页面删除是删了啥?不会删除元数据吗?然后一通去了解了下页面的东西,发现都是js,跟原来自己用的vue的框架还是有点区别,没太看懂,这里大家先借鉴看下https://www.jianshu.com/p/ff4ab0888672。

先处理示例能够正常启动先,我们后台将meta_data的dubbo和sofa示例给删除,再次启动test-sofa,正常运行,接口也正常注册到soul-admin。

再次运行,soul-bootstrap,正常运行,rest client请求sofa/findById,还是报空指针异常,检查页面怀疑,相关配置都是没有问题的,那么就debug看看吧,在 SofaProxyService 的 genericInvoker() 里, findById 走了以下代码的逻辑,进入了一个需要传参数,走的下面的逻辑,发现到sofaParamResolveService竟然为null,然后就报了错误日志中看到的空指针异常了,罪魁祸首找到了,那么为什么它是空呢?

soul源码阅读(四)Sofa RPC应用示例运行_第8张图片

继续去找 sofaParamResolveService 赋值的地方,发现 SofaPluginConfiguration 里面,注册 sofaPlugin bean 的时候会把这个 service 加进去,在这个地方加入sofaParamResolveService的时候,就已经是空了

soul源码阅读(四)Sofa RPC应用示例运行_第9张图片

soul源码阅读(四)Sofa RPC应用示例运行_第10张图片

再继续往前,发现并无注册该bean的代码,那估计是源码并未实现了。参考 AlibabaDubboPluginConfiguration的参数类,发现有默认DefaultDubboParamResolveService实现,在 DefaultDubboParamResolveService(soul-web 模块) 那里加了个 DefaultSofaParamResolveService,并注入spring容器管理后,再次启动soul-bootstrap,访问findById,再次报错,截图如下:

soul源码阅读(四)Sofa RPC应用示例运行_第11张图片

debug查看,p.subscribe后报错,网上搜了下应该是参数转换出错

soul源码阅读(四)Sofa RPC应用示例运行_第12张图片

参考官方已提交的该漏洞修复记录https://github.com/dromara/soul/compare/master@%7B1day%7D...master,修改如下:

soul源码阅读(四)Sofa RPC应用示例运行_第13张图片

在参数为1的时候加一个特殊处理转换,再次重启后,rest client请求结果终于返回成功:

到此告一段落了。

这里感谢下https://blog.csdn.net/baidu_27627251/article/details/112726694博客和作者,是站在了“巨人的肩膀上”继续发现处理问题的。

总结

随着soul框架的逐渐熟悉,咱们将不断深入了解源码的实现,这次Sofa RPC的问题处理,就开了个头,咱们下面继续。

你可能感兴趣的:(框架,java,spring,网关)