任务

  1. 运行examples下面的 apache-dubbo服务
  2. 学习文档,结合dubbo插件,发起http请求soul网关,体验dubbo代理

玩玩

dubbo 插件初体验

  1. 启动 soul-examples-alibaba-dubbo-service 工程,启动成功后,可以看到使用 @SoulDubboClient 注解的服务已经注册到了网关中,同时在控制台中也看到了注册成功的日志:
1
dubbo client register success

image.png

  1. 但是,在网关中却抛出了异常,看异常信息大致是网关缺少对 dubbo 的配置。
1
2
3
2021-01-16 22:55:47.423 ERROR 4416 --- [ctReadThread-45] org.java_websocket.drafts.Draft_6455     : Runtime exception during onWebsocketMessage

java.lang.IllegalStateException: No such application config! Please add <dubbo:application name="..." /> to your spring config.
  1. 排查发现。。其实是网关对 dubbo 插件的支持没有开启,开启 dubbo 插件后,重启 soul-examples-alibaba-dubbo-service 工程,可以在网关中看到 dubbo 服务成功注册的信息。

image.png

1
init aliaba dubbo reference success there meteData is ...
  1. 现在,发送请求 http://localhost:9195/dubbo/findAll ,发现报了空指针异常,在构建参数的时候读取到了空的参数,猜测是请求没有把之前请求的参数去掉导致。如果这样的话,是不是就意味着可以定义同个规则名称,但是不同参数的两个规则?去掉参数后,再次请求,发现请求成功。默认的参数处理类是:DubboMultiParameterResolveServiceImpl
1
2
java.lang.NullPointerException: null
at org.dromara.soul.web.dubbo.DubboMultiParameterResolveServiceImpl.buildParameter(DubboMultiParameterResolveServiceImpl.java:42)

image.png

  1. 尝试发送其他请求:
  • insert : {“id”:”1234”,”name”:”eazonshaw”}
1
{"code":200,"message":"Access to success!","data":{"name":"hello world Soul Alibaba Dubbo: eazonshaw","id":"1234"}}
  • findByIdsAndName:{ids:[1,2,3],name:eazonshaw}
1
{"code":200,"message":"Access to success!","data":{"name":"hello world soul alibaba dubbo param findByIdsAndName : eazonshaw","id":"[1, 2, 3]"}}
  • findByIdsAndName:{ids:[“1”,”2”,”3”],name:”eazonshaw”}

这里发现,当入参类型为数组的基本类型时,如果入参的 json 为 {ids:[1,2,3],name:eazonshaw} 时,会报异常,猜测是因为没有指定数组内参数的类型导致,因此将入参的 json 改成 {ids:["1","2","3"],name:"eazonshaw"}。不过具体可以看DubboMultiParameterResolveServiceImpl的源码。

1
{"code":200,"message":"Access to success!","data":{"name":"hello world soul alibaba dubbo param findByArrayIdsAndName : eazonshaw","id":"[1, 2, 3]"}}