当前位置:   article > 正文

zookeeper 连接慢_082、Zookeeper和Dubbo

zk 跨区连接慢

一、 ZooKeeper 简介

概念:

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

二、 ZooKeeper 的作用

1.1配置管理

在我们的应用中除了代码外,还有一些就是各种配置。比如数据库连接等。一般我们都

是使用配置文件的方式,在代码中引入这些配置文件。当我们只有一种配置,只有一台服务

器,并且不经常修改的时候,使用配置文件是一个很好的做法,但是如果我们配置非常多,

有很多服务器都需要这个配置,这时使用配置文件就不是个好主意了。这个时候往往需要寻

找一种集中管理配置的方法,我们在这个集中的地方修改了配置,所有对这个配置感兴趣的

都可以获得变更。Zookeeper 就是这种服务,它使用 Zab 这种一致性协议来提供一致性。现

在有很多开源项目使用 Zookeeper 来维护配置,比如在 HBase 中,客户端就是连接一个

Zookeeper,获得必要的 HBase 集群的配置信息,然后才可以进一步操作。还有在开源的消

息队列 Kafka 中,也使用 Zookeeper 来维护 broker 的信息。在 Alibaba 开源的 SOA 框架 Dubbo中也广泛的使用 Zookeeper 管理一些配置来实现服务治理。

1.2名字服务

名字服务这个就很好理解了。比如为了通过网络访问一个系统,我们得知道对方的 IP

地址,但是 IP 地址对人非常不友好,这个时候我们就需要使用域名来访问。但是计算机是

不能是域名的。怎么办呢?如果我们每台机器里都备有一份域名到 IP 地址的映射,这个倒

是能解决一部分问题,但是如果域名对应的 IP 发生变化了又该怎么办呢?于是我们有了

DNS 这个东西。我们只需要访问一个大家熟知的(known)的点,它就会告诉你这个域名对应

的 IP 是什么。在我们的应用中也会存在很多这类问题,特别是在我们的服务特别多的时候,

如果我们在本地保存服务的地址的时候将非常不方便,但是如果我们只需要访问一个大家都

熟知的访问点,这里提供统一的入口,那么维护起来将方便得多了。

1.3分布式锁

其实在第一篇文章中已经介绍了 Zookeeper 是一个分布式协调服务。这样我们就可以利

用 Zookeeper 来协调多个分布式进程之间的活动。比如在一个分布式环境中,为了提高可靠

性,我们的集群的每台服务器上都部署着同样的服务。但是,一件事情如果集群中的每个服

务器都进行的话,那相互之间就要协调,编程起来将非常复杂。而如果我们只让一个服务进

行操作,那又存在单点。通常还有一种做法就是使用分布式锁,在某个时刻只让一个服务去干活,当这台服务出问题的时候锁释放,立即 fail over 到另外的服务。这在很多分布式系统

中都是这么做,这种设计有一个更好听的名字叫 Leader Election(leader 选举)。比如 HBase

的 Master 就是采用这种机制。但要注意的是分布式锁跟同一个进程的锁还是有区别的,所

以使用的时候要比同一个进程里的锁更谨慎的使用。

1.4集群管理

在分布式的集群中,经常会由于各种原因,比如硬件故障,软件故障,网络问题,有些

节点会进进出出。有新的节点加入进来,也有老的节点退出集群。这个时候,集群中其他机

器需要感知到这种变化,然后根据这种变化做出对应的决策。比如我们是一个分布式存储系

统,有一个中央控制节点负责存储的分配,当有新的存储进来的时候我们要根据现在集群目

前的状态来分配存储节点。这个时候我们就需要动态感知到集群目前的状态。还有,比如一

个分布式的 SOA 架构中,服务是一个集群提供的,当消费者访问某个服务时,就需要采用

某种机制发现现在有哪些节点可以提供该服务(这也称之为服务发现,比如 Alibaba 开源的

SOA 框架 Dubbo 就采用了 Zookeeper 作为服务发现的底层机制)。还有开源的 Kafka 队列就采用了 Zookeeper 作为 Cosnumer 的上下线管理。

三、 Zookeeper 的存储结构

d508f6577be9113c75dba2cda074b9b6.png

1 Znode

在 Zookeeper 中,znode 是一个跟 Unix 文件系统路径相似的节点,可以往这个节点存储或获取数据。

Zookeeper 底层是一套数据结构。这个存储结构是一个树形结构,其上的每一个节点,

我们称之为“znode”

zookeeper 中的数据是按照“树”结构进行存储的。而且 znode 节点还分为 4 中不同的类型。

每一个 znode 默认能够存储 1MB 的数据(对于记录状态性质的数据来说,够了)

可以使用 zkCli 命令,登录到 zookeeper 上,并通过 ls、create、delete、get、set 等命令操作这些 znode 节点

2 Znode 节点类型

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

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

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

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

四、 安装 zookeeper

1 安装单机版

1.1安装 Linux

1.2安装 JDK

配置环境变量

  1. export JAVA_HOME=/usr/local/jdk
  2. export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
  3. export PATH=$JAVA_HOME/bin:$PATH

1.3上传 Zookeeper

官方资源包可在 http://zookeeper.apache.com 站点中下载。最新发布版本为:3.4.12

1.4解压 Zookeeper 压缩包

  1. [root@localhost temp]# tar -zxf zookeeper-3.4.6.tar.gz
  2. [root@localhost temp]# cp zookeeper-3.4.6 /usr/local/zookeeper -r

1.5Zookeeper 目录结构

  • 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 源码

1.6配置 Zookeeper

Zookeeper 在启动时默认的去 conf 目录下查找一个名称为 zoo.cfg 的配置文件。

在 zookeeper 应用目录中有子目录 conf。其中有配置文件模板:zoo_sample.cfg

cp zoo_sample.cfg zoo.cfg。zookeeper 应用中的配置文件为 conf/zoo.cfg。

修改配置文件 zoo.cfg - 设置数据缓存路径

5d1f2de93bfbb25cdcea13600089e8a0.png

1.7启动 Zookeeper

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

e613d1d5eb84966244c04852ca6f58ca.png

指定加载配置文件:./zkServer.sh start 配置文件的路径。

91a35777b2e25bb0cf45c3176c69af54.png

a308df51118a79a44f513cdcb7ee0d8e.png

2 安装集群版

2.1Zookeeper 集群中的角色

Zookeeper 集群中的角色主要有以下三类

a45c00f37229d6eaf10d0c0af75235da.png

addbfee37dc929305829a1b2c95b1a31.png

2.2设计目的

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 前面。

2.3集群安装

使用 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

77b7aad7e34f4e636f83bbfd7f2f6134.png

2.3.1提供数据缓存目录

在 zookeeper01 应用目录中,创建 data 目录,用于缓存应用运行数据

cd zookeeper01

mkdir data

fc2a615c558674ecbf191f91d5825dba.png

1de104dee033ca5bb1770c70b1d43416.png

2.3.2复制应用

复制两份 Zookeeper 应用。用于模拟集群中的 3 个节点。

cp -r zookeeper01 zookeeper02

cp -r zookeeper01 zookeeper03

d5ae2948ef4e4817dbb1d5526c00f92a.png

2.3.3提供配置文件

在 zookeeper 应用目录中有子目录 conf。其中有配置文件模板:zoo_sample.cfg

cp zoo_sample.cfg zoo.cfg

zookeeper 应用中的配置文件为 conf/zoo.cfg。

2.3.4修改配置文件 zoo.cfg - 设置数据缓存路径

dataDir 参数值为应用运行缓存数据保存目录。是 3.2.3 步骤中创建的目录。使用绝对路

径赋值。不同的应用路径不同。

cb287c6e5f877bce3c17c33d93868c07.png

223e8881050f019b5d6feb559bf096d7.png

2400327ccdb948c4068d2fc1e43f0a24.png

59217829ad8e993282f55724f041ea22.png

2.3.5提供应用唯一标识

在 Zookeeper 集群中,每个节点需要一个唯一标识。这个唯一标识要求是自然数。且唯 一标识保存位置是:$dataDir/myid。其中 dataDir 为配置文件 zoo.cfg 中的配置参数

在 data 目录中创建文件 myid : touch myid

为应用提供唯一标识。本环境中使用 1、2、3 作为每个节点的唯一标识。

vi myid

简化方式为: echo [唯一标识] >> myid。 echo 命令为回声命令,系统会将命令发送的 数据返回。 '>>'为定位,代表系统回声数据指定发送到什么位置。 此命令代表系统回声数据发送到 myid 文件中。 如果没有文件则创建文件。

2f8ac297abe365cad4d380063c8a105b.png

2.3.6修改配置文件 zoo.cfg - 设置服务、投票、选举端口

vi zoo.cfg

clientPort=2181 #服务端口根据应用做对应修改,zk01-2181,zk02-2182,zk03-2183

server.1=192.168.70.143:2881:3881

server.2=192.168.70.143:2882:3882

server.3=192.168.70.143:2883:3883

f4689de04fbcc9b8baef9f443c35231a.png

2.3.7启动 ZooKeeper 应用

bin/zkServer.sh start

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

Mode: leader - 主机

Mode: follower - 备份机

bd0ac443c0ffa3b55acad09419cdfc1f.png

2.3.8关闭 ZooKeeper 应用

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

188bc141b9d47254928cbe99ea28e75e.png

c64954e499e59d94fe5bef2d55a27fe1.png

bae1846ab386a2ddf2a26d5030521786.png

2.3.9控制台访问 ZooKeeper 应用

bin/zkCli.sh -server 192.168.199.175:2181

命令格式为: zkCli.sh -server host:port。默认连接 localhost:2181。

2.3.10 控制台客户端常用命令

本课程只介绍常用命令

connect host:port - 连接其他的 ZooKeeper 应用。

ls path - 列表路径下的资源。在 ZooKeeper 控制台客户端中,没有默认列表功能,必须指定要列表资源的位置。 如: ls / ; ls /path 等。

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 参数可以联合使用。

get path - 查看指定节点的数据。 如: get /test。结果如下:

  1. [zk: 192.168.199.175:2181(CONNECTED) 22] get /test
  2. 123
  3. cZxid = 0xd # 创建节点时的事务 ID,由 ZooKeeper 维护。
  4. ctime = Tue Jun 12 07:45:53 PDT 2018
  5. mZxid = 0x1f # 当前节点携带数据最后一次修改的事务 ID。
  6. mtime = Tue Jun 12 07:52:53 PDT 2018
  7. pZxid = 0x21 # 子节点列表最后一次修改的事务 ID。
  8. cversion = 1 # 节点版本号,当节点的子节点列表发生变化时,版本变更。
  9. dataVersion = 2 # 数据版本号,当节点携带数据发生变化时,版本变更。
  10. aclVersion = 0
  11. ephemeralOwner = 0x0 # 此数据值不是 0x0 时,代表是临时节点
  12. dataLength = 3 # 节点携带数据长度
  13. numChildren = 1 # 子节点数量

f1a289f4ce331597c07a3fbf8d49e3af.png

set path data [version] - 设置对应位置节点的数据。如: set /test 'test data'。 如果要设置的数据中有空格,则使用单引号界定数据的范围。每次修改数据后,dataVersion 属性自增。那么在 set 命令中可以指定 version,version 数据必须与上次查询的值一致,用于保证本次修改命令执行时,没有其他会话修改此数据。

delete path [version] - 删除指定节点,此命令不能删除有子节点的节点。如:delete /test。其中 version 参数和 set 命令的 version 含义一致

c537c6ccd3fc5ed048587f0f0bf35ef9.png

rmr path - 删除指定结点,包括子节点。

quit - 退出控制台

835c0494a476d2d361edfdc38255732e.png

常用命令

93872f013bc821b3ac1b1de43b80fb0b.png

五、Dubbo

1 Dubbo 介绍

Dubbo 是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring 框架无缝集成。Dubbo 框架,是基于容器 运行的.。容器是 Spring。

官方网站 : http://dubbo.apache.org/

阿里巴巴已经将 dubbo 框架捐献给了 Apache 软件基金会

2 单体架构

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

3 SOA 架构: Service-Oriented Architecture

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

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

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

六Dubbo 框架结构

1 Dubbo 角色介绍

49a081413f42a2cfd9e2dbf1e86a4553.png

1.1registry

注册中心. 是用于发布和订阅服务的一个平台.用于替代 SOA 结构体系框架中的 ESB 服

务总线的。

1.1.1发布

开发服务端代码完毕后, 将服务信息发布出去. 实现一个服务的公开.

1.1.2订阅

客户端程序,从注册中心下载服务内容 这个过程是订阅.

订阅服务的时候, 会将发布的服务所有信息,一次性下载到客户端.

客户端也可以自定义, 修改部分服务配置信息. 如: 超时的时长, 调用的重试次数等.

1.2consumer

服务的消费者, 就是服务的客户端.

消费者必须使用 Dubbo 技术开发部分代码. 基本上都是配置文件定义.

1.3provider

服务的提供者, 就是服务端.

服务端必须使用 Dubbo 技术开发部分代码. 以配置文件为主.

1.4container

容器. Dubbo 技术的服务端(Provider), 在启动执行的时候, 必须依赖容器才能正常启动.

默认依赖的就是 spring 容器. 且 Dubbo 技术不能脱离 spring 框架.

在 2.5.3 版本的 dubbo 中, 默认依赖的是 spring2.5 版本技术. 可以选用 spring4.5 以下版本.

在 2.5.7 版本的 dubbo 中, 默认依赖的是 spring4.3.10 版本技术. 可以选择任意的 spring 版本.

1.5monitor

监控中心. 是 Dubbo 提供的一个 jar 工程.

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

2 Dubbo 架构图的执行流程

2.1Dubbo 执行流程

0 start: 启动 Spring 容器时,自动启动 Dubbo 的 Provider

1 register: Dubbo 的 Provider 在启动后自动会去注册中心注册内容.注册的内容包括:

  • 1.1 Provider 的 IP
  • 1.2 Provider 的端口.
  • 1.3 Provider 对外提供的接口列表.哪些方法.哪些接口类
  • 1.4 Dubbo 的版本.
  • 1.5 访问 Provider 的协议.2 subscribe: 订阅.当 Consumer 启动时,自动去 Registry 获取到所已注册的服务的信息.

3 notify: 通知.当 Provider 的信息发生变化时, 自动由 Registry 向 Consumer 推送通知.

4 invoke: 调用. Consumer 调用 Provider 中方法

4.1 同步请求.消耗一定性能.但是必须是同步请求,因为需要接收调用方法后的结果.

5 count:次数. 每隔 2 分钟,provoider 和 consumer 自动向 Monitor 发送访问次数.Monitor

进行统计.

3 Dubbo 支持的协议

3.1Dubbo 协议(官方推荐协议)

优点: 采用 NIO 复用单一长连接,并使用线程池并发处理请求,减少握手和加大并发效率,

性能较好(推荐使用)

缺点: 大文件上传时,可能出现问题(不使用 Dubbo 文件上传)

3.2RMI(Remote Method Invocation)协议

1) 优点: JDK 自带的能力。可与原生 RMI 互操作,基于 TCP 协议

2) 缺点: 偶尔连接失败.

3.3Hessian 协议

1) 优点: 可与原生 Hessian 互操作,基于 HTTP 协议

2) 缺点: 需 hessian.jar 支持,http 短连接的开销大

4 Dubbo 支持的注册中心

4.1Zookeeper(官方推荐)

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

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

4.2Multicast

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

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

4.3Redis

1) 优点: 支持集群,性能高

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

4.4Simple

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

2) 缺点: 不支持集群.

七、 Dubbo 入门案例

1 安装 Zookeeper

2 创建 Provider

2.1创建工程

Provider 工程类型是 jar 类型

b496bb5575f2429fbeb65e8e02689536.png

2.2修改 POM 文件添加 Dubbo 的坐标

2.2.1关于版本的问题。在 Dubbo 的 2.5.3 版本中对于 spring的支持是 2.5.x。替换低版本的 spring。

  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.sxt</groupId>
  6. <artifactId>13maven-Dubbo-provier</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <dependencies>
  9. <!-- https://mvnrepository.com/artifact/com.alibaba/dubbo -->
  10. <dependency>
  11. <groupId>com.alibaba</groupId>
  12. <artifactId>dubbo</artifactId>
  13. <version>2.5.3</version>
  14. <!--去除依赖 -->
  15. <exclusions>
  16. <exclusion>
  17. <groupId>org.springframework</groupId>
  18. <artifactId>spring</artifactId>
  19. </exclusion>
  20. </exclusions>
  21. </dependency>
  22. <dependency>
  23. <groupId>org.springframework</groupId>
  24. <artifactId>spring-context</artifactId>
  25. <version>4.1.6.RELEASE</version>
  26. </dependency>
  27. </dependencies>
  28. </project>

2.2.2Dubbo 的 2.5.4 版本中对于 spring 的支持为 4.3.10

  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.sxt</groupId>
  6. <artifactId>13maven-Dubbo-provier</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <dependencies>
  9. <!-- https://mvnrepository.com/artifact/com.alibaba/dubbo -->
  10. <dependency>
  11. <groupId>com.alibaba</groupId>
  12. <artifactId>dubbo</artifactId>
  13. <version>2.5.4</version>
  14. </dependency>
  15. </dependencies>
  16. </project>

2.3创建服务

服务:项目中对外界所提供的能力

服务标准:接口+接口实现类

接口:对外界描述当前服务的信息,如协议类型,服务提供者的地址,发布的服务名称,服务中方法名称等信息。

接口实现类:对发布的接口中的标准的具体实现。

创建接口

  1. package com.sxt.service;
  2. /**
  3. * 服务接口
  4. * @author Administrator
  5. *
  6. */
  7. public interface DubboService {
  8. String showMsg(String str);
  9. }

创建接口实现类

  1. package com.sxt.service.impl;
  2. import com.sxt.service.DubboService;
  3. /**
  4. * 服务接口实现类
  5. * @author Administrator
  6. *
  7. */
  8. public class DubboServiceImpl implements DubboService{
  9. @Override
  10. public String showMsg(String str) {
  11. return "hello Dubbo "+str;
  12. }
  13. }

配置服务

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans.xsd
  8. http://www.springframework.org/schema/context
  9. http://www.springframework.org/schema/context/spring-context.xsd
  10. http://code.alibabatech.com/schema/dubbo
  11. http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
  12. <!--给应用起名字 -->
  13. <dubbo:application name="myprovider"/>
  14. <!-- 配置注册中心 -->
  15. <!-- address: 注册中心的IP和端口,注意:如果zookeeper是一个集群,哪些要将集群中所有的IP和端口添加该属性中-->
  16. <!-- protocol: 注册中心的类型-->
  17. <dubbo:registry address="192.168.226.128:2181,192.168.226.128:2182,192.168.226.128:2183" protocol="zookeeper"></dubbo:registry>
  18. <!--配置协议与端口 -->
  19. <dubbo:protocol name="dubbo" port="20880"></dubbo:protocol>
  20. <!--配置注册接口 -->
  21. <dubbo:service interface="com.sxt.service.DubboService" ref="dubboServiceImpl"></dubbo:service>
  22. <bean id="dubboServiceImpl" class="com.sxt.service.impl.DubboServiceImpl"></bean>
  23. </beans>

2.4启动 Provider

2.4.1启动 Zookeeper 注册中心

1b189e8996b5c8d19c16955318be8be6.png

2.4.2启动 Spring 容器

2.4.2.1 通过 SpringAPI 启动容器

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

2.4.2.2 启动时异常信息

JDK 版本不符合要求。注意 dubbo2.5.4 要求 jdk 必须是 1.8 或者以上的版本

c7f623f1c3dfe4d4d13e1d684535839c.png

Dubbo 启动时需要依赖 zookeeper 基于 java 语言的客户单工具

1fd37a74ee700f1648421fe87205a1a4.png

2.4.2.3 工具名称为:zkclient

修改 POM 文件添加 zkclient 坐标

3f2ae5bc55ceef3e459c900887b2e8fb.png

启动代码

  1. package com.sxt.start;
  2. import java.io.IOException;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. import com.alibaba.dubbo.container.Main;
  5. public class Start {
  6. public static void main(String[] args) throws Exception {
  7. /*ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("application-dubbo.xml");
  8. ac.start();
  9. System.in.read();*/
  10. //Main类下的main方法在启动时默认的回去classpath:/META-INF/spring/*.xml
  11. Main.main(args);
  12. }
  13. }

1d480641af7cadb3aa9609532f87dc9e.png

使用 DubboAPI 启动 Provider 特点:

1,自带线程阻塞

2,支持优雅关系

2.5注册中心中的服务发布信息

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

ls /dubbo/服务接口名称/providers

显示结果如下:

44cd1cb0510fe0fbb2f93538967b8432.png

3 Dubbo Admin 管理平台搭建

3.1安装 Admin 管理平台

Admin 管理平台是一个 war 项目

在 Linux 系统中安装 JDK 以及 tomcat。

使用 unzip 命令解压 zip 压缩包。

删除 tomcat/webapps 目录下的 ROOT 目录

将解压出来的 ROOT 目录拷贝到 tomcat/webapps 目录下

3.2配置 Admin 管理平台

5b8debc05b820053c8f606992be2527f.png

Address:zookeeper 的链接地址。如果是集群给一个就可以了

Root.password 设置默认 root 用户的密码

Guest.password 设置默认 guest 用户的密码

3.3访问 Admin 管理平台

2d6058e099c77414edda5d2e68d5da0e.png

4 创建 Consumer工程

dcf820247eace5ab4ce5d9406e2fdd50.png

修改 POM 文件

  1. <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/xsd/maven-4.0.0.xsd">
  2. <modelVersion>4.0.0</modelVersion>
  3. <groupId>com.sxt</groupId>
  4. <artifactId>14-dubbo-consumer</artifactId>
  5. <version>0.0.1-SNAPSHOT</version>
  6. <dependencies>
  7. <!-- https://mvnrepository.com/artifact/com.alibaba/dubbo -->
  8. <dependency>
  9. <groupId>com.alibaba</groupId>
  10. <artifactId>dubbo</artifactId>
  11. <version>2.5.4</version>
  12. </dependency>
  13. <!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
  14. <dependency>
  15. <groupId>com.101tec</groupId>
  16. <artifactId>zkclient</artifactId>
  17. <version>0.10</version>
  18. </dependency>
  19. <dependency>
  20. <groupId>com.sxt</groupId>
  21. <artifactId>13maven-Dubbo-provier</artifactId>
  22. <version>0.0.1-SNAPSHOT</version>
  23. </dependency>
  24. </dependencies>
  25. </project>

接口:

  1. package com.sxt.service;
  2. public interface UserService {
  3. void test(String str);
  4. }

接口实现类:

  1. package com.sxt.service.impl;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.stereotype.Service;
  4. import com.sxt.service.DubboService;
  5. import com.sxt.service.UserService;
  6. @Service
  7. public class UserServiceImpl implements UserService{
  8. @Autowired
  9. private DubboService dubboService;
  10. @Override
  11. public void test(String str) {
  12. //调用 Provider 下的服务
  13. System.out.println(this.dubboService);
  14. String var = this.dubboService.showMsg("bjsxt");
  15. System.out.println(var);
  16. }
  17. }

配置文件:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans.xsd
  8. http://www.springframework.org/schema/context
  9. http://www.springframework.org/schema/context/spring-context.xsd
  10. http://code.alibabatech.com/schema/dubbo
  11. http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
  12. <context:component-scan base-package="com.sxt.service"></context:component-scan>
  13. <dubbo:application name="myconsumer"/>
  14. <dubbo:registry address="192.168.226.128:2181,192.168.226.128:2182,192.168.226.128:2183" protocol="zookeeper"></dubbo:registry>
  15. <!-- 获取接口 -->
  16. <!-- 获取到接口的代理对象,生成接口的 Proxy,放入到 spring 容器中 -->
  17. <dubbo:reference interface="com.sxt.service.DubboService" id="dubboService"></dubbo:reference>
  18. </beans>

测试:

  1. package com.sxt.test;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. import com.sxt.service.UserService;
  5. public class ConsumerTest {
  6. public static void main(String[] args) {
  7. ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
  8. UserService userService = (UserService)app.getBean(UserService.class);
  9. userService.test("sxt");
  10. }
  11. }

运行结果:

1d270936056006174a15bfefe2993662.png
声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号