### 带着问题读源码系列之Dubbo插件

像往常一样启动 【soul-admin】 和 【soul-bootstrap】 。

因为dubbo需要依赖zookeeper, 需要需要启动一个监听在 localhost:2181 的zookeeper组件。

然后使用 【soul-examples-apache-dubbo-service】中的 org.dromara.soul.examples.apache.dubbo.service.TestApacheDubboApplication 来注册服务。

这是就可以打开 管理界面 查看dubbo插件的信息。发现已经注册完毕了。

然后使用soul提供的http请求访问

curl http://localhost:9195/dubbo/findAll{"code":-107,"message":"Can not find selector, please check your configuration!","data":null}%

这里报得是找不到选择器,再查看日志:

java.lang.IllegalStateException: No such application config! Please add <dubbo:application name="..." /> to your spring config.

at com.alibaba.dubbo.config.AbstractInterfaceConfig.checkApplication(AbstractInterfaceConfig.java:145) ~[dubbo-2.6.5.jar:2.6.5]

at com.alibaba.dubbo.config.ReferenceConfig.init(ReferenceConfig.java:278) ~[dubbo-2.6.5.jar:2.6.5]

at com.alibaba.dubbo.config.ReferenceConfig.get(ReferenceConfig.java:163) ~[dubbo-2.6.5.jar:2.6.5]

at org.dromara.soul.plugin.alibaba.dubbo.cache.ApplicationConfigCache.build(ApplicationConfigCache.java:166) ~[classes/:na]

at org.dromara.soul.plugin.alibaba.dubbo.cache.ApplicationConfigCache.initRef(ApplicationConfigCache.java:130) ~[classes/:na]

at org.dromara.soul.plugin.alibaba.dubbo.subscriber.AlibabaDubboMetaDataSubscriber.onSubscribe(AlibabaDubboMetaDataSubscriber.java:43) ~[classes/:na]

at org.dromara.soul.plugin.sync.data.weboscket.handler.MetaDataHandler.lambda$null$0(MetaDataHandler.java:42) ~[classes/:na]

at java.util.ArrayList.forEach(ArrayList.java:1257) ~[na:1.8.0_201]

at org.dromara.soul.plugin.sync.data.weboscket.handler.MetaDataHandler.lambda$doRefresh$1(MetaDataHandler.java:42) ~[classes/:na]

at java.util.ArrayList.forEach(ArrayList.java:1257) ~[na:1.8.0_201]

at org.dromara.soul.plugin.sync.data.weboscket.handler.MetaDataHandler.doRefresh(MetaDataHandler.java:42) ~[classes/:na]

at org.dromara.soul.plugin.sync.data.weboscket.handler.AbstractDataHandler.handle(AbstractDataHandler.java:68) ~[classes/:na]

at org.dromara.soul.plugin.sync.data.weboscket.handler.WebsocketDataHandler.executor(WebsocketDataHandler.java:61) ~[classes/:na]

at org.dromara.soul.plugin.sync.data.weboscket.client.SoulWebsocketClient.handleResult(SoulWebsocketClient.java:87) ~[classes/:na]

at org.dromara.soul.plugin.sync.data.weboscket.client.SoulWebsocketClient.onMessage(SoulWebsocketClient.java:68) ~[classes/:na]

at org.java_websocket.client.WebSocketClient.onWebsocketMessage(WebSocketClient.java:591) [Java-WebSocket-1.5.0.jar:na]

at org.java_websocket.drafts.Draft_6455.processFrameText(Draft_6455.java:885) [Java-WebSocket-1.5.0.jar:na]

at org.java_websocket.drafts.Draft_6455.processFrame(Draft_6455.java:819) [Java-WebSocket-1.5.0.jar:na]

at org.java_websocket.WebSocketImpl.decodeFrames(WebSocketImpl.java:379) [Java-WebSocket-1.5.0.jar:na]

at org.java_websocket.WebSocketImpl.decode(WebSocketImpl.java:216) [Java-WebSocket-1.5.0.jar:na]

at org.java_websocket.client.WebSocketClient.run(WebSocketClient.java:508) [Java-WebSocket-1.5.0.jar:na]

at java.lang.Thread.run(Thread.java:748) [na:1.8.0_201]

> 2021-01-16 08:30:17.149 INFO 6397 --- [ main] o.s.b.web.embedded.netty.NettyWebServer : Netty started on port(s): 9195

> 2021-01-16 08:30:17.152 INFO 6397 --- [ main] o.d.s.b.SoulBootstrapApplication : Started SoulBootstrapApplication in 3.704 seconds (JVM running for 4.3)

> 2021-01-16 08:30:26.271 INFO 6397 --- [ocket-connect-1] o.d.s.p.s.d.w.WebsocketSyncDataService : websocket reconnect is successful.....

> 2021-01-16 08:30:26.612 ERROR 6397 --- [-work-threads-1] o.d.soul.plugin.base.utils.CheckUtils : can not match selector data: divide

这里日志现实dubbo服务就没有注册上来,说明dubbo插件没有启动成功,通过查看插件管理,发现dubbo插件没有开启,手动开启后。然后调用:

curl http://127.0.0.1:9195/dubbo/findAll{"code":200,"message":"Access to success!","data":{"name":"hello world Soul Apache, findAll","id":"-721302769"}}%

如此调用成功。

通过example的列子,可以将soul网关dubbo插件的使用分为如下过程:

1. 在提供者处添加依赖

<dependencies><dependency><groupId>org.dromara</groupId><artifactId>soul-spring-boot-starter-client-apache-dubbo</artifactId><version>${soul.version}</version></dependency><dependency><groupId>org.dromara</groupId><artifactId>soul-examples-dubbo-api</artifactId></dependency><!--spring boot的核心启动器--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--aop支持--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><!--自动配置--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId></dependency><!-- Dubbo dependency --><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo</artifactId><version>${apache.dubbo.version}</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-registry-nacos --><!-- Dubbo Nacos registry dependency --><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-registry-nacos</artifactId><version>${apache.dubbo.version}</version></dependency><!-- Keep latest Nacos client version --><dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId><version>${nacos-client.version}</version></dependency><dependency><groupId>org.apache.curator</groupId><artifactId>curator-client</artifactId><version>${curator.version}</version></dependency><dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>${curator.version}</version></dependency><dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>${curator.version}</version></dependency><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>${zookeeper.version}</version><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId></exclusion><exclusion><groupId>log4j</groupId><artifactId>log4j</artifactId></exclusion></exclusions></dependency>
</dependencies>

2. 添加dubbo配置文件

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsd"><dubbo:application name="test-dubbo-service"/><dubbo:registry address="zookeeper://localhost:2181"/><dubbo:protocol name="dubbo" port="20888"/><dubbo:service timeout="10000" interface="org.dromara.soul.examples.dubbo.api.service.DubboTestService" ref="dubboTestService"/><dubbo:service timeout="10000" interface="org.dromara.soul.examples.dubbo.api.service.DubboMultiParamService" ref="dubboMultiParamService"/>
</beans>

3. 在application.yml添加配置

soul:dubbo:# soul-admin地址adminUrl: http://localhost:9095# 匹配的url前缀contextPath: /dubboappName: dubbo    

下面阅读Soul的 DubboPlugin 的代码

public class ApacheDubboPlugin extends AbstractSoulPlugin {private final ApacheDubboProxyService dubboProxyService;/*** Instantiates a new Dubbo plugin.** @param dubboProxyService the dubbo proxy service*/public ApacheDubboPlugin(final ApacheDubboProxyService dubboProxyService) {this.dubboProxyService = dubboProxyService;}@Overrideprotected Mono<Void> doExecute(final ServerWebExchange exchange, final SoulPluginChain chain, final SelectorData selector, final RuleData rule) {String body = exchange.getAttribute(Constants.DUBBO_PARAMS); // 获取dubbo的请求SoulContext soulContext = exchange.getAttribute(Constants.CONTEXT); // 获取soul上下文assert soulContext != null;MetaData metaData = exchange.getAttribute(Constants.META_DATA); // 获取元数据if (!checkMetaData(metaData)) {assert metaData != null;log.error(" path is :{}, meta data have error.... {}", soulContext.getPath(), metaData.toString());exchange.getResponse().setStatusCode(HttpStatus.INTERNAL_SERVER_ERROR);Object error = SoulResultWrap.error(SoulResultEnum.META_DATA_ERROR.getCode(), SoulResultEnum.META_DATA_ERROR.getMsg(), null);return WebFluxResultUtils.result(exchange, error);}if (StringUtils.isNoneBlank(metaData.getParameterTypes()) && StringUtils.isBlank(body)) { // 判断请求合法性exchange.getResponse().setStatusCode(HttpStatus.INTERNAL_SERVER_ERROR);Object error = SoulResultWrap.error(SoulResultEnum.DUBBO_HAVE_BODY_PARAM.getCode(), SoulResultEnum.DUBBO_HAVE_BODY_PARAM.getMsg(), null);return WebFluxResultUtils.result(exchange, error);}final Mono<Object> result = dubboProxyService.genericInvoker(body, metaData, exchange);return result.then(chain.execute(exchange));}/*** acquire plugin name.** @return plugin name.*/@Overridepublic String named() {return PluginEnum.DUBBO.getName();}/*** plugin is execute.** @param exchange the current server exchange* @return default false.*/@Overridepublic Boolean skip(final ServerWebExchange exchange) {final SoulContext soulContext = exchange.getAttribute(Constants.CONTEXT);assert soulContext != null;return !Objects.equals(soulContext.getRpcType(), RpcTypeEnum.DUBBO.getName());}@Overridepublic int getOrder() {return PluginEnum.DUBBO.getCode();}private boolean checkMetaData(final MetaData metaData) {return null != metaData && !StringUtils.isBlank(metaData.getMethodName()) && !StringUtils.isBlank(metaData.getServiceName());}
}

带着问题读源码-soul(2021-01-16)相关推荐

  1. 带着问题读源码-soul(2021-01-15)

    带着问题读源码系列-soul的本地服务筛选 在上一期中,了解到soul的http请求是通过dividePlugin插件完成对本地服务的筛选. 总体来说,可以分为两步: 1. 选出符合调用要求的服务列表 ...

  2. 带着问题读源码-soul(2021-01-14)

    下载编译 git clone git@github.com:dromara/soul.gitcd soulmvn clean package install -Dmaven.test.skip=tru ...

  3. 夜读源码,带你探究 Go 语言的iota

    Go 语言的 iota 怎么说呢,感觉像枚举,又有点不像枚举,它的底层是什么样的,用哪个姿势使用才算正规,今天转载一篇「Go夜读」社区上分享的文章,咱们一起学习下.Go 夜读,带你每页读源码~!  这 ...

  4. myisam怎么读_耗时半年,我成功“逆袭”,拿下美团offer(刷面试题+读源码+项目准备)...

    欢迎关注专栏[以架构赢天下]--每天持续分享Java相关知识点 以架构赢天下​zhuanlan.zhihu.com 以架构赢天下--持续分享Java相关知识点 每篇文章首发此专栏 欢迎各路Java程序 ...

  5. 微信读书vscode插件_跟我一起读源码 – 如何阅读开源代码

    阅读是最好的老师 在学习和提升编程技术的时候,通过阅读高质量的源码,来学习专家写的高质量的代码,是一种非常有效的提升自我的方式.程序员群体是一群乐于分享的群体,因此在互联网上有大量的高质量开源项目,阅 ...

  6. 手把手带你阅读Mybatis源码(三)缓存篇

    点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 前言 大家好,这一篇文章是MyBatis系列的最后一篇文章,前面两篇文章:手把手带你阅读M ...

  7. (建议收藏)第一人称视角带你走进 Vue 源码世界

    点击上方关注 前端技术江湖,一起学习,天天进步 前言 本文不引战,成熟的人应该脱离框架的范畴,而不是纠结谁更好或者谁更不好.有道是黑猫白猫,抓到老鼠就是好猫. 所以本文会带大家读源码.简单易懂,大佬小 ...

  8. 「建议收藏」第一人称视角带你走进 Vue 源码世界

    前言 本文不引战,成熟的人应该脱离框架的范畴,而不是纠结谁更好或者谁更不好.有道是黑猫白猫,抓到老鼠就是好猫. 所以本文会带大家读源码.简单易懂,大佬小白都能看明白.并收获益处. 从 new 一个 V ...

  9. 京东CTO的笔记23种设计模式和5大读源码方法...!网友:这次稳了...

    大家都知道源码框架有23个设计模式,但是我们大多停留在概念层面,真实开发中很少应用到,也不知道如何落地!!!那有没有办法解决了? 我整理了 Mybatis 和 Spring 源码中使用了大量的设计模式 ...

最新文章

  1. pfSense修改PPPoE拨号总数
  2. C语言再学习 -- printf、scanf占位符
  3. swf获取当前页面的路径
  4. androidtabhost缓存_FragmentTabHost布局的使用及优化方式
  5. CentOS7下分布式文件系统FastDFS的安装 配置 (单节点)
  6. 阿里巴巴飞天大数据架构体系与Hadoop生态系统
  7. python matplotlib 绘制曲线图,柱状图
  8. 第四章 ---- 事务RedisTemplate
  9. 深度学习之卷积、全连接、反卷积等
  10. linux awk使用详解
  11. asp.net get set用法
  12. JAVA回文数代码getReverse_java判断回文数示例分享
  13. 猿创征文|程序猿乘风破浪 Python Pygame 原创小游戏【源码+解析】
  14. python打开autocad软件_利用Python自动化操作AutoCAD的实现
  15. XML的四种解析方式
  16. 阿拉伯数字转中文数字(大写或小写)
  17. 20145322 Exp5 MS08_067漏洞测试
  18. 别踩白块儿游戏c语言代码,Arduino 模拟“别踩白块儿”游戏
  19. 农村土地确权之调查公示 —— 地块分布图制作说明
  20. 酷家乐怎样把两个方案合并_两个地产科技的理工男联姻:他们都想做一家云端的Autodesk...

热门文章

  1. 关于PWM,SPWM,SVPWM的整理
  2. selenium用jquery改变元素属性
  3. Hive记录-Hive常用命令操作
  4. 基于Python,OpenCV,Numpy和Albumentations实现目标检测的合成数据集
  5. 2018年8月1日每日安全快讯 | 数十万酷视网络摄像头存在高危风险,可导致视频泄露
  6. Unity3d操作的一些技巧知识点和BUG解决方案
  7. 推荐几个值得关注的编程公众号
  8. C语言中特殊浮点数:-1.#IND00和NAN
  9. JS 文件压缩与反压缩
  10. 周末愉快:洗碗就是洗碗