Dubbo3 注冊(cè)信息簡(jiǎn)化

2022-04-11 16:08 更新

減少注冊(cè)中心上服務(wù)的注冊(cè)數(shù)據(jù)

背景

Dubbo provider 中的服務(wù)配置項(xiàng)有接近 30 個(gè)配置項(xiàng)。 排除注冊(cè)中心服務(wù)治理需要之外,很大一部分配置項(xiàng)是 provider 自己使用,不需要透?jìng)鹘o消費(fèi)者。這部分?jǐn)?shù)據(jù)不需要進(jìn)入注冊(cè)中心,而只需要以 key-value 形式持久化存儲(chǔ)。

Dubbo consumer 中的配置項(xiàng)也有 20+個(gè)配置項(xiàng)。在注冊(cè)中心之中,服務(wù)消費(fèi)者列表中只需要關(guān)注 application,version,group,ip,dubbo 版本等少量配置,其他配置也可以以 key-value 形式持久化存儲(chǔ)。

這些數(shù)據(jù)是以服務(wù)為維度注冊(cè)進(jìn)入注冊(cè)中心,導(dǎo)致了數(shù)據(jù)量的膨脹,進(jìn)而引發(fā)注冊(cè)中心(如 zookeeper)的網(wǎng)絡(luò)開(kāi)銷增大,性能降低。

現(xiàn)有功能 sample

當(dāng)前現(xiàn)狀一個(gè)簡(jiǎn)單展示。通過(guò)這個(gè)展示,分析下為什么需要做簡(jiǎn)化配置。

參考 sample 子工程: dubbo-samples-simplified-registry/dubbo-samples-simplified-registry-nosimple (跑 sample 前,先跑下 ZKClean 進(jìn)行配置項(xiàng)清理)

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"/>

啟動(dòng) provider 的 main 方法之后,查看 zookeeper 的葉子節(jié)點(diǎn)(路徑為:/dubbo/org.apache.dubbo.samples.simplified.registry.nosimple.api.DemoService/providers 目錄下)的內(nèi)容如下:

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%26**executes**%3D4500%26generic%3Dfalse%26group%3Ddubbo-simple%26interface%3D
org.apache.dubbo.samples.simplified.registry.nosimple.api.DemoService%26methods%3D
sayHello%26**owner**%3Dvict%26pid%3D2767%26**retries**%3D7%26revision%3D1.2.3%26side%3D
provider%26**timeout**%3D5300%26timestamp%3D1542361152795%26valid%3Dtrue%26version%3D1.2.3

從加粗字體中能看到有:executes, retries, owner, timeout。但是這些字段不是每個(gè)都需要傳遞給 dubbo ops 或者 dubbo consumer。 同樣的,consumer 也有這個(gè)問(wèn)題,可以在例子中啟動(dòng) Consumer 的 main 方法進(jìn)行查看。

設(shè)計(jì)目標(biāo)和宗旨

期望簡(jiǎn)化進(jìn)入注冊(cè)中心的 provider 和 consumer 配置數(shù)量。 期望將部分配置項(xiàng)以其他形式存儲(chǔ)。這些配置項(xiàng)需要滿足:不在服務(wù)調(diào)用鏈路上,同時(shí)這些配置項(xiàng)不在注冊(cè)中心的核心鏈路上(服務(wù)查詢,服務(wù)列表)。

配置

簡(jiǎn)化注冊(cè)中心的配置,只在 2.7 之后的版本中進(jìn)行支持。 開(kāi)啟 provider 或者 consumer 簡(jiǎn)化配置之后,默認(rèn)保留的配置項(xiàng)如下:

provider:

Constant Key Key remark
APPLICATION_KEY application
CODEC_KEY codec
EXCHANGER_KEY exchanger
SERIALIZATION_KEY serialization
CLUSTER_KEY cluster
CONNECTIONS_KEY connections
DEPRECATED_KEY deprecated
GROUP_KEY group
LOADBALANCE_KEY loadbalance
MOCK_KEY mock
PATH_KEY path
TIMEOUT_KEY timeout
TOKEN_KEY token
VERSION_KEY version
WARMUP_KEY warmup
WEIGHT_KEY weight
TIMESTAMP_KEY timestamp
DUBBO_VERSION_KEY dubbo
SPECIFICATION_VERSION_KEY specVersion 新增,用于表述dubbo版本,如2.7.0

consumer:

Constant Key Key remark
APPLICATION_KEY application
VERSION_KEY version
GROUP_KEY group
DUBBO_VERSION_KEY dubbo
SPECIFICATION_VERSION_KEY specVersion 新增,用于表述dubbo版本,如2.7.0

Constant Key 表示來(lái)自于類 org.apache.dubbo.common.Constants 的字段。

下面介紹幾種常用的使用方式。所有的 sample,都可以查看sample-2.7

方式1. 配置dubbo.properties

sample 在 dubbo-samples-simplified-registry/dubbo-samples-simplified-registry-xml 工程下 (跑 sample 前,先跑下ZKClean 進(jìn)行配置項(xiàng)清理)

dubbo.properties

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

怎么去驗(yàn)證呢?

provider端驗(yàn)證

provider端配置

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://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
       http://dubbo.apache.org/schema/dubbo http://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 的葉子節(jié)點(diǎn)的值如下:

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%26**owner**%3D
vict%26**retries**%3D7%26**timeout**%3D5300%26timestamp%3D1542594503305%26version%3D1.2.3

和上面的現(xiàn)有功能 sample進(jìn)行對(duì)比,上面的 sample 中,executes, retries, owner, timeout 四個(gè)配置項(xiàng)都進(jìn)入了注冊(cè)中心。但是本實(shí)例不是:

  • 配置了:dubbo.registry.simplified=true, 默認(rèn)情況下,timeout 在默認(rèn)的配置項(xiàng)列表,所以還是會(huì)進(jìn)入注冊(cè)中心;
  • 配置了:dubbo.registry.extra-keys=retries,owner , 所以 retries,owner 也會(huì)進(jìn)入注冊(cè)中心。

總結(jié):timeout,retries,owner 進(jìn)入了注冊(cè)中心,而 executes 沒(méi)有進(jìn)入。

consumer 端配置

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://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
       http://dubbo.apache.org/schema/dubbo http://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 的葉子節(jié)點(diǎn)的值如下:

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
  • 配置了:dubbo.registry.simplified=true , 默認(rèn)情況下,application,version,group,dubbo 在默認(rèn)的配置項(xiàng)列表,所以還是會(huì)進(jìn)入注冊(cè)中心;

方式2. 聲明spring bean

sample在dubbo-samples-simplified-registry/dubbo-samples-simplified-registry-annotation 工程下 (跑 sample 前,先跑下ZKClean 進(jìn)行配置項(xiàng)清理)

Provider配置

privide 端 bean 配置:

// 等同于dubbo.properties配置,用@Bean形式進(jìn)行配置
@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;
}
// 暴露服務(wù)
@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;
    }
}

和上面 sample 中的 dubbo.properties 的效果是一致的。結(jié)果如下:

  • 默認(rèn)情況下,timeout 在默認(rèn)的配置項(xiàng)列表,所以還是會(huì)進(jìn)入注冊(cè)中心;
  • 配置了 retries,owner 作為額外的 key 進(jìn)入注冊(cè)中心 , 所以 retries,owner 也會(huì)進(jìn)入注冊(cè)中心。

總結(jié):timeout,retries,owner 進(jìn)入了注冊(cè)中心,而 executes 沒(méi)有進(jìn)入。

Consumer配置

consumer 端 bean 配置:

@Bean
public RegistryConfig registryConfig() {
    RegistryConfig registryConfig = new RegistryConfig();
    registryConfig.setAddress("zookeeper://127.0.0.1:2181");
    registryConfig.setSimplified(true);
    return registryConfig;
  }

消費(fèi)服務(wù):

@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);
    }
}

和上面 sample 中 consumer 端的配置是一樣的。結(jié)果如下:

  • 默認(rèn)情況下,application,version,group,dubbo 在默認(rèn)的配置項(xiàng)列表,所以還是會(huì)進(jìn)入注冊(cè)中心。

注意:

如果一個(gè)應(yīng)用中既有provider又有consumer,那么配置需要合并成:

@Bean
public RegistryConfig registryConfig() {
    RegistryConfig registryConfig = new RegistryConfig();
    registryConfig.setAddress("zookeeper://127.0.0.1:2181");
    registryConfig.setSimplified(true);
    //只對(duì)provider生效
    registryConfig.setExtraKeys("retries,owner");
    return registryConfig;
}

后續(xù)規(guī)劃 

本版本還保留了大量的配置項(xiàng),接下來(lái)的版本中,會(huì)逐漸刪除所有的配置項(xiàng)。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)