注册信息简化

了解 dubbo3 以减少注册中心上服务的注册数据

功能描述

在 Dubbo 提供者服务配置项中,有近 30 个配置项。除去注册中心服务治理的需要,很大一部分配置项是提供者自身使用,不需要透明地传递给消费者。这部分数据不需要进入注册中心,只需要以键值对的形式持久化存储。

Dubbo 消费者中的配置项也有 20+ 个配置项。在注册中心,服务消费者列表中只需要关注少量配置,例如 application、version、group、ip 和 dubbo 版本,其他配置也可以以键值对的形式持久化存储。这些数据在服务维度注册到注册中心,导致数据量膨胀,进而导致注册中心(如 zookeeper)的网络开销增加,性能下降。

设计目标和目的

希望简化进入注册中心的提供者和消费者配置的数量。期望部分配置项以其他形式存储。这些配置项需要满足:不在服务调用链路上,且这些配置项不在注册中心的核心链路上(服务查询、服务列表)。

配置

简化注册中心的配置,仅在 2.7 版本之后支持。启用提供者或消费者简化配置后,默认保留的配置项如下

提供者

常量键备注
APPLICATION_KEYapplication
CODEC_KEYcodec
EXCHANGER_KEYexchanger
SERIALIZATION_KEYserialization
CLUSTER_KEYcluster
CONNECTIONS_KEYconnections
DEPRECATED_KEYdeprecated
GROUP_KEYgroup
LOADBALANCE_KEYloadbalance
MOCK_KEYmock
PATH_KEYpath
TIMEOUT_KEYtimeout
TOKEN_KEYtoken
VERSION_KEYversion
WARMUP_KEYwarmup
WEIGHT_KEYweight
DUBBO_VERSION_KEYdubbo
RELEASE_KEYrelease
SIDE_KEYside

消费者

常量键备注
APPLICATION_KEYapplication
VERSION_KEYversion
GROUP_KEYgroup
DUBBO_VERSION_KEYdubbo

常量键代表来自 org.apache.dubbo.common.Constants 类的一个字段。

以下介绍几种常用的方法。所有示例,您可以查看 sample-2.7

使用场景

大量数据导致注册中心的网络开销增加,性能下降。

如何使用

现有功能示例 简单演示当前现状。通过这个演示,分析为什么需要简化配置。

参考示例子项目:dubbo-samples-simplified-registry/dubbo-samples-simplified-registry-nosimple(运行示例前,先运行 ZKClean 清理配置项)

dubbo-provider.xml 配置
<dubbo:application name="simplified-registry-nosimple-provider"/>
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<bean id="demoService" class="org.apache.dubbo.samples.simplified.registry.nosimple.impl.DemoServiceImpl"/>
<dubbo:service async="true" interface="org.apache.dubbo.samples.simplified.registry.nosimple.api.DemoService"
               version="1.2.3" group="dubbo-simple" ref="demoService"
               executes="4500" retries="7" owner="vict" timeout="5300"/>

启动提供者主方法后,查看 zookeeper 叶子节点的内容(路径:/dubbo/org.apache.dubbo.samples.simplified.registry.nosimple.api.DemoService/providers 目录)如下

dubbo%3A%2F%2F30.5.124.158%3A20880%2Forg.apache.dubbo.samples.simplified.registry.nosimple.api.DemoService
%3Fanyhost%3Dtrue%26application%3Dsimplified-registry-xml-provider%26async%3Dtrue%26dubbo%3D
2.0.2%26executes%3D4500%26generic%3Dfalse%26group%3Ddubbo-simple%26interface%3D
org.apache.dubbo.samples.simplified.registry.nosimple.api.DemoService%26methods%3D
sayHello%26owner%3Dvict%26pid%3D2767%26retries%3D7%26revision%3D1.2.3%26side%3D
provider%26timeout%3D5300%26timestamp%3D1542361152795%26valid%3Dtrue%26version%3D1.2.3

可以看到,有:executesretriesownertimeout。但并非所有这些字段都需要传递给 dubbo ops 或 dubbo 消费者。类似地,消费者也存在这个问题,可以通过启动示例中消费者的主方法查看。

方法 1. 配置 dubbo.properties

示例位于 dubbo-samples-simplified-registry/dubbo-samples-simplified-registry-xml 项目下(运行示例前,先运行 ZKClean 清理配置项)

dubbo.properties
dubbo.registry.simplified=true
dubbo.registry.extra-keys=retries,owner

与上面的 现有功能示例 相比,在上面的示例中,executes、retries、owner 和 timeout 的四个配置项都进入了注册中心。但这个示例不是,配置被分为

  • 配置:dubbo.registry.simplified=true,默认情况下,timeout 在默认配置项列表中,所以它仍然会进入注册中心;
  • 配置:dubbo.registry.extra-keys=retries,owner,所以 retries、owner 也会进入注册中心。

配置类型

  • 提供者端配置
  • 消费者端配置

提供者端配置

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="https://dubbo.apache.org/schema/dubbo"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
       https://dubbo.apache.org/schema/dubbo https://dubbo.apache.org/schema/dubbo/dubbo.xsd">
    <!-- optional -->
    <dubbo:application name="simplified-registry-xml-provider"/>
    <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
    <bean id="demoService" class="org.apache.dubbo.samples.simplified.registry.nosimple.impl.DemoServiceImpl"/>
    <dubbo:service async="true" interface="org.apache.dubbo.samples.simplified.registry.nosimple.api.DemoService" version="1.2.3" group="dubbo-simple"
                   ref="demoService" executes="4500" retries="7" owner="vict" timeout="5300"/>

</beans>

获取 zookeeper 叶子节点的值

dubbo%3A%2F%2F30.5.124.149%3A20880%2Forg.apache.dubbo.samples.simplified.registry.nosimple.api.DemoService%3F
application%3Dsimplified-registry-xml-provider%26dubbo%3D2.0.2%26group%3Ddubbo-simple%26owner%3D
vict%26retries%3D7%26timeout%3D5300%26timestamp%3D1542594503305%26version%3D1.2.3

消费者端配置

  • 配置:dubbo.registry.simplified=true
  • 默认:application、version、group 和 dubbo 在默认配置项列表中,所以它们仍然会进入注册中心。
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="https://dubbo.apache.org/schema/dubbo"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
       https://dubbo.apache.org/schema/dubbo https://dubbo.apache.org/schema/dubbo/dubbo.xsd">

    <!-- optional -->
    <dubbo:application name="simplified-registry-xml-consumer"/>

    <dubbo:registry address="zookeeper://127.0.0.1:2181" username="xxx" password="yyy" check="true"/>

    <dubbo:reference id="demoService" interface="org.apache.dubbo.samples.simplified.registry.nosimple.api.DemoService"
                     owner="vvv" retries="4" actives="6" timeout="4500" version="1.2.3" group="dubbo-simple"/>

</beans>

获取 zookeeper 叶子节点的值

consumer%3A%2F%2F30.5.124.149%2Forg.apache.dubbo.samples.simplified.registry.nosimple.api.DemoService%3F
actives%3D6%26application%3Dsimplified-registry-xml-consumer%26category%3D
consumers%26check%3Dfalse%26dubbo%3D2.0.2%26group%3Ddubbo-simple%26owner%3Dvvv%26version%3D1.2.3

方法 2. 配置声明 spring bean

示例位于 dubbo-samples-simplified-registry/dubbo-samples-simplified-registry-annotation 项目下(运行示例前,先运行 ZKClean 清理配置项)

上面示例中 dubbo.properties 的效果是一样的。

  • 默认:timeout 在默认配置项列表中,所以它仍然会进入注册中心;
  • 配置:retries、owner 作为额外的键进入注册中心,所以 retries、owner 也会进入注册中心。

配置类型

-提供者配置 -消费者配置

提供者配置

private side bean 配置
// Equivalent to dubbo.properties configuration, configured in the form of @Bean
@Bean
public RegistryConfig registryConfig() {
    RegistryConfig registryConfig = new RegistryConfig();
    registryConfig.setAddress("zookeeper://127.0.0.1:2181");
    registryConfig.setSimplified(true);
    registryConfig.setExtraKeys("retries,owner");
    return registryConfig;
}
// expose the service
@Service(version = "1.1.8", group = "d-test", executes = 4500, retries = 7, owner = "victanno", timeout = 5300)
public class AnnotationServiceImpl implements AnnotationService {
    @Override
    public String sayHello(String name) {
        System.out.println("async provider received: " + name);
        return "annotation: hello, " + name;
    }
}

消费者配置

它与上面示例中的**消费者端配置**相同。

默认:application、version、group 和 dubbo 在默认配置项列表中,所以它们仍然会进入注册中心。

消费者端 Bean 配置
@Bean
public RegistryConfig registryConfig() {
    RegistryConfig registryConfig = new RegistryConfig();
    registryConfig.setAddress("zookeeper://127.0.0.1:2181");
    registryConfig.setSimplified(true);
    return registryConfig;
  }

消费者服务

@Component("annotationAction")
public class AnnotationAction {

    @Reference(version = "1.1.8", group = "d-test", owner = "vvvanno", retries = 4, actives = 6, timeout = 4500)
    private AnnotationService annotationService;
    public String doSayHello(String name) {
        return annotationService.sayHello(name);
    }
}

注意

如果一个应用程序中同时存在提供者和消费者,则需要将配置合并到

@Bean
public RegistryConfig registryConfig() {
    RegistryConfig registryConfig = new RegistryConfig();
    registryConfig.setAddress("zookeeper://127.0.0.1:2181");
    registryConfig.setSimplified(true);
    //Only valid for provider
    registryConfig.setExtraKeys("retries,owner");
    return registryConfig;
}

提示

此版本也保留了大量的配置项,在下一个版本中,所有配置项将逐步删除。


最后修改时间:2023 年 2 月 9 日:Update docsy to 0.6.0 (#2141) (20081578326)