美文网首页Dubbo
Dubbo2.7之三大中心

Dubbo2.7之三大中心

作者: spilledyear | 来源:发表于2019-04-15 23:02 被阅读20次

    在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;

    相关文章

      网友评论

        本文标题:Dubbo2.7之三大中心

        本文链接:https://www.haomeiwen.com/subject/vbrgvqtx.html