Soul源码总结-01-16

预期目标

  • 运行examples下面的 apache-dubbo服务
  • 学习文档,结合dubbo插件,发起http请求soul网关,体验dubbo代理
  • 记录心得并总结

Dubbo服务的发现与注册

Demo

  1. 首先启动soul-admin和soul-bootstrap项目,然后再soul-admin控制台插件管理可以看到dubbo服务默认关闭,选择开启dubbo服务。
    在这里插入图片描述
    此时我们注意到在dubbo配置一栏需要本地启动zookeeper,端口号2181,同时在soul-examples-apache-dubbo-service示例项目的配置文件spring-dubbo.xml中可以看到:
<dubbo:registry address="zookeeper://localhost:2181"/>
<dubbo:protocol name="dubbo" port="20888"/>

此时如果直接启动示例项目会抛出zookeeper not connected异常,在本地用docker-compose启动zookeeper集群后再次启动示例项目极客正常运行。如果使用zkCli.sh与zk集群交互,可以看到以下信息,说明dubbo服务已经顺利注册到zookeeper集群上

[zk: localhost:2181(CONNECTED) 5] ls /dubbo
[config, org.dromara.soul.examples.dubbo.api.service.DubboMultiParamService, org.dromara.soul.examples.dubbo.api.service.DubboTestService]

在soul-admin控制台可以看到soul已经自动发现我们自定义的dubbo服务,并且已经注册相关的规则:
在这里插入图片描述
那么dubbo服务是如何被soul-admin注册和发现呢?和http服务的注册发现机制类似,我们可以在示例项目中看到@SoulDubboClient注解,该注解可以让我们自定义的dubbo服务被soul发现和注册,同时我们通过打断点进行源码追踪,会发现org.dromara.soul.client.apache.dubbo.ApacheDubboServiceBeanPostProcessor中通过反射得到所有被注解的dubbo服务并且通过Okhttp client把相关服务信息post到http://localhost:9095/soul-client/duboo-register从而使rule和selector被soul网关发现感知。
相关代码如下:

    private void handler(final ServiceBean serviceBean) {
        Class<?> clazz = serviceBean.getRef().getClass();
        if (ClassUtils.isCglibProxyClass(clazz)) {
            String superClassName = clazz.getGenericSuperclass().getTypeName();
            try {
                clazz = Class.forName(superClassName);
            } catch (ClassNotFoundException e) {
                log.error(String.format("class not found: %s", superClassName));
                return;
            }
        }
        final Method[] methods = ReflectionUtils.getUniqueDeclaredMethods(clazz);
        for (Method method : methods) {
            SoulDubboClient soulDubboClient = method.getAnnotation(SoulDubboClient.class);
            if (Objects.nonNull(soulDubboClient)) {
                RegisterUtils.doRegister(buildJsonParams(serviceBean, soulDubboClient, method), url, RpcTypeEnum.DUBBO);
            }
        }
    }

测试网关

我们以findAll这个方法为例,发送http://localhost:9195/dubbo/findAll请求
在这里插入图片描述
如果在soul-admin中关闭findAll规则
在这里插入图片描述
重新发送请求,将得到
在这里插入图片描述
通过打断点发现在AbstractSoulPlugin中会调用handleRuleIsNull方法:
在这里插入图片描述

总结

  • dubbo服务的发现与注册:
    • 与http服务的发现和注册类似, 可以通过@SoulDubboClient注解并且在配置文件中配置soul网关的相关信息即可实现服务的发现与注册,并且在soul-admin中显示出来。
    • 如果是非java项目,可以直接在soul-admin中手动天界selector以及相关的rule
  • selector,rule的匹配以及路由转发
    • soul网关在收到路由转发请求后,是通过调用调用AbstractSoulPluginexecute方法来实现转发。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值