天天看点

【Soul源码阅读】6. Dubbo 用户接入 Soul 网关流程解析

OK,前面几天把 HTTP 用户 接入 Soul 网关大概了解了下,尤其是昨天 debug 到底层,发现里面配置了很多 plugin 插件,默认只开启了一个 divide 插件,用来转发 HTTP 请求的。

今天不搞那么复杂的,要劳逸结合嘛,毕竟一口吃个胖子只存在于幻想中,还是一口口慢慢消化吧。

来一起看下 dubbo 插件吧。

根据官网文档操作

这年头,各种帖子层出不穷,甚至还有内容农场,相信你也遇到过很多帖子,内容明明一样,各种错误也是直接 copy,对于需要解决问题的我,真的是恨之入骨。即使 copy,你先运行下能不能跑通嘛,哎。。。

扯远了,还是以官方文档为准,可以比对着一起看,https://dromara.org/zh-cn/docs/soul/user-dubbo.html

1.前置条件

  • 支持 alibaba dubbo(< 2.7.x) 以及 apache dubbo (>=2.7.x)。
  • 接入前,请正确的启动 

    soul-admin(如有疑问,出门左转

    【Soul源码阅读】2.单机部署 Soul 或 官网文档-搭建Soul网关环境

2.引入网关对dubbo支持的插件

在 soul-bootstrap 项目的 pom.xml 文件中可见,alibaba dubbo 依赖是默认支持的,如下:

<!--soul alibaba dubbo plugin start-->
<dependency>
    <groupId>org.dromara</groupId>
    <artifactId>soul-spring-boot-starter-plugin-alibaba-dubbo</artifactId>
    <version>${project.version}</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dubbo</artifactId>
    <version>${alibaba.dubbo.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>
<!-- soul  alibaba dubbo plugin end-->
           

而 apache dubbo 是注释掉的,默认不支持,如果需要使用,放开注释即可:

<!--soul  apache dubbo plugin start-->
<!-- <dependency>
    <groupId>org.dromara</groupId>
    <artifactId>soul-spring-boot-starter-plugin-apache-dubbo</artifactId>
    <version>${project.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo</artifactId>
    <version>2.7.5</version>
</dependency>-->
<!-- Dubbo Nacos registry dependency -->
<!--  <dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-registry-nacos</artifactId>
    <version>2.7.5</version>
</dependency>
<dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-client</artifactId>
    <version>1.1.4</version>
</dependency>-->
<!-- Dubbo zookeeper registry dependency start -->
<!-- <dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-client</artifactId>
    <version>4.0.1</version>
</dependency>
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-framework</artifactId>
    <version>4.0.1</version>
</dependency>
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-recipes</artifactId>
    <version>4.0.1</version>
</dependency>-->
<!-- Dubbo zookeeper registry dependency end -->
<!-- soul  apache dubbo plugin end-->
           

既然 Soul 社区都默认支持 alibaba dubbo,我们就用它来演示(其实是不用动代码,我还是一如既往的懒。)

如果改之前网关是运行着的,改完了配置后,需要重启!!!

3.dubbo服务接入网关

官网文档给出了几种接入场景:

  • alibaba dubbo 用户 + springboot
  • alibaba dubbo 用户 + spring
  • apache dubbo 用户 + springboot
  • apache dubbo 用户 + spring

看看源码样例中的结构,聪明的你一定猜到了我们以哪个来使用了,对了,就是 alibaba-dubbo 这个示例 :)

【Soul源码阅读】6. Dubbo 用户接入 Soul 网关流程解析

看看样例项目中,都配置了点儿啥

3.1 maven 依赖

很显然,这个项目 soul-examples-alibaba-dubbo-service 属于 alibaba dubbo 用户 + springboot。

<dependency>
    <groupId>org.dromara</groupId>
    <artifactId>soul-spring-boot-starter-client-alibaba-dubbo</artifactId>
    <version>${soul.version}</version>
</dependency>
           

3.2 yml 配置文件(对应到 org/dromara/soul/client/dubbo/common/config/DubboConfig.java)

soul:
  dubbo:
    adminUrl: http://localhost:9095
    contextPath: /dubbo
    appName: dubbo
# adminUrl: 为你启动的soul-admin 项目的ip + 端口,注意要加 http://
# contextPath: 为你的这个项目在soul网关的路由前缀,这个你应该懂意思把? 比如/order ,/product 等等,网关会根据你的这个前缀来进行路由.
# appName:你的应用名称,不配置的话,会默认取 dubbo配置中application 中的名称
           

到这里,如果你看过之前的文章,你就知道,这是 Spring Boot Starter(可以参考前面一篇文章 【Soul源码阅读】3.HTTP 用户接入 Soul 流程解析)

【Soul源码阅读】6. Dubbo 用户接入 Soul 网关流程解析

3.3 注解 @SoulDubboClient(原理类似 @SoulSpringMvcClient)

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface SoulDubboClient {

    String path();

    String ruleName() default "";

    String desc() default "";

    boolean enabled() default true;
}
           

 通过找这个注解使用的地方,又找到了类似的代码,url 就是自动将 Dubbo 服务接口信息同步给 soul-admin 的注册地址。

// AlibabaDubboServiceBeanPostProcessor.java
public AlibabaDubboServiceBeanPostProcessor(final DubboConfig dubboConfig) {
    String contextPath = dubboConfig.getContextPath();
    String adminUrl = dubboConfig.getAdminUrl();
    if (StringUtils.isEmpty(contextPath)
            || StringUtils.isEmpty(adminUrl)) {
        throw new RuntimeException("Alibaba dubbo client must config the contextPath, adminUrl");
    }
    this.dubboConfig = dubboConfig;
    url = dubboConfig.getAdminUrl() + "/soul-client/dubbo-register";
    executorService = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
}
           

4.打开 dubbo 插件

【Soul网关管理】【系统管理】【插件管理】【编辑】

这里要配置 zookeeper 的地址。

【Soul源码阅读】6. Dubbo 用户接入 Soul 网关流程解析

5.启动项目

依次启动3个项目,正常启动后,如下图所示:

【Soul源码阅读】6. Dubbo 用户接入 Soul 网关流程解析

【Soul网关管理】【插件列表】【dubbo】

在 soul-admin web 页面可以看到 dubbo 接口注册进来了。

【Soul源码阅读】6. Dubbo 用户接入 Soul 网关流程解析

使用 ZooInspector 连接 zk,可以看到 dubbo 节点及接口信息:

【Soul源码阅读】6. Dubbo 用户接入 Soul 网关流程解析

数据库中之前空的元信息表中也有信息了,正好11条数据,对应11个接口信息:

【Soul源码阅读】6. Dubbo 用户接入 Soul 网关流程解析

6.调用接口,测试

6.1无参 GET 方法

localhost:9195/dubbo/findAll

【Soul源码阅读】6. Dubbo 用户接入 Soul 网关流程解析

6.2 有参 GET 方法

localhost:9195/dubbo/findById?id=95

【Soul源码阅读】6. Dubbo 用户接入 Soul 网关流程解析

6.3 有参数 Post 请求

localhost:9195/dubbo/insert
{
    "id": "95",
    "name": "name_95"
}
           
【Soul源码阅读】6. Dubbo 用户接入 Soul 网关流程解析

6.4 多参数 POST 请求

localhost:9195/dubbo/findByIdsAndName
{
    "ids": [1,2,3,4],
    "names": "findByIdsAndName"
}
           
【Soul源码阅读】6. Dubbo 用户接入 Soul 网关流程解析

好的,今天把 dubbo 的样例代码跑了一遍。