soul源码学习(三)-dubbo示例

目标

通过官方示例了解dubbo集成方式

环境准备

  1. 启动soul-admin和soul-bootstrap
  2. 下载zookeeper,并以默认端口启动
  3. 启动官方示例soul-examples-dubbo(TestApacheDubboApplication),控制栏输出如下
2021-01-17 01:27:52.211  INFO 75035 --- [pool-2-thread-1] o.d.s.client.common.utils.RegisterUtils  : dubbo client register success: {"appName":"dubbo","contextPath":"/dubbo","path":"/dubbo/findById","pathDesc":"Query by Id","rpcType":"dubbo","serviceName":"org.dromara.soul.examples.dubbo.api.service.DubboTestService","methodName":"findById","ruleName":"/dubbo/findById","parameterTypes":"java.lang.String","rpcExt":"{\"group\":\"\",\"version\":\"\",\"loadbalance\":\"random\",\"retries\":2,\"timeout\":10000,\"url\":\"\"}","enabled":true} 
2021-01-17 01:27:52.273  INFO 75035 --- [pool-2-thread-1] o.d.s.client.common.utils.RegisterUtils  : dubbo client register success: {"appName":"dubbo","contextPath":"/dubbo","path":"/dubbo/findAll","pathDesc":"Get all data","rpcType":"dubbo","serviceName":"org.dromara.soul.examples.dubbo.api.service.DubboTestService","methodName":"findAll","ruleName":"/dubbo/findAll","parameterTypes":"","rpcExt":"{\"group\":\"\",\"version\":\"\",\"loadbalance\":\"random\",\"retries\":2,\"timeout\":10000,\"url\":\"\"}","enabled":true} 
2021-01-17 01:27:52.294  INFO 75035 --- [pool-2-thread-1] o.d.s.client.common.utils.RegisterUtils  : dubbo client register success: {"appName":"dubbo","contextPath":"/dubbo","path":"/dubbo/insert","pathDesc":"Insert a row of data","rpcType":"dubbo","serviceName":"org.dromara.soul.examples.dubbo.api.service.DubboTestService","methodName":"insert","ruleName":"/dubbo/insert","parameterTypes":"org.dromara.soul.examples.dubbo.api.entity.DubboTest","rpcExt":"{\"group\":\"\",\"version\":\"\",\"loadbalance\":\"random\",\"retries\":2,\"timeout\":10000,\"url\":\"\"}","enabled":true} 
2021-01-17 01:27:52.320  INFO 75035 --- [pool-2-thread-1] o.d.s.client.common.utils.RegisterUtils  : dubbo client register success: {"appName":"dubbo","contextPath":"/dubbo","path":"/dubbo/findByIdsAndName","pathDesc":"","rpcType":"dubbo","serviceName":"org.dromara.soul.examples.dubbo.api.service.DubboMultiParamService","methodName":"findByIdsAndName","ruleName":"/dubbo/findByIdsAndName","parameterTypes":"java.util.List,java.lang.String","rpcExt":"{\"group\":\"\",\"version\":\"\",\"loadbalance\":\"random\",\"retries\":2,\"timeout\":10000,\"url\":\"\"}","enabled":true} 
2021-01-17 01:27:52.342  INFO 75035 --- [pool-2-thread-1] o.d.s.client.common.utils.RegisterUtils  : dubbo client register success: {"appName":"dubbo","contextPath":"/dubbo","path":"/dubbo/findByArrayIdsAndName","pathDesc":"","rpcType":"dubbo","serviceName":"org.dromara.soul.examples.dubbo.api.service.DubboMultiParamService","methodName":"findByArrayIdsAndName","ruleName":"/dubbo/findByArrayIdsAndName","parameterTypes":"[Ljava.lang.Integer;,java.lang.String","rpcExt":"{\"group\":\"\",\"version\":\"\",\"loadbalance\":\"random\",\"retries\":2,\"timeout\":10000,\"url\":\"\"}","enabled":true} 
2021-01-17 01:27:52.362  INFO 75035 --- [pool-2-thread-1] o.d.s.client.common.utils.RegisterUtils  : dubbo client register success: {"appName":"dubbo","contextPath":"/dubbo","path":"/dubbo/findByStringArray","pathDesc":"","rpcType":"dubbo","serviceName":"org.dromara.soul.examples.dubbo.api.service.DubboMultiParamService","methodName":"findByStringArray","ruleName":"/dubbo/findByStringArray","parameterTypes":"[Ljava.lang.String;","rpcExt":"{\"group\":\"\",\"version\":\"\",\"loadbalance\":\"random\",\"retries\":2,\"timeout\":10000,\"url\":\"\"}","enabled":true} 
2021-01-17 01:27:52.376  INFO 75035 --- [pool-2-thread-1] o.d.s.client.common.utils.RegisterUtils  : dubbo client register success: {"appName":"dubbo","contextPath":"/dubbo","path":"/dubbo/findByListId","pathDesc":"","rpcType":"dubbo","serviceName":"org.dromara.soul.examples.dubbo.api.service.DubboMultiParamService","methodName":"findByListId","ruleName":"/dubbo/findByListId","parameterTypes":"java.util.List","rpcExt":"{\"group\":\"\",\"version\":\"\",\"loadbalance\":\"random\",\"retries\":2,\"timeout\":10000,\"url\":\"\"}","enabled":true} 
2021-01-17 01:27:52.388  INFO 75035 --- [pool-2-thread-1] o.d.s.client.common.utils.RegisterUtils  : dubbo client register success: {"appName":"dubbo","contextPath":"/dubbo","path":"/dubbo/batchSave","pathDesc":"","rpcType":"dubbo","serviceName":"org.dromara.soul.examples.dubbo.api.service.DubboMultiParamService","methodName":"batchSave","ruleName":"/dubbo/batchSave","parameterTypes":"java.util.List","rpcExt":"{\"group\":\"\",\"version\":\"\",\"loadbalance\":\"random\",\"retries\":2,\"timeout\":10000,\"url\":\"\"}","enabled":true} 
2021-01-17 01:27:52.411  INFO 75035 --- [pool-2-thread-1] o.d.s.client.common.utils.RegisterUtils  : dubbo client register success: {"appName":"dubbo","contextPath":"/dubbo","path":"/dubbo/batchSaveAndNameAndId","pathDesc":"","rpcType":"dubbo","serviceName":"org.dromara.soul.examples.dubbo.api.service.DubboMultiParamService","methodName":"batchSaveAndNameAndId","ruleName":"/dubbo/batchSaveAndNameAndId","parameterTypes":"java.util.List,java.lang.String,java.lang.String","rpcExt":"{\"group\":\"\",\"version\":\"\",\"loadbalance\":\"random\",\"retries\":2,\"timeout\":10000,\"url\":\"\"}","enabled":true} 
2021-01-17 01:27:52.434  INFO 75035 --- [pool-2-thread-1] o.d.s.client.common.utils.RegisterUtils  : dubbo client register success: {"appName":"dubbo","contextPath":"/dubbo","path":"/dubbo/saveComplexBeanTest","pathDesc":"","rpcType":"dubbo","serviceName":"org.dromara.soul.examples.dubbo.api.service.DubboMultiParamService","methodName":"saveComplexBeanTest","ruleName":"/dubbo/saveComplexBeanTest","parameterTypes":"org.dromara.soul.examples.dubbo.api.entity.ComplexBeanTest","rpcExt":"{\"group\":\"\",\"version\":\"\",\"loadbalance\":\"random\",\"retries\":2,\"timeout\":10000,\"url\":\"\"}","enabled":true} 
2021-01-17 01:27:52.455  INFO 75035 --- [pool-2-thread-1] o.d.s.client.common.utils.RegisterUtils  : dubbo client register success: {"appName":"dubbo","contextPath":"/dubbo","path":"/dubbo/saveComplexBeanTestAndName","pathDesc":"","rpcType":"dubbo","serviceName":"org.dromara.soul.examples.dubbo.api.service.DubboMultiParamService","methodName":"saveComplexBeanTestAndName","ruleName":"/dubbo/saveComplexBeanTestAndName","parameterTypes":"org.dromara.soul.examples.dubbo.api.entity.ComplexBeanTest,java.lang.String","rpcExt":"{\"group\":\"\",\"version\":\"\",\"loadbalance\":\"random\",\"retries\":2,\"timeout\":10000,\"url\":\"\"}","enabled":true} 

同样也是通过RegisterUtils该类与soul-admin进行通信注册
4. 观察soul–bootstrap控制栏输出,有如下异常输出:
在这里插入图片描述
推测可知,soul-boostrap与soul-admin自动同步时,获取了dubbo的注注册元数据,但是soul-bootstrap在获取元数据进行构建dubbo服务时报配置异常,经过排查,默认情况下,dubbo插件状态开关为关闭,需将其打开,在这里插入图片描述
重启soul-boostrap后,该异常消失,可知该异常与插件状态开关有关,原因暂时不明,soul-admin正常状态如图:
在这里插入图片描述

访问测试

在这里插入图片描述

soul-admin手动同步异常

soul-admin提供了手动将元功能同步给soul-bootstrap,如下图
在这里插入图片描述
在进行dubbo数据同步时,发现异常

java.lang.NullPointerException: null
	at org.dromara.soul.plugin.alibaba.dubbo.subscriber.AlibabaDubboMetaDataSubscriber.onSubscribe(AlibabaDubboMetaDataSubscriber.java:49) ~[classes/:na]
	at org.dromara.soul.plugin.sync.data.websocket.handler.MetaDataHandler.lambda$null$0(MetaDataHandler.java:42) ~[classes/:na]
	at java.util.ArrayList.forEach(ArrayList.java:1257) ~[na:1.8.0_251]
	at org.dromara.soul.plugin.sync.data.websocket.handler.MetaDataHandler.lambda$doRefresh$1(MetaDataHandler.java:42) ~[classes/:na]
	at java.util.ArrayList.forEach(ArrayList.java:1257) ~[na:1.8.0_251]
	at org.dromara.soul.plugin.sync.data.websocket.handler.MetaDataHandler.doRefresh(MetaDataHandler.java:42) ~[classes/:na]
	at org.dromara.soul.plugin.sync.data.websocket.handler.AbstractDataHandler.handle(AbstractDataHandler.java:68) ~[classes/:na]
	at org.dromara.soul.plugin.sync.data.websocket.handler.WebsocketDataHandler.executor(WebsocketDataHandler.java:61) ~[classes/:na]
	at org.dromara.soul.plugin.sync.data.websocket.client.SoulWebsocketClient.handleResult(SoulWebsocketClient.java:87) ~[classes/:na]
	at org.dromara.soul.plugin.sync.data.websocket.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_251]

通过异常可知问题出现在 org.dromara.soul.plugin.alibaba.dubbo.subscriber.AlibabaDubboMetaDataSubscriber.onSubscribe方法中,源码解析如下:
在这里插入图片描述
可以分析出:soul-bootstrap首次同步元数据信息时,进行内存初始化,正常同步,当进行手动同步时,由于内存中已存在相关路由信息,所以会走到serviceName rpcExt parameterTypes methodName这四个参数的逻辑判断,经过测试,可知报错为该行
在这里插入图片描述
parameterTypes 为空导致,即已注册过的方法参数有空导致的异常,通过注册的元数据可以发现在这里插入图片描述
调试信息如下
在这里插入图片描述

该测试方法参数为空引起的,因此上述源码需要做为空判断

总结

本小节只是简单的将官网dubbo示例进行启动进行简单访问,对dubbo元数据同步有个简单的认识:

  1. 默认情况下,dubbo插件状态未开启,如需要使用该功能需要手动开启
  2. 无论插件是否开启,soul-admin和soul-bootstrap都会进行dubbo相关元数据的同步工作,插件状态未开启时,浏览器访问不到
  3. soul-admin界面可以进行手动同步元数据给soul-bootstrap

猜你喜欢

转载自blog.csdn.net/yilongzhetian/article/details/112727572