1月16日作业
预期目标
- 运行examples下面的 apache-dubbo服务
- 学习文档,结合dubbo插件,发起http请求soul网关,体验dubbo代理
- 记录心得并总结
Dubbo服务的发现与注册
Demo
- 首先启动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
- 与http服务的发现和注册类似, 可以通过
- selector,rule的匹配以及路由转发
- soul网关在收到路由转发请求后,是通过调用调用
AbstractSoulPlugin
的execute
方法来实现转发。
- soul网关在收到路由转发请求后,是通过调用调用