Java高级技术day75:Zookeeper与Dubbo

一、Zookeeper的介绍

1.Zookeeper介绍:

顾名思义 zookeeper 就是动物园管理员,他是用来管 hadoop(大象)、Hive(蜜蜂)、pig(小 猪)的管理员, Apache Hbase 和 Apache Solr 的分布式集群都用到了 zookeeper;Zookeeper: 是一个分布式的、开源的程序协调服务,是 hadoop 项目下的一个子项目。他提供的主要功 能包括:配置管理、名字服务、分布式锁、集群管理。

2.Zookeeper的作用:

2.1 配置管理:

在我们的应用中除了代码外,还有一些就是各种配置。比如数据库连接等。一般我们都 是使用配置文件的方式,在代码中引入这些配置文件。当我们只有一种配置,只有一台服务 器,并且不经常修改的时候,使用配置文件是一个很好的做法,但是如果我们配置非常多, 有很多服务器都需要这个配置,这时使用配置文件就不是个好主意了。这个时候往往需要寻 找一种集中管理配置的方法,我们在这个集中的地方修改了配置,所有对这个配置感兴趣的 都可以获得变更。Zookeeper 就是这种服务,它使用 Zab 这种一致性协议来提供一致性。现 在有很多开源项目使用 Zookeeper 来维护配置,比如在 HBase 中,客户端就是连接一个 Zookeeper,获得必要的 HBase 集群的配置信息,然后才可以进一步操作。还有在开源的消 息队列 Kafka 中,也使用 Zookeeper来维护broker的信息。在 Alibaba开源的 SOA 框架Dubbo 中也广泛的使用 Zookeeper 管理一些配置来实现服务治理。

2.2集群管理:

在分布式的集群中,经常会由于各种原因,比如硬件故障,软件故障,网络问题,有些 节点会进进出出。有新的节点加入进来,也有老的节点退出集群。这个时候,集群中其他机 器需要感知到这种变化,然后根据这种变化做出对应的决策。比如我们是一个分布式存储系 统,有一个中央控制节点负责存储的分配,当有新的存储进来的时候我们要根据现在集群目 前的状态来分配存储节点。这个时候我们就需要动态感知到集群目前的状态。还有,比如一 个分布式的 SOA 架构中,服务是一个集群提供的,当消费者访问某个服务时,就需要采用 某种机制发现现在有哪些节点可以提供该服务(这也称之为服务发现,比如 Alibaba 开源的 SOA 框架 Dubbo 就采用了 Zookeeper 作为服务发现的底层机制)。还有开源的 Kafka 队列就 采用了 Zookeeper 作为 Cosnumer 的上下线管理。

2.3名字服务:

名字服务这个就很好理解了。比如为了通过网络访问一个系统,我们得知道对方的 IP 地址,但是 IP 地址对人非常不友好,这个时候我们就需要使用域名来访问。但是计算机是 不能是域名的。怎么办呢?如果我们每台机器里都备有一份域名到 IP 地址的映射,这个倒 是能解决一部分问题,但是如果域名对应的 IP 发生变化了又该怎么办呢?于是我们有了 DNS 这个东西。我们只需要访问一个大家熟知的(known)的点,它就会告诉你这个域名对应 的 IP 是什么。在我们的应用中也会存在很多这类问题,特别是在我们的服务特别多的时候, 如果我们在本地保存服务的地址的时候将非常不方便,但是如果我们只需要访问一个大家都 熟知的访问点,这里提供统一的入口,那么维护起来将方便得多了。

2.4分布式锁:

我们可以利 用 Zookeeper 来协调多个分布式进程之间的活动。比如在一个分布式环境中,为了提高可靠 性,我们的集群的每台服务器上都部署着同样的服务。但是,一件事情如果集群中的每个服 务器都进行的话,那相互之间就要协调,编程起来将非常复杂。而如果我们只让一个服务进 行操作,那又存在单点。通常还有一种做法就是使用分布式锁,在某个时刻只让一个服务去干活,当这台服务出问题的时候锁释放,立即 fail over 到另外的服务。这在很多分布式系统 中都是这么做,这种设计有一个更好听的名字叫 Leader Election(leader 选举)。比如 HBase 的 Master 就是采用这种机制。但要注意的是分布式锁跟同一个进程的锁还是有区别的,所 以使用的时候要比同一个进程里的锁更谨慎的使用。

3.Zookeeper的存储结构:

结构图
  • Znode:

在 Zookeeper 中,znode 是一个跟 Unix 文件系统路径相似的节点,可以往这个节点存储 或获取数据。
Zookeeper 底层是一套数据结构。这个存储结构是一个树形结构,其上的每一个节点, 我们称之为“znode” ;
zookeeper 中的数据是按照“树”结构进行存储的。而且 znode 节点还分为 4 中不同的类 型。
每一个 znode 默认能够存储 1MB 的数据(对于记录状态性质的数据来说,够了) 可以使用 zkCli 命令,登录到 zookeeper 上,并通过 ls、create、delete、get、set 等命令 操作这些 znode 节点 。

3.1Znode节点类型:

(1)PERSISTENT :

持久化节点: 所谓持久节点,是指在节点创建后,就一直存在,直到 有删除操作来主动清除这个节点。否则不会因为创建该节点的客户端会话失效而消失。

(2)PERSISTENT_SEQUENTIAL:

持久顺序节点:这类节点的基本特性和上面的节点类 型是一致的。额外的特性是,在 ZK 中,每个父节点会为他的第一级子节点维护一份时序, 会记录每个子节点创建的先后顺序。基于这个特性,在创建子节点的时候,可以设置这个属 性,那么在创建节点过程中,ZK 会自动为给定节点名加上一个数字后缀,作为新的节点名。 这个数字后缀的范围是整型的最大值。 在创建节点的时候只需要传入节点 “/test_”,这样 之后,zookeeper 自动会给”test_”后面补充数字。

(3)EPHEMERAL:

临时节点:和持久节点不同的是,临时节点的生命周期和客户端会 话绑定。也就是说,如果客户端会话失效,那么这个节点就会自动被清除掉。
注意,这里提 到的是会话失效,而非连接断开。另外,在临时节点下面不能创建子节点。
还要注意一件事,就是当你客户端会话失效后,所产生的节点也不是一下子就消失 了,也要过一段时间,大概是 10 秒以内,可以试一下,本机操作生成节点,在服务器端用 命令来查看当前的节点数目,你会发现客户端已经 stop,但是产生的节点还在。

(4)EPHEMERAL_SEQUENTIAL:

临时自动编号节点:此节点是属于临时节点,不过带 有顺序,客户端会话结束节点就消失。

4.安装Zookeeper:

4.1安装单机版:

(1)需要安装Linux虚拟机;
(2)需要安装JDK;
(3)配置环境变量:

export JAVA_HOME=/usr/local/jdk export 
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 
export PATH=$JAVA_HOME/bin:$PATH 
4.2上传Zookeeper压缩包:

官方资源包;最新发布版本为:3.4.12。 可在站点中下载:下载地址;

4.3解压Zookeeper压缩包:
[root@localhost temp]# tar -zxf zookeeper-3.4.6.tar.gz 
[root@localhost temp]# cp zookeeper-3.4.6 /usr/local/zookeeper -r 
4.4Zookeeper的目录结构:

(1)bin:放置运行脚本和工具脚本,如果是 Linux 环境还会有有 zookeeper 的运 行日志 zookeeper.out ;
(2)conf:zookeeper 默认读取配置的目录,里面会有默认的配置文件;
(3)contrib:zookeeper 的拓展功能;
(4)dist-maven:zookeeper的 maven 打包目录;
(5)docs:zookeeper 相关的文档;
(6)lib:zookeeper 核心的 jar;
(7)recipes:zookeeper 分布式相关的 jar 包;
(8)src:zookeeper 源码。

4.5配置Zookeeper:

Zookeeper 在启动时默认的去 conf 目录下查找一个名称为 zoo.cfg 的配置文件。 在 zookeeper 应用目录中有子目录 conf。其中有配置文件模板:zoo_sample.cfg cp zoo_sample.cfg zoo.cfg。zookeeper 应用中的配置文件为 conf/zoo.cfg。 修改配置文件 zoo.cfg - 设置数据缓存路径。

修改配置文件
4.6启动Zookeeper:

默认加载配置文件:./zkServer.sh start:默认的会去 conf 目录下加载 zoo.cfg 配置文件。
指定加载配置文件:./zkServer.sh start 配置文件的路径。


启动,关闭,查看状态

二、Zookeeper集群

1.安装集群版:

1.1Zookeeper集群中的角色:

领导者:领导者负责进行投票的发起和决议,更新系统状态。
跟随者:Follow用于接收客户请求并向客户端返回结果,在选主过程中参与投票。
观察者:ObServer可以接收客户端连接,将写请求转发给leader节点,但Observe不参与投票过程,只同步leader的状态。Observe的目的是为了扩展系统,提高读取速度。

角色
关系
1.2Zookeeper集群的原理:

Zookeeper 的核心是原子广播,这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议。Zab协议有两种模式,它们分别是恢复模式(选主)和广播模式(同步)。当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和 leader的状态同步以后,恢复模式就结束了。状态同步保证了leader和Server具有相同的系统状态。

1.3设计目的:

(1)最终一致性:client 不论连接到哪个 Server,展示给它都是同一个视图,这是 zookeeper 最重要的性能。
(2)可靠性:具有简单、健壮、良好的性能,如果消息 m 被到一台服务器接受,那么它 将被所有的服务器接受。
(3)实时性:Zookeeper 保证客户端将在一个时间间隔范围内获得服务器的更新信息,或 者服务器失效的信息。但由于网络延时等原因,Zookeeper 不能保证两个客户端能同时得到 刚更新的数据,如果需要最新数据,应该在读数据之前调用 sync()接口。
(4)等待无关(wait-free):慢的或者失效的 client 不得干预快速的 client 的请求,使得每 个 client 都能有效的等待。
(5)原子性:更新只能成功或者失败,没有中间状态。

(6)顺序性:包括全局有序和偏序两种:全局有序是指如果在一台服务器上消息 a 在消息 b 前发布,则在所有 Server 上消息 a 都将在消息 b 前被发布;偏序是指如果一个消息 b 在消 息 a 后被同一个发送者发布,a 必将排在 b 前面。

1.4安装集群:

使用 3 个 Zookeeper 应用搭建一个伪集群。应用部署位置是:192.168.70.143。服务监听 端口分别为:2181、2182、2183。投票选举端口分别为 2881/3881、2882/3882、2883/3883。
"tar -zxf zookeeper-3.4.6.tar.gz "将解压后的 Zookeeper 应用目录重命名,便于管理 mv zookeeper-3.4.12 zookeeper01;

  • 创建数据缓存目录:

在 zookeeper01 应用目录中,创建 data 目录,用于缓存应用运行数据 cd zookeeper01:"mkdir data";

  • 复制应用:

复制两份 Zookeeper 应用。用于模拟集群中的 3 个节点。
cp -r zookeeper01 zookeeper02 ;
cp -r zookeeper01 zookeeper03 ;

拷贝文件
  • 提供配置文件:

在 zookeeper 应用目录中有子目录 conf。其中有配置文件模板:zoo_sample.cfg cp zoo_sample.cfg zoo.cfg zookeeper 应用中的配置文件为 conf/zoo.cfg。
设置数据缓存路径。

Zookeeper01
Zookeeper02.png
Zookeeper03
  • 修改配置文件zoo.cfg:

设置服务、投票、选举端口 。

编辑配置文件

添加内容
  • 提供应用唯一标识 :

在 Zookeeper 集群中,每个节点需要一个唯一标识。这个唯一标识要求是自然数。且唯 一标识保存位置是:$dataDir/myid。其中 dataDir 为配置文件 zoo.cfg 中的配置参数 在 data 目录中创建文件 myid : touch myid 为应用提供唯一标识。本环境中使用 1、2、3 作为每个节点的唯一标识。

设置节点
1.5启动和关闭Zookeeper应用:

bin/zkServer.sh start ZooKeeper 集群搭建后,至少需要启动两个应用才能提供服务。因需要选举出主服务节 点。启动所有 ZooKeeper 节点后,可使用命令 bin/zkServer.sh status 来查看节点状态。如下:
Mode: leader,主机 ;
Mode: follower,备份机;

启动
集群状态
  • 关闭Zookeeper应用:

bin/zkServer.sh stop 命令为关闭 ZooKeeper 应用的命令。

关闭
  • 编写脚本统一管理启动和关闭:


    脚本
1.6控制台访问Zookeeper应用:

"bin/zkCli.sh -server ip:端口号 ";
命令格式为: zkCli.sh -server host:port。默认连接 localhost:2181;

连接客户端

启动信息

2.控制台客户端常用命令:

(1)connect host:port - 连接其他的 ZooKeeper 应用。
(2)ls path:列表路径下的资源。在 ZooKeeper 控制台客户端中,没有默认列表功能,必须 指定要列表资源的位置。 如: ls / ; ls /path 等。
(3)create [-e] [-s] path data - 创建节点,如: create /test 123 创建一个/test 节点,节点携 带数据信息 123。 create -e /test 123 创建一个临时节点/test,携带数据为 123,临时节点只 在当前会话生命周期中有效,会话结束节点自动删除。 create -s /test 123 创建一个顺序节点 /test,携带数据123,创建的顺序节点由ZooKeeper自动为节点增加后缀信息,如-/test00000001 等。-e 和-s 参数可以联合使用。
(4)get path:查看指定节点的数据。 如: get /test。
(5)set path data [version] - 设置对应位置节点的数据。如: set /test 'test data'。 如果要设 置的数据中有空格,则使用单引号界定数据的范围。每次修改数据后,dataVersion 属性自增。 那么在 set 命令中可以指定 version,version 数据必须与上次查询的值一致,用于保证本次修 改命令执行时,没有其他会话修改此数据。
(6)delete path [version] - 删除指定节点,此命令不能删除有子节点的节点。如:delete /test。 其中 version 参数和 set 命令的 version 含义一致 。
(7)rmr path:删除指定结点,包括子节点。
(8)quit - 退出控制台 。

connect
get
set
delete
退出

三、Dubbo的介绍

1.Dubbo的概念:

Dubbo 是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring 框架无缝集成。Dubbo 框架,是基于容器 运行的.。容器是 Spring。
官方网站:官方网址;
阿里巴巴已经将 dubbo 框架捐献给了 Apache 软件基金会。

1.1单体结构:

单体架构也称之为单体系统或者是单体应用。就是一种把系统中所有的功能、模块耦合 在一个应用中的架构方式。其优点为:项目易于管理、部署简单。缺点:测试成本高、可伸 缩性差、可靠性差、迭代困难、跨语言程度差、团队协作难 。

1.2SOA 架构: Service-Oriented Architecture:

面向服务的架构(SOA)是一个组件模型,它将应用程序拆分成不同功能单元(称为服 务)通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的, 它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种各样的系统中 的服务可以以一种统一和通用的方式进行交互。

1.3 RPC 远程过程调用 : Remote Procedure Call Protocol:

远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底 层网络技术的协议。RPC 协议假定某些传输协议的存在,如 TCP 或 UDP,为通信程序之间 携带信息数据。在 OSI 网络通信模型中,RPC 跨越了传输层和应用层。RPC 使得开发包括 网络分布式多程序在内的应用程序更加容易。

2.Dubbo框架结构:

2.1Dubbo角色介绍:
Dubbo
2.2 registry :

注册中心,是用于发布和订阅服务的一个平台.用于替代SOA结构体系框架中的ESB服 务总线的。
发布:开发服务端代码完毕后, 将服务信息发布出去. 实现一个服务的公开。
订阅:客户端程序,从注册中心下载服务内容 这个过程是订阅. 订阅服务的时候, 会将发布的服务所有信息,一次性下载到客户端. 客户端也可以自定义, 修改部分服务配置信息. 如: 超时的时长, 调用的重试次数等。

2.3 consumer :

服务的消费者, 就是服务的客户端;消费者必须使用 Dubbo 技术开发部分代码;基本上都是配置文件定义。

2.4 provider

服务的提供者, 就是服务端. 服务端必须使用 Dubbo 技术开发部分代码;以配置文件为主。

2.5 container:

容器,Dubbo 技术的服务端(Provider), 在启动执行的时候, 必须依赖容器才能正常启动. 默认依赖的就是 spring 容器. 且 Dubbo 技术不能脱离 spring 框架. 在 2.5.3 版本的 dubbo 中, 默认依赖的是 spring2.5 版本技术. 可以选用 spring4.5 以下版本。
在 2.5.7 版本的 dubbo 中, 默认依赖的是 spring4.3.10 版本技术. 可以选择任意的 spring 版本。

2.6 monitor:

监控中心,是 Dubbo 提供的一个 jar 工程。
主要功能是监控服务端(Provider)和消费端(Consumer)的使用数据的. 如: 服务端是什么, 有多少接口,多少方法, 调用次数, 压力信息等. 客户端有多少, 调用过哪些服务端, 调用了 多少次等。

3.Dubbo 架构图的执行流程:

(1)启动Spring容器时自动启动Dubbo的Provider;
(2)Dubbo的Provider在启动后自动会去注册中心注册内容;注册的内容包括:
Provider 的 IP ;
Provider 的端口;
Provider 对外提供的接口列表;哪些方法;哪些接口类;
Dubbo 的版本1.5 访问 Provider 的协议;
(3)subscribe: 订阅.当 Consumer 启动时,自动去 Registry 获取到所已注册的服务的信息;
(4)notify: 通知.当 Provider 的信息发生变化时, 自动由 Registry 向 Consumer 推送通知.
(5)invoke: 调用;Consumer 调用 Provider 中方法。
(6)count:次数,每隔 2 分钟,provoider 和 consumer 自动向 Monitor 发送访问次数.Monitor 进行统计。

4.Dubbo支持的协议:

4.1 Dubbo 协议(官方推荐协议) :

优点: 采用 NIO 复用单一长连接,并使用线程池并发处理请求,减少握手和加大并发效率, 性能较好(推荐使用);
缺点: 大文件上传时,可能出现问题(不使用 Dubbo 文件上传) 。

4.2 RMI(Remote Method Invocation)协议:

优点: JDK 自带的能力。可与原生 RMI 互操作,基于 TCP 协议 ;
缺点: 偶尔连接失败。

4.3 Hessian 协议 :

优点: 可与原生 Hessian 互操作,基于 HTTP 协议;
缺点: 需 hessian.jar 支持,http 短连接的开销大 。

5.Dubbo 支持的注册中心:

5.1 Zookeeper(官方推荐) :

优点: 支持分布式.很多周边产品;
缺点: 受限于 Zookeeper 软件的稳定性.Zookeeper 专门分布式辅助软件,稳定较优。

5.2 Multicast :

优点:去中心化,不需要单独安装软件。
缺点:2.2.1 Provider 和 Consumer 和 Registry 不能跨机房(路由) 。

5.3 Redis :

优点: 支持集群,性能高;
缺点: 要求服务器时间同步.否则可能出现集群失败问题。

5.4 Simple:

优点: 标准 RPC 服务.没有兼容问题;
缺点: 不支持集群。

四、Dubbo案例:

1.创建Provider:

1.1创建工程:

Provider 工程类型是 jar 类型;


Provider
1.2 修改 POM 文件添加 Dubbo 的坐标

在 Dubbo 的 2.5.3 版本中对于 spring的支持是 2.5.x。替换低版本的 spring。
Dubbo 的 2.5.4 版本中对于 spring 的支持为 4.3.10。
坐标查询网址

  • 低版本


    com.alibaba
    dubbo
    2.5.3
    
    
        

            org.springframework
            spring
        
    


    org.springframework
    spring-context
    4.1.6.RELEASE

  • 高版本
    
    
        com.alibaba
        dubbo
        2.5.4
    

    
    
        com.101tec
        zkclient
        0.10
    

2.创建服务:

2.1什么是服务?

服务:项目中对外界所提供的能力;
服务标准:接口+接口实现类;
接口:对外界描述当前服务的信息,如协议类型,服务提供者的地址,发布的服务名 称,服务中方法名称等信息。
接口实现类:对发布的接口中的标准的具体实现。

2.2创建接口:
package com.zlw.service;
/**
 * 服务接口
 * @author zhang
 *
 */
public interface DubboService {
    
    String showMsg(String str);
}
2.3创建接口实现类:
package com.zlw.service.impl;

import com.zlw.service.DubboService;
/**
 * 服务接口的实现类
 * @author zhang
 *
 */
public class DubboServiceImpl implements DubboService{

    @Override
    public String showMsg(String str) {
        return "hello dubbo"+str;
    }
}
2.4配置服务:


        
        
        
        
        
        
        
        
        
        
        
        

2.5启动Provider:
  • 通过 SpringAPI 启动容器 :

在 ApplicationContext 接口中未定义 start()方法,需要时用接口实现类。

package com.zlw;

import java.io.IOException;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.alibaba.dubbo.container.Main;

public class Start {
    public static void main(String[] args) throws IOException {
//      ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("application-dubbo.xml");
//      app.start();
//      System.in.read();
//      Main类下的main方法在启动时默认的回去classpath:/META-INF/spring/*.xml
        Main.main(args);
    }
}
  • 启动时异常信息
    JDK 版本不符合要求。注意 dubbo2.5.4 要求jdk 必须是 1.8 或者以上的版本。


    JDK版本不符合

    Dubbo启动时需要依赖zookeeper客户端工具
  • 工具名称为:zkclient

修改 POM 文件添加 zkclient 坐标。

    
    
        com.101tec
        zkclient
        0.10
    
2.6使用DubboAPI 启动 Provider:

优点:自带线程阻塞;支持优雅关闭。

  • 注册中心的服务发布信息:

使用 zkCli.sh 连接 ZooKeeper 服务,使用 ls 命令查看服务信息;

“ls /dubbo/服务接口名称/providers ” ;

显示结果:

[dubbo%3A%2F%2F192.168.226.1%3A20880%2Fcom.zlw.service.DubboService%3Fanyhost%3Dtrue%26application%3
Dmyprovicder%26dubbo%3D2.5.4%26generic%3Dfalse%26interface%3Dcom.zlw.service.DubboService%26methods%3
DshowMsg%26pid%3D8664%26side%3Dprovider%26timestamp%3D1572964461838]

转化结果:

dubbo://192.168.2.108:20880/com.zlw.service.DubboService?anyhost=true&application=m 
yprovider&dubbo=2.5.4&generic=false&interface=com.bjsxt.service.DubboService&methods=sh 
owMsg&pid=3936&side=provider×tamp=1536807891514 

3.Dubbo Admin 管理平台搭建:

(1)安装Admin管理平台:

Admin 管理平台是一个 war 项目;
在 Linux 系统中安装 JDK 以及 tomcat。
使用 unzip 命令解压 zip 压缩包。
删除 tomcat/webapps 目录下的 ROOT 目录;
将解压出来的 ROOT 目录拷贝到 tomcat/webapps 目录下 。

(2)配置Admin管理平台:

配置

(3)访问Admin管理平台:


image.png

4.创建Consumer:

4.1创建工程:
image.png
4.2修改POM文件:

    4.0.0
    com.zlw
    14dubbo-consumer
    0.0.1-SNAPSHOT

    
        
        
            com.alibaba
            dubbo
            2.5.4
        

        
        
            com.101tec
            zkclient
            0.10
        
        
            com.zlw
            13dubbo-provier
            0.0.1-SNAPSHOT
        
    

4.3编写Consumer:
package com.zlw.service;

public interface UserService {
    void test(String str);
}
package com.zlw.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.zlw.service.DubboService;

@Service("userService")
public class UserServiceImpl implements com.zlw.service.UserService {

    @Autowired
    private DubboService dubboService;
    @Override
    public void test(String str) {
        //调用Provider下的服务
        System.out.println(dubboService);
        String var = dubboService.showMsg(str);
        System.out.println(var);
    }
}
4.3配置Consumer:


        
        
        
        
        
        
        

4.4测试:
package com.zlw.test;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.zlw.service.UserService;

public class ConsumerTest {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService us = app.getBean("userService",UserService.class);
        us.test(" bjsxt ");
    }
}
结果

你可能感兴趣的:(Java高级技术day75:Zookeeper与Dubbo)