带着问题读源码-soul(2021-01-16)
### 带着问题读源码系列之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)相关推荐
- 带着问题读源码-soul(2021-01-15)
带着问题读源码系列-soul的本地服务筛选 在上一期中,了解到soul的http请求是通过dividePlugin插件完成对本地服务的筛选. 总体来说,可以分为两步: 1. 选出符合调用要求的服务列表 ...
- 带着问题读源码-soul(2021-01-14)
下载编译 git clone git@github.com:dromara/soul.gitcd soulmvn clean package install -Dmaven.test.skip=tru ...
- 夜读源码,带你探究 Go 语言的iota
Go 语言的 iota 怎么说呢,感觉像枚举,又有点不像枚举,它的底层是什么样的,用哪个姿势使用才算正规,今天转载一篇「Go夜读」社区上分享的文章,咱们一起学习下.Go 夜读,带你每页读源码~! 这 ...
- myisam怎么读_耗时半年,我成功“逆袭”,拿下美团offer(刷面试题+读源码+项目准备)...
欢迎关注专栏[以架构赢天下]--每天持续分享Java相关知识点 以架构赢天下zhuanlan.zhihu.com 以架构赢天下--持续分享Java相关知识点 每篇文章首发此专栏 欢迎各路Java程序 ...
- 微信读书vscode插件_跟我一起读源码 – 如何阅读开源代码
阅读是最好的老师 在学习和提升编程技术的时候,通过阅读高质量的源码,来学习专家写的高质量的代码,是一种非常有效的提升自我的方式.程序员群体是一群乐于分享的群体,因此在互联网上有大量的高质量开源项目,阅 ...
- 手把手带你阅读Mybatis源码(三)缓存篇
点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 前言 大家好,这一篇文章是MyBatis系列的最后一篇文章,前面两篇文章:手把手带你阅读M ...
- (建议收藏)第一人称视角带你走进 Vue 源码世界
点击上方关注 前端技术江湖,一起学习,天天进步 前言 本文不引战,成熟的人应该脱离框架的范畴,而不是纠结谁更好或者谁更不好.有道是黑猫白猫,抓到老鼠就是好猫. 所以本文会带大家读源码.简单易懂,大佬小 ...
- 「建议收藏」第一人称视角带你走进 Vue 源码世界
前言 本文不引战,成熟的人应该脱离框架的范畴,而不是纠结谁更好或者谁更不好.有道是黑猫白猫,抓到老鼠就是好猫. 所以本文会带大家读源码.简单易懂,大佬小白都能看明白.并收获益处. 从 new 一个 V ...
- 京东CTO的笔记23种设计模式和5大读源码方法...!网友:这次稳了...
大家都知道源码框架有23个设计模式,但是我们大多停留在概念层面,真实开发中很少应用到,也不知道如何落地!!!那有没有办法解决了? 我整理了 Mybatis 和 Spring 源码中使用了大量的设计模式 ...
最新文章
- pfSense修改PPPoE拨号总数
- C语言再学习 -- printf、scanf占位符
- swf获取当前页面的路径
- androidtabhost缓存_FragmentTabHost布局的使用及优化方式
- CentOS7下分布式文件系统FastDFS的安装 配置 (单节点)
- 阿里巴巴飞天大数据架构体系与Hadoop生态系统
- python matplotlib 绘制曲线图,柱状图
- 第四章 ---- 事务RedisTemplate
- 深度学习之卷积、全连接、反卷积等
- linux awk使用详解
- asp.net get set用法
- JAVA回文数代码getReverse_java判断回文数示例分享
- 猿创征文|程序猿乘风破浪 Python Pygame 原创小游戏【源码+解析】
- python打开autocad软件_利用Python自动化操作AutoCAD的实现
- XML的四种解析方式
- 阿拉伯数字转中文数字(大写或小写)
- 20145322 Exp5 MS08_067漏洞测试
- 别踩白块儿游戏c语言代码,Arduino 模拟“别踩白块儿”游戏
- 农村土地确权之调查公示 —— 地块分布图制作说明
- 酷家乐怎样把两个方案合并_两个地产科技的理工男联姻:他们都想做一家云端的Autodesk...