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源码阅读】2.单机部署 Soul 或 官网文档-搭建Soul网关环境soul-admin(如有疑问,出门左转
)
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 这个示例 :)
看看样例项目中,都配置了点儿啥
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 流程解析)
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 的地址。
5.启动项目
依次启动3个项目,正常启动后,如下图所示:
【Soul网关管理】【插件列表】【dubbo】
在 soul-admin web 页面可以看到 dubbo 接口注册进来了。
使用 ZooInspector 连接 zk,可以看到 dubbo 节点及接口信息:
数据库中之前空的元信息表中也有信息了,正好11条数据,对应11个接口信息:
6.调用接口,测试
6.1无参 GET 方法
localhost:9195/dubbo/findAll
6.2 有参 GET 方法
localhost:9195/dubbo/findById?id=95
6.3 有参数 Post 请求
localhost:9195/dubbo/insert
{
"id": "95",
"name": "name_95"
}
6.4 多参数 POST 请求
localhost:9195/dubbo/findByIdsAndName
{
"ids": [1,2,3,4],
"names": "findByIdsAndName"
}
好的,今天把 dubbo 的样例代码跑了一遍。