学习笔记-Dubbo

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/huxiutao/article/details/90142525

官方网站:http://dubbo.apache.org/en-us/
(最右上角可选择中文版)

一、 Dubbo产生的背景及系统进化理论

互联网的高速发展,使得网站应用和App应用都面临巨大的流量洪峰,当大量用户涌入时,使得应用程序面临巨大的考验,甚至崩溃,那么如何应对呢?

我们传统的网站架构为单一应用架构,也就是说,把所有的功能放在一个项目工程中,且部署在一台服务器上,当访问量过大时,则单台服务器的压力会越来越大。业务的不断扩展,也使得我们需要不断添加新的服务器,所以,我们必须要把功能进行拆分。

随着用户数的增长和业务的发展,我们拆分的应用将越来越多,应用之间的交互和数据传输已不可避免,此时我们就需要将一些核心的功能抽取出来,形成一个公共的服务,不同系统直接调用这些公共服务,提高业务复用。

但是,当我们的服务越来越多,资源的不合理分配也会变得比较严重,比如一些访问量很小的服务,占用了大量的IT资源,而另外一些应用的资源严重不足,服务负载一直高居不下,我们需要能基于访问流量的情况实时监控和管理各个服务,提高资源的利用率。

二、 集群与分布式

1、集中式系统
就是把所有的程序、功能、模块都集中到一个项目中,部署在一台服务器上,从而对外提供服务。
2、分布式系统
分布:是指在一定的范围内散开。
分布式系统就是把所有的程序、功能拆分成不同的子系统,部署在多台不同的服务器上,这些子系统相互协作共同对外提供服务,而对用户而言,他并不知道后台是多少子系统。

三、 分布式架构

分佈式系統設計的本質就是:如何合理地將一個系統拆分為多個子系統部署到墮胎不同的服務器上。因此需要解決如下問題:
1. 如何合理的拆分系统
2. 拆分后的各个子系统之间如何通信
3. 通信过程如何防止信息拦截和串改问题
4. 可扩展性
5. 数据可靠性和一致性

四、 认识Dubbo

Dubbo是一个分布式服务治理框架,提供高性能和透明化的RPC远程服务调用以及服务治理。
Dubbo是阿里巴巴的开源产品,国内大量企业都在使用。官网:
http://dubbo.apache.org/
Dubbo的用途:
1、 RPC远程调用:dubbo、spring cloud、hessian、thrift、motan、Grpc等
2、 服务治理:dubbo、spring cloud、motan等

五、 认识RPC

RPC(Remote Procedure Call)远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
RPC调用过程的实现:
1、基于tcp协议的RPC:序列化与反序列化、socket、反射
2、基于Http协议的RPC:xml、json、http

六、 Dubbo的整体架构

五大核心部件:

  • Provider:提供服务的服务方(生产者)
  • Consumer:调用远程服务的服务消费方(消费者)
  • Registry:服务注册与发现的注册中心(注册中心)
  • Monitor:统计服务调用次数和调用时间的监控中心(监控中心)
  • Container:服务运行容器(运行容器)
    在这里插入图片描述

七、 第一个Dubbo程序

在开发以及测试环境中,为了方便,我们经常需要绕过注册中心,直接进行连接,这就是无注册中心的点对点直连。
点对点直连实现步骤:
1、 服务提供者取消服务注册:register=”N/A”
新建Maven项目,新建过程中指定是:
在这里插入图片描述
在这里插入图片描述
applicationContext.xml是spring的配置文件,具体内容:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context.xsd">

	<import resource="applicationContext-dubbo-provider.xml"/>
	
</beans>

applicationContext-dubbo-provider.xml是Dubbo的配置文件,对于引入的dubbo.xsd文件可以在Eclipse中直接配置本地的:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://code.alibabatech.com/schema/dubbo 
    http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
</beans>

在这里插入图片描述
Pom文件主要包含spring依赖和Dubbo:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	
	<groupId>com.delta.dubbo</groupId>
	<artifactId>MyDubboService</artifactId>
	<packaging>war</packaging>
	<version>1.0.0</version>
	
	<name>MyDubbo Maven Webapp</name>
	<url>http://maven.apache.org</url>
	
	<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spring.version>4.3.20.RELEASE</spring.version>
        <slf4j.version>1.6.6</slf4j.version>
        <dubbo.version>2.5.3</dubbo.version>
    </properties>
	
	<dependencies>
		<!-- dubbo -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>${dubbo.version}</version>
        </dependency>
        
        <!-- zkclient  -->
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>
        
        <!--  zookeeper -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.6</version>
        </dependency>
        
        <!-- Spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring.version}</version>
        </dependency>
        
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-asm</artifactId>
            <!-- <version>${spring.version}</version> -->
            <version>3.1.4.RELEASE</version>
        </dependency>
        
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>${spring.version}</version>
        </dependency>
        
        <!-- log -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.16</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
	</dependencies>
	
	<build>
		<finalName>MyDubbo</finalName>
	</build>
	
</project>

在这里插入图片描述
定义实现类:
在这里插入图片描述
定义启动类:
在这里插入图片描述
其中,System.in.read();语句的作用是使得程序阻塞在这里,以保持程序运行。
2、 服务消费者指定访问的IP以及端口:dubbo://localhost:20880
消费者端的程序结构如下:
在这里插入图片描述
同样该项目是maven的web项目。
Spring的主配置文件:applicationContext.xml中引入dubbo配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context.xsd">

	<import resource="applicationContext-dubbo-consumer.xml"/>
	
</beans>

Dubbo消费者端的配置文件:applicationContext-dubbo-consumer.xml
在这里插入图片描述
需要在MyDubboService-1项目中导出对外调用的接口jar:

在这里插入图片描述
将导出的该接口的jar,放到MyDubboClient-1项目中,并在MyDubboClient-1项目中的Pom.xml文件注册该jar为依赖。
具体的pom.xml如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.delta.dubbo</groupId>
	<artifactId>MyDubboClient</artifactId>
	<packaging>war</packaging>
	<version>1.0.0</version>

	<name>MyDubboClient Maven Webapp</name>
	<url>http://maven.apache.org</url>

	<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spring.version>4.3.20.RELEASE</spring.version>
        <slf4j.version>1.6.6</slf4j.version>
        <dubbo.version>2.5.3</dubbo.version>
    </properties>
	
	<dependencies>
		<!-- dubbo -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>${dubbo.version}</version>
        </dependency>
        
        <!-- zkclient  -->
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>
        
        <!--  zookeeper -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.6</version>
        </dependency>
        
        <!-- Spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring.version}</version>
        </dependency>
        
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-asm</artifactId>
            <!-- <version>${spring.version}</version> -->
            <version>3.1.4.RELEASE</version>
        </dependency>
        
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>${spring.version}</version>
        </dependency>
        
        <!-- log -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.16</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        
        <!-- Local jar -->
        <dependency>
        	<groupId>com.delta.dubbo.service</groupId>
        	<artifactId>service</artifactId>
        	<version>1.0.0</version>
        	<scope>system</scope>
        	<systemPath>${basedir}\src\main\webapp\WEB-INF\lib\service-1.0.0.jar</systemPath>
        </dependency>
        
	</dependencies>

	<build>
		<finalName>MyDubboClient</finalName>
	</build>

</project>

定义启动主函数:
在这里插入图片描述
3、启动验证:运行MyDubboService-1中的主函数
在这里插入图片描述
具体输出信息如下:

[22/10/18 01:18:06:006 CST] main  INFO support.ClassPathXmlApplicationContext: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@20fa23c1: display name [org.springframework.context.support.ClassPathXmlApplicationContext@20fa23c1]; startup date [Mon Oct 22 13:18:06 CST 2018]; root of context hierarchy
[22/10/18 01:18:06:006 CST] main  INFO xml.XmlBeanDefinitionReader: Loading XML bean definitions from class path resource [applicationContext.xml]
[22/10/18 01:18:07:007 CST] main  INFO xml.XmlBeanDefinitionReader: Loading XML bean definitions from class path resource [applicationContext-dubbo-provider.xml]
[22/10/18 01:18:07:007 CST] main  INFO logger.LoggerFactory: using logger: com.alibaba.dubbo.common.logger.log4j.Log4jLoggerAdapter
[22/10/18 01:18:07:007 CST] main  INFO support.ClassPathXmlApplicationContext: Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext@20fa23c1]: org.springframework.beans.factory.support.DefaultListableBeanFactory@3b6eb2ec
[22/10/18 01:18:07:007 CST] main  INFO support.DefaultListableBeanFactory: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@3b6eb2ec: defining beans [helloService,MyDubboService-1,com.delta.dubbo.service.ServiceHello]; root of factory hierarchy
[22/10/18 01:18:07:007 CST] main  INFO config.AbstractConfig:  [DUBBO] The service ready on spring started. service: com.delta.dubbo.service.ServiceHello, dubbo version: 2.5.3, current host: 127.0.0.1
[22/10/18 01:18:08:008 CST] main  INFO config.AbstractConfig:  [DUBBO] Export dubbo service com.delta.dubbo.service.ServiceHello to local registry, dubbo version: 2.5.3, current host: 127.0.0.1
[22/10/18 01:18:08:008 CST] main  INFO config.AbstractConfig:  [DUBBO] Export dubbo service com.delta.dubbo.service.ServiceHello to url dubbo://192.168.110.1:20880/com.delta.dubbo.service.ServiceHello?anyhost=true&application=MyDubboService-1&dubbo=2.5.3&interface=com.delta.dubbo.service.ServiceHello&methods=hello&pid=9256&side=provider&timestamp=1540185487828, dubbo version: 2.5.3, current host: 127.0.0.1
[22/10/18 01:18:08:008 CST] main  INFO transport.AbstractServer:  [DUBBO] Start NettyServer bind /0.0.0.0:20880, export /192.168.110.1:20880, dubbo version: 2.5.3, current host: 127.0.0.1

运行MyDubboClient-1中的主函数:
在这里插入图片描述

八、 注册中心

Multicast注册中心(本地调试,不会在生产环境中使用)
特点:
(1) 不需要安装和启动任何中心节点,只要服务提供者与服务消费者的广播地址一样,就可以相互发现。
(2) 组播地址段:224.0.0.0 ~ 239.255.255.255
(3) 组播只适合小规模应用或开发调试使用。
实现:
对于“Provider”只需要修改“applicationContext-dubbo-provider.xml”:
在这里插入图片描述
对于“Consumer”只需要修改“applicationContext-dubbo-consumer.xml”:
在这里插入图片描述
Zookeeper注册中心(最常用)
ZooKeeper简称ZK,是一个高性能、分布式的,开源分布式应用协调服务。Dubbo官方推荐使用Zookeeper作为注册中心。
官方网址:http://zookeeper.apache.org/
1、Linux环境下安装(单机)
(1)下载:在上面的官方链接上即可下载“zookeeper-3.4.10.tar.gz”
(2)安装:安装目录:/usr/local/zookeeper-3.4.5,解压缩:# tar -zxf zookeeper-3.4.10.tar.gz -C /usr/local
(3)配置:在解压后的主目录下创建data和logs两个目录用于存储数据:# cd /usr/local/zookeeper-3.4.5,# mkdir data,并复制zoo-sample.cfg文件为zoo.cfg文件,并更新其中的dataDir=/usr/local/zookeeper-3.4.10/data。
(4)启动和停止:进入bin目录下:
# ./zkServer.sh start
# ./zkServer.sh stop
# ./zkServer.sh restart
# ./zkServer.sh status

(4) 查看端口:# netstat -tunpl | grep 2181
在这里插入图片描述
2、Windows环境下安装(单机)
(1)下载:官网下载相应的版本:https://www.apache.org/dyn/closer.cgi/zookeeper/
(下载同Linux环境下),解压下载的压缩包:
在这里插入图片描述
(2)配置:在conf目录下,复制一份zoo_sample.cfg并更名成zoo.cfg,修改和添加其中的参数:
dataDir=D:/Logs/Zookeeper-Datas
dataLogDir=D:/Logs/Zookeeper-Logs
主要参数释义:
tickTime:这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。
dataDir:顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。
dataLogDir:顾名思义就是 Zookeeper 保存日志文件的目录
clientPort:这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。
(3)启动:双击运行bin/zkServer.cmd即可启动:

在这里插入图片描述
3、使用Zookeeper注册中心(由于防火墙等因素,请尽量使用本地服务)
与使用multicast类似,只需要把注册的地址修改成:<dubbo:registry address=“zookeeper://127.0.0.1:2181”/>即可,协议://IP:port。

Redis注册中心(较少)
1、 Redis的安装和配置
2、 使用Redis注册中心
与使用Multicast也是类似的,只需要修改一下协议、IP和端口号,如下:
在这里插入图片描述
如果需要密码则:
在这里插入图片描述

九、 dubbo分布式开发模式

SOA服务化:项目分割的模式。
接口项目、实现项目、消费者项目。

十、 dubbo的常用协议

常用协议以及常用协议的配置

Dubbo一共提供了8种协议:dubbo、hessian、rmi、http、webservice、thrift、memcached、redis。
默认使用的是dubbo协议。

协议的配置位置:(以下使用其中一种即可)
<dubbo:protocol name=”dubbo” /> //
<dubbo:provider protocol=”dubbo” /> //
<dubbo:service protocol =”dubbo” /> // 服务提供者
<dubbo:reference protocol =”dubbo” /> // 服务消费端

1、dubbo协议采用单一长连接和NIO异步通讯,适合小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。Dubbo协议底层默认使用的是netty,性能非常优秀,官方推荐使用此协议。Dubbo不适合传送大数据量的服务,比如传文件、视频等,除非请求量很低。<dubbo:protocol name=”dubbo” port=”20880” />,dubbo默认端口20880。
2、Hessian协议:
在这里插入图片描述
3、rmi协议:
在这里插入图片描述
4、Http协议:采用Spring的HttpInvoker实现
在这里插入图片描述
5、webservice协议:
在这里插入图片描述
WSDL:
http://10.20.123.10:8080/com.foo.HelloWorld?wsdl

6、thrift协议:
在这里插入图片描述
7、memcached协议:
在这里插入图片描述
8、redis协议:

在这里插入图片描述

十一、 启动时检查(常用配置)

Dubbo缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止Spring初始化完成,以便上线时能及早发现问题,默认check=true。
通过check=“false”关闭检查,比如,测试时有些服务不关心,或者出现了循环依赖,必须有一方先启动。(即,如果消费方已经开发完成,但服务提供方还没有上线,那么就可以先把检查关掉,check=false,这样就不影响消费方的服务正常运行。否则,服务提供方没有启动成功,消费方也启动不成功。)

关闭某个服务的启动时检查
关闭所有服务的启动时检查
关闭注册中心启动时检查

十二、 负载均衡策略

Dubbo提供了多种均衡策略,缺省为random随机调用。
Random、RoundRobin、LeastActive、ConsistentHash

十三、 Dubbo的多协议与多策略

根据具体的服务情况,采用不同的协议。

当一个接口实现出现了不兼容的升级时,可以用版本号过度,版本号不同的服务相互之间不引用。

在低压力时间段,先升级一半提供者为新版本,再将所有消费者升级为新版本,然后再将剩余的一半提供者升级为新版本。

服务端:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

十四、 dubbo服务分组

当一个接口有多种实现时,可以用group区分,服务分组是dubbo用来区分相同接口名,但是方法具体实现不同的一种模式。
在这里插入图片描述

十五、 dubbo的token验证

防止消费者绕过注册中心访问提供者
在这里插入图片描述

十六、 dubbo的配置覆盖策略

Dubbo的配置主要分为三类:

  • 服务发现:表示说该配置项用于服务的注册与发现,目的是让消费方找到提供方。
  • 服务治理:表示该配置项用于治理服务间的关系,或为开发测试提供便利条件。
  • 性能调优:表示该配置项用于调优性能,不同的选项对性能会产生影响。
    在这里插入图片描述

十七、 dubbo的常用标签

1、7大常用标签
在这里插入图片描述
2、7大常用标签的关系
在这里插入图片描述
3、7大常用标签的分类
在这里插入图片描述

十八、dubbo管理控制的部署与使用

在这里插入图片描述
在这里插入图片描述

十九、zookeeper集群部署

1、 zk集群的特点:
集群中只有超过半数的机器是正常工作的,那么整个集群对外就是可用的;

2、 zk集群配置:
在这里插入图片描述
3、 Dubbo的配置:

在这里插入图片描述
以上两种方式都可以。

二十、springmvc-spring-dubbo-mybatis综合示例

开发模式:
在这里插入图片描述

二十一、dubbo服务化的建议

在这里插入图片描述

二十二、Dubbo的管理控制台dubbo-admin

前往github上下载dubbo-admin:https://github.com/apache/incubator-dubbo/tree/dubbo-2.6.0
注意:dubbo-2.6.1以后的版本不再有dubbo-admin

进入dubbo-admin文件夹,输入cmd,打开dos窗口,输入以下命令:

// 打包,并跳过测试
mvn  package -Dmaven.skip.test=true

将打包好的war 放到tomcat的webapps/ROOT目录下(把原来ROOT目录下的文件都删掉),直接进行解压到当前目录即可,进行部署。
修改配置文件:
进入webapps\dubbo-admin-2.6.0\WEB-INF目录下,找到dubbo.properties,修改如下:

# 和zookeeper注册中心<dubbo:registry address="zookeeper://127.0.0.1:2181" />中的保持一致,对于多台zookeeper服务器,需要加上?backup=ip:port,ip:port
dubbo.registry.address=zookeeper://127.0.0.1:2181
# 用户名
dubbo.admin.root.password=root
# 密码
dubbo.admin.guest.password=guest

# 其他节点/组的服务
# dubbo.registry.group=myGroup

启动zk和tomcat即可。

注意
第一、dubbo.admin.root.password=root和dubbo.admin.guest.password=guest必须要在dubbo.properties中进行设置。zk设置用户名和密码方法如下:
通过zkCli -server 127.0.0.1:2181连接后,执行:addauth digest root:guest。
第二、启动后,dubbo-admin默认只是监控dubbo节点下的目录,但是有时候我们会把服务注册到不同的节点下,这就是组的概念。此时就需要在dubbo.properties中配置:dubbo.registry.group=myGroup。这样就能看到不在dubbo节点下的其他组的服务。
第三、现在使用dubbo-admin的越来越少了,而且确实有一些BUG,官方也不再进行升级了。

补充

1、zookeeper的集群模式
Zookeeper 不仅可以单机提供服务,同时也支持多机组成集群来提供服务。实际上 Zookeeper 还支持另外一种伪集群的方式,也就是可以在一台物理机上运行多个 Zookeeper 实例,下面将介绍集群模式的安装和配置。

Zookeeper 的集群模式的安装和配置也不是很复杂,所要做的就是增加几个配置项。集群模式除了上面的三个配置项还要增加下面几个配置项:

initLimit=5
syncLimit=2
server.1=192.168.211.1:2888:3888
server.2=192.168.211.2:2888:3888

initLimit:这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 10 个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 52000=10 秒
syncLimit:这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 2
2000=4 秒
server.A=B:C:D:其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。
除了修改 zoo.cfg 配置文件,集群模式下还要配置一个文件 myid,这个文件在 dataDir 目录下,这个文件里面就有一个数据就是 A 的值,Zookeeper 启动时会读取这个文件,拿到里面的数据与 zoo.cfg 里面的配置信息比较从而判断到底是那个 server。
数据模型

Zookeeper 会维护一个具有层次关系的数据结构,它非常类似于一个标准的文件系统,如图 1 所示:
在这里插入图片描述

Zookeeper 这种数据结构有如下这些特点:

  •  每个子目录项如 NameService 都被称作为 znode,这个 znode 是被它所在的路径唯一标识,如 Server1 这个
    znode 的标识为 /NameService/Server1
  •  znode 可以有子节点目录,并且每个 znode 可以存储数据,注意 EPHEMERAL 类型的目录节点不能有子节点目录
  •  znode 是有版本的,每个 znode 中存储的数据可以有多个版本,也就是一个访问路径中可以存储多份数据
  •  znode 可以是临时节点,一旦创建这个 znode 的客户端与服务器失去联系,这个 znode 也将自动删除,Zookeeper的客户端和服务器通信采用长连接方式,每个客户端和服务器通过心跳来保持连接,这个连接状态称为 session,如果 znode是临时节点,这个 session 失效,znode 也就删除了
  •  znode 的目录名可以自动编号,如 App1 已经存在,再创建的话,将会自动命名为 App2
  •  znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个是Zookeeper 的核心特性,Zookeeper 的很多功能都是基于这个特性实现的,后面在典型的应用场景中会有实例介绍

如何使用
Zookeeper 作为一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储,但是 Zookeeper 并不是用来专门存储数据的,它的作用主要是用来维护和监控你存储的数据的状态变化。通过监控这些数据状态的变化,从而可以达到基于数据的集群管理。

猜你喜欢

转载自blog.csdn.net/huxiutao/article/details/90142525