Soul 网关源码分析(三)dubbo 插件

在上一节中,我们尝试使用divide插件进行http代理,今天我们来看看Soul是如何将http协议,转换成dubbo协议的。

首先在插件管理中开启dubbo配置:
在这里插入图片描述
打开Soul 源码,编译下图路径的dubbo demo 项目:
在这里插入图片描述
编译后我们把打包好的 Jar 包run起来,
确保

  1. dubbo 插件已开启
  2. 你的soul-bootstrap,soul-admin 在运行状态
  3. zookeeper 也在启动状态(默认端口2181),地址在:
soul/soul-examples/soul-examples-dubbo/soul-examples-alibaba-dubbo-service/target/soul-examples-alibaba-dubbo-service-2.1.0.jar

成功运行dubbo demo 后,发现soul admin 帮我们注册了其中的 endpoints

2021-01-17 00:51:50.563  INFO 63416 --- [-47-EventThread] o.a.c.f.state.ConnectionStateManager     : State change: CONNECTED
2021-01-17 00:51:50.590  INFO 63416 --- [-47-EventThread] o.a.c.framework.imps.EnsembleTracker     : New config event received: {}
2021-01-17 00:51:50.590  INFO 63416 --- [-47-EventThread] o.a.c.framework.imps.EnsembleTracker     : New config event received: {}
2021-01-17 00:51:50.973  INFO 63416 --- [ctReadThread-47] o.d.s.p.a.d.c.ApplicationConfigCache     : init aliaba dubbo reference success there meteData is :MetaData(id=1350397137501040640, appName=dubbo, contextPath=null, path=/dubbo/insert, rpcType=dubbo, serviceName=org.dromara.soul.examples.dubbo.api.service.DubboTestService, methodName=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 00:51:50.993  INFO 63416 --- [ctReadThread-47] o.d.s.p.a.d.c.ApplicationConfigCache     : init aliaba dubbo reference success there meteData is :MetaData(id=1350397138167934976, appName=dubbo, contextPath=null, path=/dubbo/findAll, rpcType=dubbo, serviceName=org.dromara.soul.examples.dubbo.api.service.DubboTestService, methodName=findAll, parameterTypes=null, rpcExt={"group":"","version":"","loadbalance":"random","retries":2,"timeout":10000,"url":""}, enabled=true)
2021-01-17 00:51:51.012  INFO 63416 --- [ctReadThread-47] o.d.s.p.a.d.c.ApplicationConfigCache     : init aliaba dubbo reference success there meteData is :MetaData(id=1350397138960658432, appName=dubbo, contextPath=null, path=/dubbo/findById, rpcType=dubbo, serviceName=org.dromara.soul.examples.dubbo.api.service.DubboTestService, methodName=findById, parameterTypes=java.lang.String, rpcExt={"group":"","version":"","loadbalance":"random","retries":2,"timeout":10000,"url":""}, enabled=true)
2021-01-17 00:51:51.060  INFO 63416 --- [ctReadThread-47] o.d.s.p.a.d.c.ApplicationConfigCache     : init aliaba dubbo reference success there meteData is :MetaData(id=1350397139031961600, appName=dubbo, contextPath=null, path=/dubbo/findByIdsAndName, rpcType=dubbo, serviceName=org.dromara.soul.examples.dubbo.api.service.DubboMultiParamService, methodName=findByIdsAndName, parameterTypes=java.util.List,java.lang.String, rpcExt={"group":"","version":"","loadbalance":"random","retries":2,"timeout":10000,"url":""}, enabled=true)
2021-01-17 00:51:51.079  INFO 63416 --- [ctReadThread-47] o.d.s.p.a.d.c.ApplicationConfigCache     : init aliaba dubbo reference success there meteData is :MetaData(id=1350397139103264768, appName=dubbo, contextPath=null, path=/dubbo/findByArrayIdsAndName, rpcType=dubbo, serviceName=org.dromara.soul.examples.dubbo.api.service.DubboMultiParamService, methodName=findByArrayIdsAndName, parameterTypes=[Ljava.lang.Integer;,java.lang.String, rpcExt={"group":"","version":"","loadbalance":"random","retries":2,"timeout":10000,"url":""}, enabled=true)
2021-01-17 00:51:51.100  INFO 63416 --- [ctReadThread-47] o.d.s.p.a.d.c.ApplicationConfigCache     : init aliaba dubbo reference success there meteData is :MetaData(id=1350397139182956544, appName=dubbo, contextPath=null, path=/dubbo/findByStringArray, rpcType=dubbo, serviceName=org.dromara.soul.examples.dubbo.api.service.DubboMultiParamService, methodName=findByStringArray, parameterTypes=[Ljava.lang.String;, rpcExt={"group":"","version":"","loadbalance":"random","retries":2,"timeout":10000,"url":""}, enabled=true)
2021-01-17 00:51:51.126  INFO 63416 --- [ctReadThread-47] o.d.s.p.a.d.c.ApplicationConfigCache     : init aliaba dubbo reference success there meteData is :MetaData(id=1350397139258454016, appName=dubbo, contextPath=null, path=/dubbo/findByListId, rpcType=dubbo, serviceName=org.dromara.soul.examples.dubbo.api.service.DubboMultiParamService, methodName=findByListId, parameterTypes=java.util.List, rpcExt={"group":"","version":"","loadbalance":"random","retries":2,"timeout":10000,"url":""}, enabled=true)
2021-01-17 00:51:51.153  INFO 63416 --- [ctReadThread-47] o.d.s.p.a.d.c.ApplicationConfigCache     : init aliaba dubbo reference success there meteData is :MetaData(id=1350397139346534400, appName=dubbo, contextPath=null, path=/dubbo/batchSave, rpcType=dubbo, serviceName=org.dromara.soul.examples.dubbo.api.service.DubboMultiParamService, methodName=batchSave, parameterTypes=java.util.List, rpcExt={"group":"","version":"","loadbalance":"random","retries":2,"timeout":10000,"url":""}, enabled=true)
2021-01-17 00:51:51.169  INFO 63416 --- [ctReadThread-47] o.d.s.p.a.d.c.ApplicationConfigCache     : init aliaba dubbo reference success there meteData is :MetaData(id=1350397139413643264, appName=dubbo, contextPath=null, path=/dubbo/batchSaveAndNameAndId, rpcType=dubbo, serviceName=org.dromara.soul.examples.dubbo.api.service.DubboMultiParamService, methodName=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 00:51:51.186  INFO 63416 --- [ctReadThread-47] o.d.s.p.a.d.c.ApplicationConfigCache     : init aliaba dubbo reference success there meteData is :MetaData(id=1350397139476557824, appName=dubbo, contextPath=null, path=/dubbo/saveComplexBeanTest, rpcType=dubbo, serviceName=org.dromara.soul.examples.dubbo.api.service.DubboMultiParamService, methodName=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 00:51:51.201  INFO 63416 --- [ctReadThread-47] o.d.s.p.a.d.c.ApplicationConfigCache     : init aliaba dubbo reference success there meteData is :MetaData(id=1350397139547860992, appName=dubbo, contextPath=null, path=/dubbo/saveComplexBeanTestAndName, rpcType=dubbo, serviceName=org.dromara.soul.examples.dubbo.api.service.DubboMultiParamService, methodName=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)

使用curl 调用 soul-bootstrap 代理的接口:

curl localhost:9195/dubbo/findAll 
//返回了
{"code":200,"message":"Access to success!","data":{"name":"hello world Soul Alibaba Dubbo , findAll","id":"654524173"}}

表明我们通过soul成功调用了dubbo的接口。

深入源码,在调用 “/dubbo/findAll” 这个路径时,dubbo plugin 执行了 doExecute 方法,然后从 ServerWebExchange 中分别获取到了
soulContext 和 metaData:
在这里插入图片描述
在这里插入图片描述
在这两个对象中我们已经看到了即将调用到的DubboTestService和 对应的方法名 findAll。
在这里我们获取到了 genericService,并将封装好的方法名,参数通过 genericService 的 $invoke方法调用真实的dubbo服务endpoint,再将response 返回给soul-bootstrap这边。
在这里插入图片描述
总结:Dubbo插件非常强大,能够通过扫描zookeeper的方式将所有已注册的endpoint 并直接添加到规则中,这一点对于dubbo用户来说接入几乎是零成本的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值