序
在之前的文章里,我们已经介绍了整个 http 服务从接口注册到数据同步,再到 soul-bootstrap 网关代理的整个流程,但是 soul 网关并不只是一个 http 接口服务的代理网关,它还可以代理 dubbo 或者其他接口。
今天我们就先从一个 dubbo 的案例开始,分析下如果需要代理 dubbo 接口,需要怎么去做。
soul-examples-dubbo 模块
通常 dubbo 的项目都需要 zookeeper 去完成服务的注册和发现,也就是说在开始之前需要启动一个 zookeeper 服务。
我们先回顾下之前我们的 http 接口服务需要注册到 soul-admin 上需要加上 @SoulSpringMvcClient 注解,那么如果是 dubbo 接口呢?是否同样需要类似的注解?
答案是肯定的,注册到 soul-admin 的方式也是类似的,通过扫描指定注解的方法或者类,去获取到需要注册的 dubbo 接口,然后通过 http 请求 post 提交到 soul-admin 服务。
在 dubbo 的服务里面,这个注解是 @SoulDubboClient。
@Service("dubboTestService")
public class DubboTestServiceImpl implements DubboTestService {
@Override
@SoulDubboClient(path = "/findById", desc = "Query by Id")
public DubboTest findById(final String id) {
DubboTest dubboTest = new DubboTest();
dubboTest.setId(id);
dubboTest.setName("hello world Soul Apache, findById");
return dubboTest;
}
}
同样的道理,如果需要把 dubbo 接口注册到 soul-admin 模块上,一样需要设置 soul-admin 的服务地址,这块在配置文件上也能够找到。
soul:
dubbo:
adminUrl: http://localhost:9095
contextPath: /dubbo
appName: dubbo
有了 dobbo 接口的注解,就能获取到这些 dubbo 接口数据,然后就可以把这些数据注册到 soul-admin 模块上,最后通过数据同步给 soul-bootstrap 网关。
接下来,就可以使用 soul-bootstrap 网关去代理 dubbo 接口了。
这里需要注意一点,dubbo 的接口调用一般是需要通过指定的 api 去明确接口定义的类、方法甚至是参数等,也就是说 provider 和 consumer 是有耦合的。
soul-bootstrap 网关在调用 dubbo 接口的时候使用类 duboo 的泛化调用,也就是可以通过接口的全名称加上入参和反参,就可以实现 dubbo 接口的调用。
同时,使用 soul-bootstrap 网关调用接口,可以不需要关注真正的服务是什么类型的接口,通通使用 http 方式去访问就行。
总结
使用 soul 网关去调用 dubbo 的接口跟调用 http 接口的方式一致,也就是说 soul 网关屏蔽了不同的服务接口,使用统一的 http 请求方式就可以拿到接口的返回值。
dubbo 服务接口的注册和数据同步跟 http 接口类似,不一样的就是 soul 网关在代理请求真正的 dubbo 服务的时候是需要用 dubbo 的泛化调用,这一块也是 soul 网关代理 dubbo 服务的重点,我们下次再了解。