目录
1、dubbo-admin-2.7.x版本安装部署
1.1 下载源码
dubbo-admin-2.5.x版本是现阶段官方推荐应用到生产的,但是缺陷太多,特别是对于服务治理这一块,2.7.x版本完善了很多,但是官方并没有推荐生产使用,不过我觉得能不能用于生产,根据自己的情况来,够用就行(bug很多,但是留有对应的后门API)
先下载dubbo-admin-2.7.x源码:https://github.com/apache/dubbo-admin
官网地址:http://dubbo.apache.org/zh-cn/docs/2.7/user/quick-start/
2.7版本作者基于springboot开发的,而且做了前后端分离!
1.2 部署访问
修改zookeeper地址配置,找到\dubbo-admin-develop\dubbo-admin-server\src\main\resources\application.properties:
admin.registry.address=zookeeper://192.168.223.128:2181
admin.config-center=zookeeper://192.168.223.128:2181
admin.metadata-report.address=zookeeper://192.168.223.128:2181
admin.root.user.name=root
admin.root.user.password=root
在主目录dubbo-admin-develop目录下,执行mvn clean package -Dmaven.test.skip=true,第一次会比较慢,因为前端使用了vue.js和node.js,所以你本地没有安装npm的会自定下载安装,慢慢等:
因为使用了springboot,所以不再依赖tomcat容器,有两种方式启动
一种方法启动 :
mvn --projects dubbo-admin-server spring-boot:run
二种方法启动:
cd dubbo-admin-distribution/target
java -jar dubbo-admin-0.1.jar
2、路由规则
2.1 Dubbo API配置
需求背景:
我们现在有一个服务A, 需要暴露在同一个zookeeper上面, 但是注册到zookeeper的地址需要有公网和内网两种, 但是我又不想在代码中做修改.
需求说明:
同一个服务需要提供内网和公网地址的原因是: 我们有服务B所在的机器只能通过外网去访问服务A, 但是外网访问会受到带宽的限制. 但是服务A的请求量又很大, 因此, 我就希望除了服务B以外的机器都通过内网去访问服务A, 这样就解决了带宽上面的限制.
但是, 服务A的集群是在同一个zookeeper下面的. 所以, 我就必须指定服务B去访问服务A的外网地址的dubbo服务.
这里有一个方案: 就是我使用两个不同的zookeeper, 外网地址的服务A注册到zookeeper-1上面, 内网地址的注册到zookeeper-2上面. 这样也是可以解决上面指定服务B访问服务A的问题.
但是, 我们上了监控, 监控是监控一个zookeeper地址的服务, 所以, 我就不能有多个zookeeper, 这样会加大复杂度. 这个时候, 路由规则是一个好东西
路由规则在发起一次RPC调用前起到过滤目标服务器地址的作用,过滤后的地址列表,将作为消费端最终发起RPC调用的备选地址。
-
条件路由。支持以服务或Consumer应用为粒度配置路由规则。
-
标签路由。以Provider应用为粒度配置路由规则。
@Test
public void test() throws UnknownHostException {
RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
Registry registry = registryFactory.getRegistry(URL.valueOf("zookeeper://192.168.223.128:2181"));
registry.register(URL.valueOf("condition://0.0.0.0/com.ydt.dubbo.service.LoadBalanceService?category=routers&dynamic=false&rule="
+ URL.encode("host = 192.168.223.* => host = 192.168.224.*")));
}
其中:
-
route://
表示路由规则的类型,支持条件路由规则和脚本路由规则,可扩展,必填。 -
0.0.0.0
表示对所有 IP 地址生效,如果只想对某个 IP 的生效,请填入具体 IP,必填。 -
com.ydt.dubbo.service.LoadBalanceService
表示只对指定服务生效,必填。 -
group=loadbalance
对指定服务的指定group生效,不填表示对未配置group的指定服务生效 -
version=1.0
对指定服务的指定version生效,不填表示对未配置version的指定服务生效 -
category=routers
表示该数据为动态配置类型,必填。 -
dynamic=false
表示该数据为持久数据,当注册方退出时,数据依然保存在注册中心,必填。 -
enabled=true
覆盖规则是否生效,可不填,缺省生效。 -
force=false
当路由结果为空时,是否强制执行,如果不强制执行,路由结果为空的路由规则将自动失效,可不填,缺省为false
。 -
runtime=false
是否在每次调用时执行路由规则,否则只在提供者地址列表变更时预先执行并缓存结果,调用时直接从缓存中获取路由结果。如果用了参数路由,必须设为true
,需要注意设置会影响调用的性能,可不填,缺省为false
。 -
priority=1
路由规则的优先级,用于排序,优先级越大越靠前执行,可不填,缺省为0
。 -
rule=URL.encode("host = 192.168.223.* => host = 192.168.224.*")
表示路由规则的内容,必填。
条件路由规则
基于条件表达式的路由规则,如:host = 192.168.223.* => host = 192.168.224.*
规则:
-
=>
之前的为消费者匹配条件,所有参数和消费者的 URL 进行对比,当消费者满足匹配条件时,对该消费者执行后面的过滤规则。 -
=>
之后为提供者地址列表的过滤条件,所有参数和提供者的 URL 进行对比,消费者最终只拿到过滤后的地址列表。 -
如果匹配条件为空,表示对所有消费方应用,如:
=> host = 192.168.224.*
-
如果过滤条件为空,表示禁止访问,如:
host = 192.168.223.* =>
2.2 管理控制台配置
使用API进行配置非常不好理解,而且也做不到动态的修改,所以实际生产中大多时候还是通过管理控制台进行动态配置,特别是对于运维人员来说
2.2.1 条件路由
在Dubbo2.6及更早版本中,所有的服务治理规则都只针对服务粒度,如果要把某条规则作用到应用粒度上,需要为应用下的所有服务配合相同的规则,变更,删除的时候也需要对应的操作,这样的操作很不友好,因此Dubbo2.7版本中增加了应用粒度的服务治理操作,对于条件路由(包括黑白名单),动态配置(包括权重,负载均衡)都