背景

公司业务存在多个zk,其中一个zk为公共zk,注册公共服务,各个业务部门有自己的zk,部署自己的服务,业务部门调用公共服务则必须为直连或者在各个业务部门再搭一套服务。

使用

场景: A业务主要是使用自己部门的dubbo服务,但是其中加解密服务需要使用到公共服务,那么就必须引入公共服务的zk,形成2套zk环境。

现在的处理方式有2种

  • Dubbo直连,方式较为简单,通过直连避免了引入第二套zk,缺点就是一旦服务方发生变更,就会导致TCP链接失败,项目起不来的情况
  • 引入公共服务的zk,解决了服务方发生变更,项目起不来的情况,但是调用方的xml/Java Config就会变得相对复杂

通过查看Dubbo源码,可以通过引入zk的方式进去直连,类试于 Java Config, 但是不会那么复杂,业务开发人员更好理解。

一个公共服务Echo为例子

  1. @Bean
  2. public Echo echo() {
  3. ReferenceConfig<Echo> reference = new ReferenceConfig<>();
  4. reference.setVersion("2.0.0_echo");
  5. reference.setCheck(false);
  6. Map<String, ApplicationConfig> applicationConfigMap = BeanFactoryUtils.beansOfTypeIncludingAncest(applicationContext, ApplicationConfig.class, false, false);
  7. if (!CollectionUtils.isEmpty(applicationConfigMap)) {
  8. ApplicationConfig applicationConfig = null;
  9. for (ApplicationConfig config : applicationConfigMap.values()) {
  10. if (config.isDefault() == null || config.isDefault()) {
  11. if (applicationConfig != null) {
  12. throw new IllegalStateException("Duplicate application configs: " + applicationConfig + " and " + config);
  13. }
  14. applicationConfig = config;
  15. }
  16. }
  17. if (applicationConfig != null) {
  18. reference.setApplication(applicationConfig);
  19. }
  20. }
  21. List<RegistryConfig> registryConfigs = new ArrayList<RegistryConfig>();
  22. RegistryConfig registryConfig = new RegistryConfig();
  23. registryConfig.setAddress(this.echoZk);
  24. registryConfig.setProtocol("zookeeper");
  25. registryConfig.setId("echoRegister");
  26. registryConfigs.add(registryConfig);
  27. reference.setRegistries(registryConfigs);
  28. reference.setInterface(Echo.class);
  29. reference.setTimeout(3000);
  30. Echo echo = reference.get();
  31. logger.info("[获取成功]");
  32. return echo;
  33. }

只需要引入 this.echoZk 即可实现通过zk连接.