在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®ister=true&release=&side=provider×tamp=1554886868546]
简化之后某个服务的信息,可以看到信息非常简练了
dubbo://10.10.134.22:20880/org.apache.dubbo.demo.DemoService?application=dubbo-demo-annotation-provider&deprecated=false&dubbo=2.0.2×tamp=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;
网友评论