Dubbo+Zookeeper+SpringMVC整合实现分布式

Stella981
• 阅读 540

目录

Dubbo+Zookeeper+SpringMVC整合实现分布式服务治理框架... 1

一、分布式服务治理架构原理分析... 3

二、先决条件... 5

三、Zookeeper安装与配置... 6

3.1  Zookeeper下载与解压... 6

3.2 复制和编辑配置文件... 6

3.3 创建myid文件... 7

3.4 Zookeeper启动与停止... 7

3.5 Zookeeper命令行基本操作... 8

四、Dubbo管理界面安装与配置... 10

4.1 Dubbo管理界面下载与解压... 10

4.2 修改配置文件... 10

4.3 运行... 10

4.4 访问Dubbo管理界面... 10

五、Dubbo、Zookeeper与SpringMVC集成测试... 12

5.1 创建提供者及服务注册... 12

5.2 创建消费者及服务调用... 16

一、分布式服务治理架构原理分析

Dubbo是主流的采用RPC方式的分布式服务治理架构之一,实现了分布式服务注册、服务治理和服务监控等功能。通常需结合开源的Zookeeper、Redis或阿里数据库来完成注册中心的功能。其基本架构及原理如图1-1所示:

Dubbo+Zookeeper+SpringMVC整合实现分布式

图1-1 Dubbo实现微服务架构原理图

节点角色说明:

● Provider: 暴露服务的服务一个或多个提供方。

● Consumer: 调用远程服务的服务消费方。

● Registry: 服务注册与发现的注册中心,本文采用开源Zookeeper作为服务注册中心。

● Monitor: 统计服务的调用次调和调用时间的监控中心。

● Container: 服务运行容器。

调用关系说明:

(0)服务容器负责启动,加载,运行服务提供者。

(1)服务提供者在启动时,向注册中心注册自己提供的服务。

(2)服务消费者在启动时,向注册中心订阅自己所需的服务。

(3)注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。

(4)服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

(5)服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

二、先决条件

操作系统:CentOS 7.2

JAVA环境:jdk1.7.0_67

Web应用服务器:tomcat v7.0(自行解压安装)

三、Zookeeper安装与配置

本文Zookeeper部署采用由3台机器组成的集群模式,以下操作步骤在每台机器上均需执行,请注意不同机器间配置稍有变化。

3.1 Zookeeper下载与解压

wget http://archive.apache.org/dist/zookeeper/zookeeper-3.4.8/zookeeper-3.4.8.tar.gz

tar –zxvf zookeeper-3.4.8.tar.gz –C .

cd  zookeeper-3.4.8

3.2 复制和编辑配置文件

cp conf/zoo_sample.cfg zoo.cfg

vi conf/zoo.cfg

Dubbo+Zookeeper+SpringMVC整合实现分布式

图3-1

(1) 修改数据文件目录,也可采用默认值;

(2)"server.id=host:port:port"中的第一个port是从机器(follower)连接到主机器(leader)的端口号,第二个port是进行leadership选举的端口号。本文采用集群方式部署,添加机器时增加相应新记录即可,由于Zookeeper内部存在仲裁机制,机器数最好是奇数。

3.3 创建myid文件

dataDir所指定的目录下创建一个文件名为myid的文件,文件中的内容只有一行,为本主机对应的id值,也就是图3-1中server.id中的id。例如:在服务器1中的myid的内容应该写入1。Zookeeper集群模式不同机器上配置的id值一定要正确,如图3-2所示。

Dubbo+Zookeeper+SpringMVC整合实现分布式

图3-2

3.4 Zookeeper启动与停止

Zookeeper启动

启动Zookeeeper,启动成功使用jps可看到名为“QuorumPeerMain”的进程,如图3-3所示。注意,与Hadoop和Spark等集群方式启动不同,Zookeeper集群启动需要在每台机器上都运行该命令:

./bin/zkServer.sh start

Dubbo+Zookeeper+SpringMVC整合实现分布式

图3-3

Zookeeeper停止

./bin/zkServer.sh stop

3.5 Zookeeper命令行基本操作

连接Zookeeper****命令行终端

./bin/zkCli.sh –server 172.16.24.160:2181

Dubbo+Zookeeper+SpringMVC整合实现分布式

图3-4

Zookeeper增删改查基本命令

创建命令:

create /test ‘test’

查询命令:

get /test

修改命令:

set /test test_new

删除命令:

delete /test

Dubbo+Zookeeper+SpringMVC整合实现分布式

图3-5

四、Dubbo管理界面安装与配置

4.1 Dubbo管理界面下载与解压

下载Dubbo管理界面dubbo-admin-2.5.4并解压出来,见附件。

4.2 修改配置文件

解压后进入dubbo-admin-2.5.4\WEB-INF目录中,打开dubbo.properties文件如下配置,如图4-1所示:

Dubbo+Zookeeper+SpringMVC整合实现分布式

图4-1

4.3 运行

将修改好配置的dubbo-admin-2.5.4整个目标复制到Tomcat根目录的webapps下,进入Tomcat根目录执行如下命令进行启动,如图4-2所示:

Dubbo+Zookeeper+SpringMVC整合实现分布式

图4-2

4.4 访问Dubbo管理界面

打开浏览器,输入地址:http://172.16.24.160:8080/dubbo-admin-2.5.4/,用户名和密码均为root,参考前面dubbo.properties配置,如图4-3所示。

Dubbo+Zookeeper+SpringMVC整合实现分布式

图4-3

五、Dubbo、Zookeeper与SpringMVC集成测试

Dubbo、Zookeeper与SpringMVC集成测试需要编写提供者和消费者程序进行验证,下文只简述关键步骤,程序开发的细节请参考附件源代码。

5.1 创建提供者及服务注册

创建Maven****项目

先开发服务提供者程序,新建Maven项目,配置pom.xml文件加入dubbo、zookeeper等jar包,如图5-1所示:

Dubbo+Zookeeper+SpringMVC整合实现分布式

图5-1

②****创建接口

编写提供者的服务接口,如图5-2所示:

Dubbo+Zookeeper+SpringMVC整合实现分布式

图5-2

③****创建实现类

编写服务接口的具体实现类,如图5-3所示:

Dubbo+Zookeeper+SpringMVC整合实现分布式

图5-3

④****暴露服务配置

新建dubbo-provider.xml暴露服务配置文件,配置Zookeeper服务注册中心的IP、端口号、服务接口和接口实现类等信息,如图5-4所示:

Dubbo+Zookeeper+SpringMVC整合实现分布式

图5-4

具体配置说明:

● dubbo:application 标签一些属性的说明:

(1) name 必填,当前应用名称,用于注册中心计算应用间依赖关系,注意:消费者和提供者应用名不要一样,此参数不是匹配条件,你当前项目叫什么名字就填什么,和提供者消费者角色无关。

● dubbo:registry 标签一些属性的说明:

(1)address必填,可以Zookeeper集群配置,地址可以多个以逗号隔开等。

(2)check可选,注册中心不存在时,是否报错。

(3)subscribe可选,是否向此注册中心订阅服务,如果设为false,将只注册,不订阅。

(4)register可选,是否向此注册中心注册服务,如果设为false,将只订阅,不注册。

(5) dynamic 可选,服务是否动态注册,如果设为false,注册后将显示后disable状态,需人工启用,并且服务提供者停止时,也不会自动取消册,需人工禁用。

● dubbo: protocol标签的一些属性说明:

(1)name 必填,协议名称,缺省值dubbo。

(2)port可选,dubbo协议缺省端口为20880,rmi协议缺省端口为1099,http和hessian协议缺省端口为80 。

● dubbo:service标签的一些属性说明:

(1)interface必填,服务接口的路径

(2)ref必填,引用对应的实现类的Bean的ID

(3)registry可选,向指定注册中心注册,在多个注册中心时使用,值为dubbo:registry的id属性,多个注册中心ID用逗号分隔,如果不想将该服务注册到任何registry,可将值设为N/A。

● bean 标签一些属性的说明:

(1) id 是实现类的Bean的ID。

(2)class 是实现类的引用路径。

⑤****注册服务

编写注册服务主类Provider.java,如图5-5所示,读取并解释显露服务的配置文件dubbo-provider.xml,运行Main函数即可将上述写好的服务注册到Zookeeper注册中心上,如图5-6所示。

Dubbo+Zookeeper+SpringMVC整合实现分布式

图5-5

Dubbo+Zookeeper+SpringMVC整合实现分布式

图5-6

5.2 创建消费者及服务调用

①****调用服务配置

新建dubbo- consumer.xml调用服务配置文件,配置调用Zookeeper注册中心IP、端口号和提供商服务接口等信息,如图5-7所示:

Dubbo+Zookeeper+SpringMVC整合实现分布式

图5-7

具体配置说明:

● dubbo:application 和dubbo:registry标签属性说明同上:

● dubbo:reference标签属性说明:

(1)id 必填**,**服务引用BeanId。

(2)interface,必填,服务接口名,由于dubbo服务治理方式属于RPC方式,因而消费者需要明确知道服务的完整接口名方可调用。

②****调用服务

编写调用服务主类Consumer.java,如图5-8所示,读取并解释调用服务的配置文件dubbo-consumer.xml,运行Main函数即可完成服务调用,如图5-9所示。

Dubbo+Zookeeper+SpringMVC整合实现分布式

图5-8

Dubbo+Zookeeper+SpringMVC整合实现分布式

图5-9

Dubbo+Zookeeper+SpringMVC整合实现分布式

本文分享自微信公众号 - JAVA乐园(happyhuangjinjin88)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这