元数据中心扩展

设计目的

请参见 元数据中心手册

扩展接口

  • org.apache.dubbo.metadata.store.MetadataReportFactory
  • org.apache.dubbo.metadata.store.MetadataReport

已知扩展

实现原理

SPI定义

参考:org.apache.dubbo.metadata.store.MetadataReportFactory,org.apache.dubbo.metadata.store.MetadataReport

  1. @SPI("redis")
  2. public interface MetadataReportFactory {
  3. @Adaptive({"protocol"})
  4. MetadataReport getMetadataReport(URL url);
  5. }

自定义元数据的存储

下面以Redis存储为例进行说明。

新建一个project,需要支持以下修改:

扩展AbstractMetadataReport

  1. public class RedisMetadataReport extends AbstractMetadataReport {
  2. private final static Logger logger = LoggerFactory.getLogger(RedisMetadataReport.class);
  3. final JedisPool pool;
  4. public RedisMetadataReport(URL url) {
  5. super(url);
  6. pool = new JedisPool(new JedisPoolConfig(), url.getHost(), url.getPort());
  7. }
  8. @Override
  9. protected void doStoreProviderMetadata(ProviderMetadataIdentifier providerMetadataIdentifier, String serviceDefinitions) {
  10. this.storeMetadata(providerMetadataIdentifier, serviceDefinitions);
  11. }
  12. @Override
  13. protected void doStoreConsumerMetadata(ConsumerMetadataIdentifier consumerMetadataIdentifier, String value) {
  14. this.storeMetadata(consumerMetadataIdentifier, value);
  15. }
  16. private void storeMetadata(MetadataIdentifier metadataIdentifier, String v) {
  17. try (Jedis jedis = pool.getResource()) {
  18. jedis.set(metadataIdentifier.getIdentifierKey() + META_DATA_SOTRE_TAG, v);
  19. } catch (Throwable e) {
  20. logger.error("Failed to put " + metadataIdentifier + " to redis " + v + ", cause: " + e.getMessage(), e);
  21. throw new RpcException("Failed to put " + metadataIdentifier + " to redis " + v + ", cause: " + e.getMessage(), e);
  22. }
  23. }
  24. }

扩展 AbstractMetadataReportFactory

  1. public class RedisMetadataReportFactory extends AbstractMetadataReportFactory {
  2. @Override
  3. public MetadataReport createMetadataReport(URL url) {
  4. return new RedisMetadataReport(url);
  5. }
  6. }

增加 MetadataReportFactory

META-INF/dubbo/internal/org.apache.dubbo.metadata.store.MetadataReportFactory

  1. redis=org.apache.dubbo.metadata.store.redis.RedisMetadataReportFactory

只要将上面的修改和project打包成jar包,然后配置元数据中心的url:redis://10.20.153.10:6379。

至此,一个自定义的元数据存储就可以运行了。

最后修改 December 16, 2022: Fix check (#1736) (97972c1)