Dubbo Ops条件路由实战

Dubbo的服务智能容错包括服务目录、服务路由和负载均衡这三个部分。服务目录的作用是存储一个接口的invoker的集合,并且随着配置信息的更新而自动更新。而服务路由则是从服务目录的involer集合中,根据路由规则筛选出一个子集。而负载均衡则是在服务路由筛选出的子集中去做负载均衡。

服务路由不是在一个服务的提供者端或者消费者端进行配置的,而是通过在配置中心中写入配置信息,消费者会自动接收到通知。

Dubbo Ops是新一代的Dubbo服务治理控制台,通过它可以对服务进行管理,包括服务查询,服务治理(条件路由、标签路由、黑白名单、负载均衡等),服务测试、服务mock、统计、配置管理等。

下面就介绍一个demo,看如何用Dubbo Ops对Dubbo服务进行路由。本文使用的操作系统是macOS

一.搭建应用:

1.下载zookeeper,作为服务注册中心和配置中心。并进入bin目录,执行命令:

./zkServer.sh start

启动zookeeper服务

2.下载Dubbo源码,Dubbo源码中包含demo模块,可直接使用,避免自己搭建服务的麻烦。此处下载的是2.7.1-SNAPSHOT版本,使用master分支。

使用demo模块中的xml配置模块,修改spring配置文件中,registry的配置修改为

<dubbo:registry address="zookeeper://127.0.0.1:2181" />

(因为zookeeper默认的端口为2181)

3.启动provider。

二.搭建Dubbo Ops

1.下载Dubbo Ops源代码,下载地址为:

https://github.com/apache/incubator-dubbo-ops

可以直接下载zip包,也可以使用git。

2.运行Dubbo Ops的后台服务。Dubbo Ops分为后台和前端两个独立的模块。后台是一个标准的Spring Boot项目,可以在Java IDE中直接运行。

3.运行Dubbo Ops的前端服务。Dubbo Ops的前端使用node构建。运行方式为从终端进入前端项目的根目录,执行以下命令:

npm run dev

此处可能会出现很多报错,可能是权限不足,此时需要使用sudo。或者是缺少很多node的module,当出现这种报错时,可以手动安装缺失的module。具体命令可以搜索得到。

此时打开:

http://localhost:8081

并选择服务查询菜单,可看到已经注册的服务。

三.配置条件路由

引用dubbo官方文档的内容:

条件路由规则由两个条件组成,分别用于对服务消费者和提供者进行匹配。比如有这样一条规则:

host = 10.20.153.10 => host = 10.20.153.11

该条规则表示 IP 为 10.20.153.10 的服务消费者只可调用 IP 为 10.20.153.11 机器上的服务,不可调用其他机器上的服务。条件路由规则的格式如下:

[服务消费者匹配条件] => [服务提供者匹配条件]

如果服务消费者匹配条件为空,表示不对服务消费者进行限制。如果服务提供者匹配条件为空,表示对某些服务消费者禁用服务。官方文档中对条件路由进行了比较详细的介绍,大家可以参考下,这里就不过多说明了。

条件路由实现类 ConditionRouter 在进行工作前,需要先对用户配置的路由规则进行解析,得到一系列的条件。然后再根据这些条件对服务进行路由。

在Dubbo Ops进行配置:

Dubbo在2.7版本之后可从服务或应用两个维度进行配置。此处是从服务维度。配置的规则的含义是从192.168.10.102(我的机器在局域网内的ip)这个消费者发起的调用,只有ip为172.22.3.91(随意输入的ip)的提供者才能被调用成功。

四.从消费者发起调用。运行consumer模块的Application类的main方法。运行日志会出现关于条件路由的信息:

同时调用失败,报错信息如下:

异常堆栈:

Exception in thread "main" org.apache.dubbo.rpc.RpcException: Failed to invoke the method sayHello in the service org.apache.dubbo.demo.DemoService. No provider available for the service org.apache.dubbo.demo.DemoService from registry 127.0.0.1:2181 on the consumer 192.168.10.102 using the dubbo version . Please check if the providers have been started and registered.
    at org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker.checkInvokers(AbstractClusterInvoker.java:265)
    at org.apache.dubbo.rpc.cluster.support.FailoverClusterInvoker.doInvoke(FailoverClusterInvoker.java:57)
    at org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker.invoke(AbstractClusterInvoker.java:242)
    at org.apache.dubbo.rpc.cluster.support.wrapper.MockClusterInvoker.invoke(MockClusterInvoker.java:76)
    at org.apache.dubbo.rpc.proxy.InvokerInvocationHandler.invoke(InvokerInvocationHandler.java:57)
    at org.apache.dubbo.common.bytecode.proxy0.sayHello(proxy0.java)
    at org.apache.dubbo.demo.consumer.Application.main(Application.java:37)

可见,因为运行中的提供者不满足路由条件,所以被过滤掉了,没有出现在可用的invoker列表中。又因为没有其他的invoker,所以报了这个错。

如果去掉这个条件路由,再次执行,会发现可以正常调用服务。

五.其他问题:

通过实验,发现应用维度的条件路由不会生效。原因不明,如果以后hack代码知道之后,再更新说明。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章