在之前的文章里,我们已经介绍了整个 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。

  1. @Service("dubboTestService")
  2. public class DubboTestServiceImpl implements DubboTestService {
  3. @Override
  4. @SoulDubboClient(path = "/findById", desc = "Query by Id")
  5. public DubboTest findById(final String id) {
  6. DubboTest dubboTest = new DubboTest();
  7. dubboTest.setId(id);
  8. dubboTest.setName("hello world Soul Apache, findById");
  9. return dubboTest;
  10. }
  11. }

同样的道理,如果需要把 dubbo 接口注册到 soul-admin 模块上,一样需要设置 soul-admin 的服务地址,这块在配置文件上也能够找到。

  1. soul:
  2. dubbo:
  3. adminUrl: http://localhost:9095
  4. contextPath: /dubbo
  5. 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 服务的重点,我们下次再了解。