dubbo中的zk可以由别的来代替吗?

2020-08-24 21:15发布

2条回答
无需指教
2楼 · 2020-08-25 08:39

zookeeper是分布式服务架构,主要用来解决分布式应用中经常遇到的一些数据管理问题,比如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。

zookeeper上节点最常用的5种操作权限:

Create、Read、Write、Delete、Admin也就是增、删、改、查、管理权限,简写crwda

(这五种权限中,delete是指对子节点删除权限,其他四种权限指本身节点权限)

身份验证有4中方式:

  • world:有个单一的ID,anyone,表示任何人。

  • auth:不使用任何ID,表示任何通过验证的用户(是通过ZK验证的用户?连接到此ZK服务器的用户?)。

  • digest:使用 用户名:密码
    字符串生成MD5哈希值作为ACL标识符ID。权限的验证通过直接发送用户名密码字符串的方式完成,

  • ip:使用客户端主机ip地址作为一个ACL标识符,ACL表达式是以 addr/bits
    这种格式表示的。ZK服务器会将addr的前bits位与客户端地址的前bits位来进行匹配验证权限。

看到了授权需要的模式是secheme????perm形式,下面就说说secheme

secheme介绍

  • world表示所有。创建节点的默认权限,有唯一的id是anyone授权的时候模式为world:anyone:rwcda
    表示所有人都有对这个节点的rwcda权限。这里用的是id,而不是expression。

  • auth不需要id。不过这里应该用expression来表示。

  • digest使用用户名:密码编码成md5的方式作为访问权限列表id。但是这里id不作为授权语句的一部分,这里也是用expression方式。用户名:密码先进行shal编码后再用base64编码。这个比较恶心。

  • host使用用户主机作为访问空着列表的id。但是这里需要注意的是表达式用的主句的后缀即可。举个栗子:如果表达式设置为
    corp.com 可以匹配 host1.corp.com 和
    host2.corp.com的主机名,但是host1.zookeeper.com则不能匹配。

  • ip:跟主机名类似。这里使用客户端的ip地址作为权限访问列表的id。表达式可以用
    addr/bits这种方式设置ip白名单。

常用加密命令:

方法一、auth设置权限

  • 设置这个权限之前首先需要

addauth digest zookeeper:zookeeper

  • 然后再设置auth

setAcl /test auth:zookeeper:zookeeper:crwda

  • 检查权限

getAcl /test

  • 可以看到权限已经设置成功了。

get /test

方法二、digest设置权限 (这个里面有个大坑)

可以看出比较明显的:

  1. 设置之前不需要通过addauth添加对应的授权认证,而是直接授权便可。

  2. 命令行设置了什么,然后在获取对应的权限的时候就会把对应的字符串显式记录下来,而不会进行任何编码,
    如上面的zookeeper:zookeeper。这种方式就需要自己去编码了。

  3. 这也是个比较坑爹的事情,设置密码之前需要把密码先自己进行sha1编码然后吧结果进行base64编码。如果编码的方式错误你将永远失去这个节点的访问权。不编码就访问不了

使用sha1编码和base64编码之后设置digest方式保存起来

之后就可以使用addauth的方式访问啦

使用代码连接创建带权限的zookeeper节点

创建节点数据时:

读取Zookeeper数据时:

三、dubbo如何使用zookeeper作为注册中心

通常使用dubbo一般有四种方式,xml配置、API调用、properties加载、注解配置。使用zookeeper作为注册中心主要配置如下:

  1. xml schema扩展

  1. properties配置

  1. API代码设置

  1. 注解配置

四、dubbo实现zookeeper权限关联

最近又把dubbo拾起来啦,以前用过dubbo,后来12年阿里巴巴不维护啦,后来随着springcloud的不断崛起,使用dubbo的人越来越少,但是在国内还是有好多dubbo的热爱着,也是因为这样,在2017年的时候阿里将dubbo奉献给Apache社区,后面估计会越来越好。

这个无论是之前阿里维护还是现在放到Apache社区,直到目前为止,dubbo都没做好这块,使用zookeeper加权限连接,其实挺简单的,下面大致讲以下怎么做。

这里做之前先说一下实现dubbo连接加权限的zookeeper有两种方式,这个取决于dubbo连接zookeeper是通过两种客户端连接的,分别是zkclient和curator,而且dubbo提前预留量注册中心变量设置用户名和密码,这里使用的zookeeper加权方式是digest方式,使用用户名和密码方式对zookeeper节点加权限。

这里需要注意的是,自从dubbo转到Apache下面之后,源码改动不少,其中在dubbo
2.6.0以后版本,dubbo将默认使用zkclient访问zookeeper改成了默认使用curator客户端访问
而且在2.5.4版本之后将com.github.sgroschupf 下面的zkclient 0.1版本改成了
com.101tec 下面的zkclient 0.2版本啦。

1、改造zkclient客户端dubbo源码实现

  • 替换zkclient jar包

这里无论是新版本还是旧版本,都需要将zkclient包替换成com.101tec
的0.5以上版本
,因为只有0.5以上的版本才支持ACL加权控制。(本人建议使用0.8以上的版本)

如果你是2.5.4以前的版本(包括2.5.4版本,就是12年之后17年之前发布的最新版本)需要将

替换成

(这个之前版本比较麻烦,需要到源码中将所有的pom都需要修改)

如果你是使用2.5.4以后的版本比较简单,只需要将dubbo-parent中的

0.2

改成

0.8

  • dubbo使用zkclient客户端源码解析

这里简单的介绍也一下dubbo连接Zookeeper的实现原理,首先服务的提供者和消费者在RegistryProtocol利用注册中心暴露(export)和引用(refer)服务的时候会根据配置利用Dubbo的SPI机制获取具体注册中心注册器

这里的RegistryFactory是ZookeeperRegistryFactory看如下工厂代码

在这里创建zookeepr注册器ZookeeperRegistry。

ZookeeperTransporter是操作zookeepr的客户端的工厂类,用来创建zookeeper客户端,这里客户端并不是zookeeper源代码的自带的,而是采用第三方工具包,主要来简化对zookeeper的操作,例如用zookeeper做注册中心需要对zookeeper节点添加watcher做反向推送,但是每次回调后节点的watcher都会被删除,这些客户会自动维护了这些watcher,在自动添加到节点上去。

  • dubbo源码改造适配zookeeper添加ACL权限

这里又要分版本对待,对dubbo添加zookeeper权限适应于2.2.0-2.5.6版本之间dubbo使用者,2.5.6之后版本添加了ZkClientWrapper类,对zkclient又做成守护线程形式,需要进一步改造,后面也会专门提高2.5.6之后怎么改造的。

适配2.2.0-2.5.6版本之间dubbo源码改造

  1. 在使用zkClient
    连接Zookeeper中最重要的一个类是ZkclientZookeeperClient,Zookeeper的连接、节点创建和节点访问都在这个类中,我们需要重点改造的类。

  1. ZkclientZookeeperClient在构造函数中创建连接Zookeeper,在连接的时候使用用户名密码连接:

  1. 将ZkclientZookeeperClient中的“createPersistent(String
    path)”和“createEphemeral(String path)”创建节点设置权限:

到目前为止,源码就改动这么多,连接Zookeeper的用户名和密码通过dubbo配置注册中心的时候配置,通过spring加载代URL中。
然后下面就说说具体怎么配置怎么用。

  1. 改造后的dubbo连接Zookeeper配置

从 2.2.0 版本开始缺省为 zkclient 实现,以提升 zookeeper 客户端的健状性,配置:

dubbo.registry.client=zkclient

dubbo.registry.username=admin

dubbo.registry.password=admin

zookeeper://10.20.153.10:2181?client=zkclient&username=admin&password=admin

到此直接启动即可,dubbo就可自动对注册dubbo的group节点添加ACL权限。

适配2.5.6以上版本dubbo源码改造

  1. 添加handleSessionEstablishmentError监控方法

  1. 重写ZkClientWrapper构造方法

  1. 针对client.start();设置权限登录

  1. 修改ZkClientWrapper类中“createPersistent(String
    path)”和“createEphemeral(String path)”创建节点设置权限:

到目前为止,源码就改动这么多,连接Zookeeper的用户名和密码通过dubbo配置注册中心的时候配置,通过spring加载代URL中。
然后下面就说说具体怎么配置怎么用。

  1. 改造后的dubbo连接Zookeeper配置

从 2.2.0 版本开始缺省为 zkclient 实现,以提升 zookeeper 客户端的健状性,配置:

dubbo.registry.client=zkclient

dubbo.registry.username=admin

dubbo.registry.password=admin

zookeeper://10.20.153.10:2181?client=zkclient&username=admin&password=admin

到此直接启动即可,dubbo就可自动对注册dubbo的group节点添加ACL权限。

2、改造curator客户端dubbo源码实现

改造curator是最简单的方式,因为dubbo使用curator已经考虑到zookeeper加ACL了,只是代码设置不生效罢了,只要稍微动一下即可。

  1. 修改CuratorZookeeperClient源码

  1. 改造后的dubbo连接Zookeeper配置

从 2.6.0 版本开始缺省为 curator 实现,以提升 zookeeper 客户端的健状性,配置:

dubbo.registry.client=curator

dubbo.registry.username=admin

dubbo.registry.password=admin

zookeeper://10.20.153.10:2181?client=curator&username=admin&password=admin

启动之后即可实现对zookeeper添加权限控制啦。

至此源码已经全部修改完成。


just do
3楼 · 2020-10-14 17:18

dubbo的注册中心有:

1、Zookeeper(官方推荐)

优点:支持分布式.很多周边产品.

缺点: 受限于 Zookeeper 软件的稳定性.Zookeeper 专门分布式辅助软件,稳定较优

2、Multicast

优点:去中心化,不需要单独安装软件.

缺点:Provider 和 Consumer 和 Registry 不能跨机房(路由)

3、Redis

优点:支持集群,性能高

缺点:要求服务器时间同步.否则可能出现集群失败问题.

4、Simple

优点: 标准 RPC 服务.没有兼容问题

缺点: 不支持集群.


相关问题推荐

  • 回答 2

    Statement的execute(String query)方法用来执行任意的SQL查询,如果查询的结果是一个ResultSet,这个方法就返回true。如果结果不是ResultSet,比如insert或者update查询,它就会返回false。我们可以通过它的getResultSet方法来获取ResultSet,或者通过getUpda...

  • 回答 22

    忙的时候项目期肯定要加班 但是每天加班应该还不至于

  • 回答 108
    已采纳

    虽然Java人才越来越多,但是人才缺口也是很大的,我国对JAVA工程师的需求是所有软件工程师当中需求大的,达到全部需求量的60%-70%,所以Java市场在短时间内不可能饱和。其次,Java市场不断变化,人才需求也会不断增加。马云说过,未来的制造业要的不是石油,...

  • 回答 5
    已采纳

    工信部证书含金量较高。工信部是国务院的下属结构,具有发放资质、证书的资格。其所发放的证书具有较强的权威性,在全国范围内收到认可,含金量通常都比较高。 工信部证书,其含义也就是工信部颁发并承认的某项技能证书,是具有法律效力的,并且是国家认可的...

  • 回答 70
    已采纳

    学Java好不好找工作?看学完Java后能做些什么吧。一、大数据技术Hadoop以及其他大数据处理技术都是用Java或者其他,例如Apache的基于Java 的 HBase和Accumulo以及ElasticSearchas。但是Java在此领域并未占太大空间,但只要Hadoop和ElasticSearchas能够成长壮...

  • 回答 16
    已采纳

    就是java的基础知识啊,比如Java 集合框架;Java 多线程;线程的五种状态;Java 虚拟机;MySQL (InnoDB);Spring 相关;计算机网络;MQ 消息队列诸如此类

  • 回答 12

    #{}和${}这两个语法是为了动态传递参数而存在的,是Mybatis实现动态SQL的基础,总体上他们的作用是一致的(为了动态传参),但是在编译过程、是否自动加单引号、安全性、使用场景等方面有很多不同,下面详细比较两者间的区别:1.#{} 是 占位符 :动态解析 ...

  • 回答 62

    没问题的,专科学历也能学习Java开发的,主要看自己感不感兴趣,只要认真学,市面上的培训机构不少都是零基础课程,能跟得上,或是自己先找些资料学习一下。

  • 回答 4

    1、反射对单例模式的破坏采用反射的方式另辟蹊径实例了该类,导致程序中会存在不止一个实例。解决方案其思想就是采用一个全局变量,来标记是否已经实例化过了,如果已经实例化过了,第 二次实例化的时候,抛出异常2、clone()对单例模式的破坏当需要实现单例的...

  • 回答 5

     优点: 一、实例控制  单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。 二、灵活性  因为类控制了实例化过程,所以类可以灵活更改实例化过程。 缺点: 一、开销  虽然数量很少,但如果每次对象请求引用时都要...

  • 回答 4

    这个主要是看你数组的长度是多少, 比如之前写过的一个程序有个数组存的是各个客户端的ip地址:string clientIp[4]={XXX, xxx, xxx, xxx};这个时候如果想把hash值对应到上面四个地址的话,就应该对4取余,这个时候p就应该为4...

  • 回答 6

     哈希表的大小 · 关键字的分布情况 · 记录的查找频率 1.直接寻址法:取关键字或关键字的某个线性函数值为散列地址。即H(key)=key或H(key) = a·key + b,其中a和b为常数(这种散列函数叫做自身函数)。...

  • 回答 6

    哈希表的大小取决于一组质数,原因是在hash函数中,你要用这些质数来做模运算(%)。而分析发现,如果不是用质数来做模运算的话,很多生活中的数据分布,会集中在某些点上。所以这里最后采用了质数做模的除数。 因为用质数做了模的除数,自然存储空间的大小也用质数了...

  • 回答 2

    是啊,哈希函数的设计至关重要,好的哈希函数会尽可能地保证计算简单和散列地址分布均匀,但是,我们需要清楚的是,数组是一块连续的固定长度的内存空间

  • 回答 3

     解码查表优化算法,seo优化

  • 回答 5

    1.对对象元素中的关键字(对象中的特有数据),进行哈希算法的运算,并得出一个具体的算法值,这个值 称为哈希值。2.哈希值就是这个元素的位置。3.如果哈希值出现冲突,再次判断这个关键字对应的对象是否相同。如果对象相同,就不存储,因为元素重复。如果对象不同,就...

没有解决我的问题,去提问