前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Dubbo2.7之三大中心

Dubbo2.7之三大中心

作者头像
spilledyear
发布2019-04-22 11:03:51
1.8K0
发布2019-04-22 11:03:51
举报
文章被收录于专栏:小白鼠

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

API配置

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

代码语言:javascript
复制
// 注册中心
@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

  • 添加依赖
代码语言:javascript
复制
<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-metadata-report-zookeeper</artifactId>
</dependency>
  • 在provider和consumer应用中配置MetadataReportConfig
代码语言:javascript
复制
@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

代码语言:javascript
复制
{
    "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

  • 添加依赖
代码语言:javascript
复制
<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-metadata-report-redis</artifactId>
</dependency>
  • 在provider和consumer应用中配置MetadataReportConfig
代码语言:javascript
复制
@Bean
public MetadataReportConfig metadataReportConfig() {
    MetadataReportConfig metadataReportConfig = new MetadataReportConfig();
    metadataReportConfig.setAddress("redis://localhost:6379");
    return metadataReportConfig;
}
  • 观察元数据在redis中的数据结构 分别启动provider和consumer,可以在redis中发现多了两个key
代码语言:javascript
复制
// 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照样可以正常调用

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

代码语言:javascript
复制
[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]

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

代码语言:javascript
复制
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;

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.04.15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • API配置
  • 注册中心
  • 配置中心
  • 元数据中心
    • ZK
      • Redis
      • 简化的URL
      • dubbo-admin
        • 2.7版本 ,未开启源数据中心,未开启配置中心
          • 2.7版本 ,开启源数据中心,开启配置中心
            • 2.6.5版本,这时候黑白名单不生效,添加的是条件路由(2.7版本是使用黑白名单测试)
            • 2.7升级指南
            相关产品与服务
            云数据库 Redis
            腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档