soul中的dubbo插件是将http协议 转换成dubbo协议 的插件,也是网关实现dubbo泛化调用的关键
目录
一、dubbo服务运行实例
1.1 前置条件
- JDK1.8
- mysql
- 启动soul-admin
1.2 配置依赖
在soul-bootstrap中添加依赖,以alibaba dubbo2.6.5为例
<!--soul alibaba dubbo plugin start-->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>soul-spring-boot-starter-plugin-alibaba-dubbo</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.5</version>
</dependency>
<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>
<!-- soul alibaba dubbo plugin end-->
1.3 开启插件
1.3 zookeeper安装
参考链接
分别启动zkServer和zkCli进行验证
1.4 dubbo服务的接入的三个步骤
- springboot引入依赖
<dependency>
<groupId>org.dromara</groupId>
<artifactId>soul-spring-boot-starter-client-alibaba-dubbo</artifactId>
<version>${soul.version}</version>
</dependency>
- 在yml文件中增加配置
soul:
dubbo:
adminUrl: http://localhost:9095
contextPath: /dubbo
appName: dubbo
- 把接口注册到网关
@Override
@SoulDubboClient(path = "/findById", desc = "根据用户查询")
public DubboTest findById(final String id) {
DubboTest dubboTest = new DubboTest();
dubboTest.setId(id);
dubboTest.setName("hello world Soul Alibaba Dubbo, findById");
return dubboTest;
}
1.5 启动服务,验证接入成功
1.6 postman进行验证
- 支持Params
- 支持Body中的json格式
二、soul网关dubbo模块初步分析
2.1 元数据
元数据个人猜测是区别于正规的HTTP路径,针对RPC框架提供的调用方法,记录方法等原始信息,要保证原始数据的完整性,理论上粗暴一点没有也可以,不过不方便RPC调用方法的直观理解,path不一定等同于方法名。
- 每个dubbo接口方法,对应一条元数据。
- springcloud协议,只会存储一条数据, path为 /contextPath/**。
- http服务,则不会有任何数据。
官方文档上讲,主要是dubbo的泛化调用上使用,泛化调用是dubbo的基本特性,就是服务消费者不需要有任何接口的实现,就能完成服务的调用。
其中
path 字段,在请求网关的时候,会根据你的path字段来匹配到一条数据,然后进行后续的流程.
rpc_ext字段,如果是dubbo类型的服务接口,且服务接口设置了group和version字段的时候,会存在这个字段。存储结构如下
public static class RpcExt {
private String group;
private String version;
private String loadbalance;
private Integer retries;
private Integer timeout;
}
2.2 dubbo用户请求的流程
- 原理就是通过http的方式来请求你的dubbo服务,把方法调用转换成和HTTP一样的逻辑
- soul网关需要有一个路由前缀,这个路由前缀就是你接入项目进行配置 contextPath
- 参数传递支持多种类型,如上面的Params和json等
- HTTP请求,转换成dubbo协议,内部使用dubbo泛化来进行调用(@SoulDubboClient注解里加了个path)