Dubbo2.7之三大中心

在2.7版本之前,只有注册中心的概念,即:服务提供者、服务消费者以及一些动态配置等信息都放在注册中心,以zk注册中心为例,不同类型的信息通过不同的节点进行区分:providers、consumers、routers、configurators。2.7本版对注册中心进行了细化,将其分为三个部分:注册中心、配置中心、元数据中心,这三个中心可以分别配置。

API配置

简单介绍一下通过API的配置方式,还有一些配置覆盖问题,具体参考官方文档

// 注册中心
@Bean
public RegistryConfig registryConfig() {
    RegistryConfig registryConfig = new RegistryConfig();
    registryConfig.setAddress("zookeeper://localhost:2181");
    // 注册简化版的的url到注册中心
    registryConfig.setSimplified(true);
    return registryConfig;
}


// 元数据中心
@Bean
public MetadataReportConfig metadataReportConfig() {
    MetadataReportConfig metadataReportConfig = new MetadataReportConfig();
    metadataReportConfig.setAddress("zookeeper://localhost:2181");
    return metadataReportConfig;
}


// 配置中心
@Bean
public ConfigCenterConfig configCenterConfig() {
    ConfigCenterConfig configCenterConfig = new ConfigCenterConfig();
    configCenterConfig.setAddress("zookeeper://127.0.0.1:2181");
    return configCenterConfig;
}

注册中心

这个和之前的注册中心概念一致,负责处理服务注册相关,包括服务提供者实例、服务消费者实例等信息;可以单独配置,支持zk、redis、nacos(2.7.1支持);

配置中心

负责存储一些动态配置信息,比如:路由、负载均衡、权重等;支持zk。这里我有一些疑惑,在2.7版本中,在没有配置配置中心的情况下,如果/dubbo/serviceName/routers/xxx 和 中的配置 都配置了一些路由规则信息,实际上生效的是配置中心中的配置。

元数据中心

在dubbo中,不管是provider还是consumer,配置项都非常多,但是很大一部分配置项都是自己使用的(provider的配置项不需要传给consumer,consumer的配置项不需要传给provider),并不需要传给对方,对于这部分数据,并不需要要注册到注册中心,只要持久化存储起来就可以了,要用的时候直接从存储容器中获取。这样可以降低注册中心的网络开销。支持zk和redis。

ZK

  • 添加依赖
<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-metadata-report-zookeeper</artifactId>
</dependency>
  • 在provider和consumer应用中配置MetadataReportConfig
@Bean
public MetadataReportConfig metadataReportConfig() {
    MetadataReportConfig metadataReportConfig = new MetadataReportConfig();
    metadataReportConfig.setAddress("zookeeper://localhost:2181");
    return metadataReportConfig;
}
  • 观察元数据在zk中的数据结构 节点名称如下: /dubbo/metadata/serviceName/provider/appName/service.data。

/dubbo/metadata/org.apache.dubbo.demo.DemoService/provider/dubbo-demo-annotation-provider/service.data

{
    "parameters": {
        "side": "provider",
        "release": "",
        "methods": "sayHello,getUser",
        "deprecated": "false",
        "dubbo": "2.0.2",
        "default.dynamic": "false",
        "interface": "org.apache.dubbo.demo.DemoService",
        "generic": "false",
        "default.deprecated": "false",
        "application": "dubbo-demo-annotation-provider",
        "default.register": "true",
        "dynamic": "false",
        "bean.name": "providers:dubbo:org.apache.dubbo.demo.DemoService",
        "register": "true",
        "anyhost": "true"
    },
    "canonicalName": "org.apache.dubbo.demo.DemoService",
    "codeSource": "file:/D:/Workspace/Dubbo/dubbo-demo/dubbo-demo-interface/target/classes/",
    "methods": [
        {
            "name": "getUser",
            "parameterTypes": [
                "org.apache.dubbo.demo.User"
            ],
            "returnType": "org.apache.dubbo.demo.User"
        },
        {
            "name": "sayHello",
            "parameterTypes": [
                "java.lang.String"
            ],
            "returnType": "java.lang.String"
        }
    ],
    "types": [
        {
            "type": "org.apache.dubbo.demo.Student",
            "properties": {
                "number": {
                    "type": "java.lang.String",
                    "properties": {
                        "coder": {
                            "type": "byte"
                        },
                        "value": {
                            "type": "byte[]"
                        },
                        "hash": {
                            "type": "int"
                        }
                    }
                }
            }
        },
        {
            "type": "org.apache.dubbo.demo.User",
            "properties": {
                "student": {
                    "type": "org.apache.dubbo.demo.Student",
                    "properties": {
                        "number": {
                            "type": "java.lang.String",
                            "properties": {
                                "coder": {
                                    "type": "byte"
                                },
                                "value": {
                                    "type": "byte[]"
                                },
                                "hash": {
                                    "type": "int"
                                }
                            }
                        }
                    }
                },
                "name": {
                    "type": "java.lang.String",
                    "properties": {
                        "coder": {
                            "type": "byte"
                        },
                        "value": {
                            "type": "byte[]"
                        },
                        "hash": {
                            "type": "int"
                        }
                    }
                }
            }
        },
        {
            "type": "byte"
        },
        {
            "type": "java.lang.String",
            "properties": {
                "coder": {
                    "type": "byte"
                },
                "value": {
                    "type": "byte[]"
                },
                "hash": {
                    "type": "int"
                }
            }
        },
        {
            "type": "int"
        }
    ]
}

Redis

  • 添加依赖
<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-metadata-report-redis</artifactId>
</dependency>
  • 在provider和consumer应用中配置MetadataReportConfig
@Bean
public MetadataReportConfig metadataReportConfig() {
    MetadataReportConfig metadataReportConfig = new MetadataReportConfig();
    metadataReportConfig.setAddress("redis://localhost:6379");
    return metadataReportConfig;
}
  • 观察元数据在redis中的数据结构 分别启动provider和consumer,可以在redis中发现多了两个key
// provider
org.apache.dubbo.demo.DemoService:provider:dubbo-demo-annotation-provider.metaData

{
    "parameters": {
        "side": "provider",
        "release": "",
        "methods": "sayHello",
        "deprecated": "false",
        "dubbo": "2.0.2",
        "default.dynamic": "false",
        "interface": "org.apache.dubbo.demo.DemoService",
        "generic": "false",
        "default.deprecated": "false",
        "application": "dubbo-demo-annotation-provider",
        "default.register": "true",
        "dynamic": "false",
        "bean.name": "providers:dubbo:org.apache.dubbo.demo.DemoService",
        "register": "true",
        "anyhost": "true"
    },
    "canonicalName": "org.apache.dubbo.demo.DemoService",
    "codeSource": "file:/D:/Workspace/Dubbo/dubbo-demo/dubbo-demo-interface/target/classes/",
    "methods": [
        {
            "name": "sayHello",
            "parameterTypes": [
                "java.lang.String"
            ],
            "returnType": "java.lang.String"
        }
    ],
    "types": [
        {
            "type": "byte"
        },
        {
            "type": "java.lang.String",
            "properties": {
                "coder": {
                    "type": "byte"
                },
                "value": {
                    "type": "byte[]"
                },
                "hash": {
                    "type": "int"
                }
            }
        },
        {
            "type": "int"
        }
    ]
}


// consumer
org.apache.dubbo.demo.DemoService:consumer:dubbo-demo-annotation-consumer.metaData
{
    "side": "consumer",
    "application": "dubbo-demo-annotation-consumer",
    "release": "",
    "methods": "sayHello",
    "default.lazy": "false",
    "lazy": "false",
    "sticky": "false",
    "dubbo": "2.0.2",
    "interface": "org.apache.dubbo.demo.DemoService",
    "default.sticky": "false"
}

简化的URL

URL简化只是剔除了一些纯粹的查询用的参数,并没有做大刀阔斧的服务发现模型改造,因此精简后的URL完全可以被2.6及以下版本的消费端实现服务发现与调用,同样2.7版本也可以发现和调用低版本的提供者

即使不配置元数据中心,只要设置了简化属性,URL就是简化版的,即使不配置元数据中心,consumer照样可以正常调用

简化之前某个服务的信息:

[dubbo://10.10.134.22:20880/org.apache.dubbo.demo.DemoService?anyhost=true&application=dubbo-demo-annotation-provider&bean.name=providers:dubbo:org.apache.dubbo.demo.DemoService&default.deprecated=false&default.dynamic=false&default.register=true&deprecated=false&dubbo=2.0.2&dynamic=false&generic=false&interface=org.apache.dubbo.demo.DemoService&methods=sayHello&pid=21060&register=true&release=&side=provider&timestamp=1554886868546]

简化之后某个服务的信息,可以看到信息非常简练了

dubbo://10.10.134.22:20880/org.apache.dubbo.demo.DemoService?application=dubbo-demo-annotation-provider&deprecated=false&dubbo=2.0.2&timestamp=1554888232971

dubbo-admin

新版的dubbo-admin已经支持dubbo2.7相关的配置,并且兼容老版本的dubbo,解决方式就是将一些配置信息存储两份:先按老版本的方式存储到,然后再存储一份到配置中心。但是,dubbo-admin中的配置信息展示默认是从配置中心读取的,所以如果之前的服务是老版本,一些动态配置信息并不能直接在dubbo-admin上看到

那么这里会引出一个问题,存储了两份,那哪里的配置才会生效呢? 这个需要根据dubbo来区分,因为配置中心是dubbo2.7才引入的,所以在dubbo2.7及其以上版本中,默认生效的是配置中心的配置;在dubbo2.7以下的版本中,配置中心的配置不生效。以下是几个测试:

2.7版本 ,未开启源数据中心,未开启配置中心

配置了路由规则 1、删除 /dubbo/serviceName/routers 下的东西,consumer调用,此时受路由规则影响; 2、删除 /dubbo/config/serviceName/condi-route下的内容, consumer调用,此时不受路由规则影响; 也就是说,在该版本下,真正起作用的是 /dubbo/config下的路由规则, /dubbo/serviceName/routers 下的路由规则根本不生效

2.7版本 ,开启源数据中心,开启配置中心

结果和上面一样! 在该版本下,保留 /dubbo/serviceName/routers 下的路由规则,删除/dubbo/config下的路由规则,然后重新启动服务,路由规则不会自动注册到 /dubbo/config下;

2.6.5版本,这时候黑白名单不生效,添加的是条件路由(2.7版本是使用黑白名单测试)

1、删除 /dubbo/serviceName/routers 下的东西,consumer调用,此时不受路由规则影响,说明路由规则被删除; 2、删除 /dubbo/config/serviceName/condi-route下的内容, consumer调用,此时受路由规则影响,说明/dubbo/serviceName/routers下的路由规则生效了; 也就是说,在2.7之前的版本,真正起作用的是 /dubbo/serviceName/routers 下的路由规则, /dubbo/config/serviceName/condi-route 下的路由规则根本不生效,因为在2.7之前根本没有配置中心;

在该版本下,保留 /dubbo/serviceName/routers 下的路由规则,删除/dubbo/config下的路由规则,然后重新启动服务,路由规则不会自动注册到 /dubbo/config下;

2.7升级指南

1、使用简化版的URL;不用考兼容性问题;2.7才有的特性; 2、配置元数据中心;2.7之后开始支持;如果之前之前使用的是老dubbo版本,配置了源数据中心也不会生效,需要升级到2.7;

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区