簡化註冊資訊
功能描述
Dubbo 提供者中的服務配置項有近 30 個配置項。除去註冊中心服務治理需要的,很大一部分配置項都是提供者自身使用的,不需要透明傳遞給消費者。這部分數據不需要進入註冊中心,只需要以鍵值對的形式持久化存儲即可。
Dubbo 消費者中的配置項也有 20 多個配置項。在註冊中心,服務消費者列表中只需要關注應用、版本、分組、ip、dubbo 版本等少量配置,其他配置也可以鍵值對形式持久化存儲。這些數據是以服務的維度註冊到註冊中心的,導致數據量膨脹,進而導致註冊中心(如 zookeeper)網絡開銷增大,性能下降。
設計目標
希望簡化進入註冊中心的提供者和消費者配置數量。預計某些配置項將以其他形式存儲。這些配置項需要滿足:不在服務調用鏈路上,並且這些配置項不在註冊中心的 核心鏈路(服務查詢,服務列表)上。
配置
簡化註冊中心的配置,僅在 2.7 之後的版本中支持。啟用提供者或消費者簡化配置後,默認保留的配置項如下
提供者
常量鍵 | 鍵 | 備註 |
---|---|---|
APPLICATION_KEY | 應用程式 | |
編解碼器鍵值 (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) | |
Dubbo 版本鍵值 (DUBBO_VERSION_KEY) | Dubbo (dubbo) | |
發布鍵值 (RELEASE_KEY) | 發布 (release) | |
端鍵值 (SIDE_KEY) | 端 (side) |
消費者 (consumer)
常量鍵 | 鍵 | 備註 |
---|---|---|
APPLICATION_KEY | 應用程式 | |
版本鍵值 (VERSION_KEY) | 版本 (version) | |
群組鍵值 (GROUP_KEY) | 群組 (group) | |
Dubbo 版本鍵值 (DUBBO_VERSION_KEY) | Dubbo (dubbo) |
常數鍵值代表 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
可以看到有:executes
、retries
、owner
、timeout
。但並非所有這些欄位都需要傳遞給 Dubbo Ops 或 Dubbo 消費者。同樣地,消費者也存在這個問題,可以透過啟動範例中消費者的主要方法來檢視。
方法一:配置 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.dev.org.tw/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.dev.org.tw/schema/dubbo https://dubbo.dev.org.tw/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.dev.org.tw/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.dev.org.tw/schema/dubbo https://dubbo.dev.org.tw/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
方法二:配置宣告 Spring Bean
範例位於 dubbo-samples-simplified-registry/dubbo-samples-simplified-registry-annotation 專案下(執行範例前,請先執行 ZKClean 清理配置項目)
效果與上述範例中的 dubbo.properties 相同。
- 預設:timeout 位於預設配置項列表中,因此仍會進入註冊中心;
- 配置:retries、owner 作為額外鍵值進入註冊中心,因此 retries、owner 也會進入註冊中心。
配置類型
- 提供者配置 - 消費者配置
提供者配置
私有端 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;
}
提示
此版本還保留了大量的配置項,在下一個版本中,所有配置項都將逐步刪除。