热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

dubbo的基于java的路由_1|Dubbo:探讨标签路由的实现

对Dubbo进行了一次功能调研,主要集中在服务治理中的标签路由。这部分的内容不难,但是能够对Dubbo的实现有一定的了解。环境搭建需要ZooKeeper

d1a584105e646c6e2e723456a959ee35.png

对 Dubbo 进行了一次功能调研,主要集中在服务治理中的标签路由。这部分的内容不难,但是能够对 Dubbo 的实现有一定的了解。

环境搭建

需要 ZooKeeper、Java Application Based on Dubbo。

ZooKeeper 的搭建

通过 CODING CD,在腾讯云的弹性伸缩组上(有兴趣可到 CODING CD 中详细了解),部署的一个实例,需要先安装 java 依赖,如下:

java-1.8.0-openjdk-devel.x86_64

其主要的配置是一个脚本,如下:

wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.6.1/apache-zookeeper-3.6.1-bin.tar.gz

tar -xzvf apache-zookeeper-3.6.1-bin.tar.gz

mv apache-zookeeper-3.6.1-bin zk

mv zk/conf/zoo_sample.cfg zk/conf/zoo.cfg

echo '''[Unit]

Description=ZooKeeper for Dubbo

After=network.target

[Service]

Type=forking

ExecStart=/bin/sh /root/zk/bin/zkServer.sh start

ExecStop=/bin/sh /root/zk/bin/zkServer.sh stop

User=root

[Install]

WantedBy=multi-user.target ''' > /usr/lib/systemd/system/zk-for-dubbo.service

systemctl enable zk-for-dubbo

在安全组中确保端口 2181 开放。此时:

公网 IP 为 49.233.238.170

内网 IP 为 172.21.0.34

Java Application Based on Dubbo

A 模块在调用 B 模块前,设置了一个 TAG_KEY,表示选择带有 TAG_KEY 的 B 服务:

@Reference

private DoSomeThingService doSomeThingService;

public String sayHello() {

RpcContext.getContext().setAttachment(CommonConstants.TAG_KEY, "tag1");

return doSomeThingService.sayHello();

}

应用的部署还是采用 CODING CD 部署在腾讯云的弹性伸缩组上。主要的配置如下:

A 模块启动:

java -jar -Ddubbo.registry.address=zookeeper://172.21.0.34:2181 /root/a.jar 2>&1 &

B 模块启动:

java -jar -Ddubbo.registry.address=zookeeper://172.21.0.34:2181 /root/b.jar 2>&1 &

Dubbo admin 安装与配置

dubbo-admin 使用的 github 中 develop 的最新版,按照相应的提示进行构建即可。

启动 dubbo-admin 的前端,此时的目录为 dubbo-admin/dubbo-admin-ui

npm run dev

启动 dubbo-admin 的后端,此时的目录为 dubbo-admin/dubbo-admin-server

修改 dubbo-admin/dubbo-admin-server/src/main/resources/application.properties 文件,改成正确的 zookeeper 地址。

admin.registry.address=zookeeper://49.233.238.170:2181

admin.config-center=zookeeper://49.233.238.170:2181

admin.metadata-report.address=zookeeper://49.233.238.170:2181

编译并启动

mvn clean package -DskipTests=true

cd target

java -jar dubbo-admin-server-0.2.0-SNAPSHOT.jar

打开 dubbo-admin,找到标签路由,配置如下,应用名填写 moduleb:

enabled: true

force: true

runtime: true

tags:

- name: tag1

addresses:

- '172.21.0.40:20880'

- name: tag2

addresses: null

TIPS

如果有遇到在 Dubbo Admin 中修改不生效的情况,考虑一下 Dubbo Admin 与 Dubbo 版本间的差异。在此踩到一个坑如下:

Dubbo Admin 管理页面是用 docker 跑起来的,它里面的源代码比较旧,路由设置到 zk 中的路径与 dubbo 读取 zk 的路径不一样。ISSUE 可见:https://github.com/apache/dubbo-admin/issues/577

效果展示

请求流向:LB -> A -> B

A 中设置的 TAG_KEY 为:

public String sayHello() {

RpcContext.getContext().setAttachment(CommonConstants.TAG_KEY, "tag1");

return doSomeThingService.sayHello();

}

此时 B 模块服务有两个,即一个新、一个旧。

8c9e064e4458dabb914771c8358d9abf.png

如果要只返回最新版本,可在 dubbo-admin 控制台的服务治理中,添加标签路由,新的实例在 tag1 下,旧的实例在 tag2 下,如下:

enabled: true

force: true

runtime: true

tags:

- name: tag1

addresses:

- '172.21.0.21:20880'

- name: tag2

addresses:

- '172.21.0.40:20880'

此时的返回如下:

0edcf3312afe91ab05236c380a435bd5.png

如果只使用旧版本实例,可在将上面 tag1 和 tag2 下面的内容调换即可,此时返回如下:

236ac6c2434b6bedc87e577d8fb55696.png

如果要同时能够访问到新旧实例的内容,将上述配置中所有的 IP 全部填写到 tag1 下即可,此时的返回如下:

5eb7df9f10a362bb45be0fe9ba1c7078.png

Dubbo 标签路由的实现原理

总共分三个大的方面,分别是配置的存储、配置同步、如何解析配置。

标签路由配置的存储

URL: /api/dev/rules/route/tag/moduleb

Request Method: PUT

在 dubbo-admin-server 中它的实现在文件 TagRoutesController.java 中,最终是将配置保存到 ZooKeeper 中,保存的路径为:

58f16ce1c4ca33ae2c91945be05a022f.png

即:/dubbo/config/dubbo/moduleb.tag-router

在 ZooKeeper 中可以在相应的路径下看到相关的配置,如下:

5b953ee59781cb92bf45f832208b160f.png

配置变更同步

在 TagRouter.java 中实现了 ConfigurationListener 接口,当配置变更时,会更新 tagRouterRule。

@Override

public synchronized void process(ConfigChangedEvent event) {

if (logger.isDebugEnabled()) {

logger.debug("Notification of tag rule, change type is: " + event.getChangeType() + ", raw rule is:\n " +

event.getContent());

}

try {

if (event.getChangeType().equals(ConfigChangeType.DELETED)) {

this.tagRouterRule = null;

} else {

this.tagRouterRule = TagRuleParser.parse(event.getContent());

}

} catch (Exception e) {

logger.error("Failed to parse the raw tag router rule and it will not take effect, please check if the " +

"rule matches with the template, the raw rule is:\n ", e);

}

}

配置解析

源码位于 dubbo 中的 TagRouter.java

66b0a18939f8d9beb0b1614123a75d95.png

结语

在上面的示例中,我们需要手动在 dubbo-admin 界面中,新增标签路由的配置,但经过对该配置的新增过程的简要分析,发现只是在 ZooKeeper 中新增一条记录。



推荐阅读
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 解决Sharepoint 2013运行状况分析出现的“一个或多个服务器未响应”问题的方法
    本文介绍了解决Sharepoint 2013运行状况分析中出现的“一个或多个服务器未响应”问题的方法。对于有高要求的客户来说,系统检测问题的存在是不可接受的。文章详细描述了解决该问题的步骤,包括删除服务器、处理分布式缓存留下的记录以及使用代码等方法。同时还提供了相关关键词和错误提示信息,以帮助读者更好地理解和解决该问题。 ... [详细]
  • Hadoop2.6.0 + 云centos +伪分布式只谈部署
    3.0.3玩不好,现将2.6.0tar.gz上传到usr,chmod-Rhadoop:hadophadoop-2.6.0,rm掉3.0.32.在etcp ... [详细]
  • struts2重点——ValueStack和OGNL
    一、值栈(ValueStack)1.实现类:OGNLValueStack2.对象栈:CompoundRoot( ... [详细]
  • 精讲代理设计模式
    代理设计模式为其他对象提供一种代理以控制对这个对象的访问。代理模式实现原理代理模式主要包含三个角色,即抽象主题角色(Subject)、委托类角色(被代理角色ÿ ... [详细]
  • mapreduce源码分析总结
    这篇文章总结的非常到位,故而转之一MapReduce概述MapReduce是一个用于大规模数据处理的分布式计算模型,它最初是由Google工程师设计并实现的ÿ ... [详细]
  • NFS文件共享系统
    1、概述:NFS(NetworkFileSystem)意为网络文件系统,它最大的功能就是可以通过网络,让不同的机器不同的操作系统可以共享 ... [详细]
author-avatar
手机用户2602883667
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有