zookeeper与dubbo的使用

零.前言

按照计划,本月开始学习总结分布式和集群的相关知识点。公司所在项目使用的分布式是基于zookeeper和dubbo,就以它们为例进行总结,zookeeper是对分布式服务进行协调的应用,dubbo是分布式服务框架。学习理论枯燥且难以直观理解,本篇只讲使用,续文再讲原理。

一.zookeeper安装

二.dubbo安装

三.dubbo server端

四.dubbo client端

五.总结

正文:

一.zookeeper安装

1.1 下载Vmware,上面安装一个linux系统,从公司FTP中找到了Centos6.7,就直接拿来使用了。先查看有没有已安装的JDK

yum list installed | grep jdk

发现没有已经安装的JDK,那就进行安装(安装jdk8)

yum -y install java-1.8.0-openjdk*

然后查看是否被安装以及可执行路径

zookeeper 开启认证 dubbo zookeeper在dubbo中的作用_分布式集群


安装tomcat8,下载apache-tomcat-8.5.8.tar.gz  

tar -zxvf -C 解压即可

1.2 下载最新版zookeeper-3.4.9.tar.gz,解压后进入conf目录,将zoo_sample.cfg重命名为zoo.cfg。

查看zoo.cfg的配置,这个时候还没有server的配置;先不做任何修改

zookeeper 开启认证 dubbo zookeeper在dubbo中的作用_分布式集群_02

修改环境变量,将zookeeper添加进去。

vim /etc/profile

在末尾添加:

export PATH="$PATH:/usr/local/soft/zookeeper-3.4.9/bin"

重启虚拟机,执行

zookeeper 开启认证 dubbo zookeeper在dubbo中的作用_dubbo-monitor_03

通过zkServer.sh status查看状态,会发现是standalone状态,说明这个时候还没有进行集群;另外我们可以在/root/zookeeper.out中看到启动的日志

1.3 zookeeper集群

1.3.1 再克隆出两台虚拟机,三台机器的ip这个时候分别为:

192.168.13.118
192.168.13.120
192.168.13.121

1.3.2 

接着再每个虚拟机上编辑域名映射信息

vim /etc/hosts

添加下面内容

192.168.13.118  zk1
192.168.13.120  zk2
192.168.13.121  zk3

这样三台机器的域名分别为zk1,zk2,zk3;这样我们可以互相ping通

1.3.3启动zookeeper,并且查看状态

zookeeper 开启认证 dubbo zookeeper在dubbo中的作用_dubbo-monitor_04

为什么会启动失败呢,查找下原来是防火墙的问题,关闭防火墙

chkconfig iptables off

重启三台虚拟机,并且分别运行zookeeper,这个时候再查看状态,两个是follewer,一个leader(保持这三个服务开启,后面会用到)

zookeeper 开启认证 dubbo zookeeper在dubbo中的作用_分布式集群_05

zookeeper 开启认证 dubbo zookeeper在dubbo中的作用_dubbo-admin_06

二.dubbo安装

2.1 dubbo-admin  dubbo控制台安装  下载dubbo-admin-2.5.4.war

unzip -d 解压后,直接放在tomcat的webapps目录下,并把该目录下其他文件删除:

zookeeper 开启认证 dubbo zookeeper在dubbo中的作用_dubbo_07

然后修改dubbo-admin-2.5.4/WEB-INF下的dubbo.properties配置,如zk1的地址是192.168.13.118

dubbo.registry.address=zookeeper://192.168.13.118:2181
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest

接着就可以在浏览器里访问控制台了

zookeeper 开启认证 dubbo zookeeper在dubbo中的作用_dubbo_08

2.2 dubbo-monitor  dubbo监控中心安装  下载dubbo-monitor-simple-2.5.4.tar.gz

tar -zxvf -C解压后,编辑dubbo-monitor-simple/dubbo-monitor-simple-2.5.4-SNAPSHOT/conf下的dubbo.properties文件:

zookeeper 开启认证 dubbo zookeeper在dubbo中的作用_dubbo-admin_09

dubbo-monitor采用jetty启动,这里的jetty的端口注意不要和上面的dubbo-admin的tomcat端口冲突,dubbo-admin采用的是8080,这里jetty就使用8180好了。

bin/start.sh启动后,在浏览器里访问

zookeeper 开启认证 dubbo zookeeper在dubbo中的作用_dubbo-monitor_10


现在我们已经安装好了监控中心和控制台,那么它们有什么区别,看起来功能很相似?

区别是控制台可以提供服务治理的功能, 即可以修改服务的状态。

三.dubbo server端

概述:在两个应用之间进行接口的调用时(称之为RPC),我们可以使用传统的httpClient;其实还可以使用dubbo,它的工作机制是服务提供者(被调用者)把服务注册到dubbo,然后调用者从dubbo中获取服务,这样就完成了一次调用。 现在就解决了什么是dubbo的问题,即以区分httpClient的方式提供和调用服务。那为什么要使用dubbo?因为dubbo在应用之间提供和使用服务的时候,没有了地址的概念,而是换成了服务名,这样一方面省却了变化地址的问题,另一个方面也省却了增加或者减少地址的麻烦,因为对于dubbo来说,只需要增或减相关的服务即可。 下面就来介绍dubbo的使用

3.1 如何使用dubbo?

要想实现dubboServer和dubboClient之间完成调用,首先服务端和客户端需要一个接口来公用。可以有两种方式

1) 接口写在一个应用中,服务端和客户端都对这个应用进行引用

2) 更多的时候,两个应用是不太可能引用同一个应用。这个时候应该把接口以jar包的形式给Server和Client共同使用

然后,Server对jar包中的接口进行实现,并且向dubbo进行注册,而Client端调用jar包中的接口中的方法名,dubbo会去自动的寻找这个由Server端注册的方法的实现,本文就以jar包为例。

3.2 新建一个接口,然后打成jar包

package com.mycompany;

public interface dubboService {

	public String getString(String test);
	
}


zookeeper 开启认证 dubbo zookeeper在dubbo中的作用_dubbo_11


3.3 然后建一个项目,用来做Server端;这个项目就采用之前搭建的一个项目  这个项目采用的是JDK8,另外每次maven update或者install的时候,BuildPath都会采用Execution environment,我们需要修改其中的jdk版本:

zookeeper 开启认证 dubbo zookeeper在dubbo中的作用_dubbo-admin_12

另外还有一个问题是,如果maven install出现javax-servlet不存在(说明jdk配置还是稍微有点问题,因为javax-servlet在jdk中自带),那干脆就直接在pom中新增javax-servlet的依赖吧。

3.4 详细步骤

在pom中添加dubbo和zookeeper相关依赖:

<!-- 配置dubbo和zookeeper -->
	<dependency>
	 	<groupId>com.alibaba</groupId>
		<artifactId>dubbo</artifactId>
		<version>2.5.3</version>
		<exclusions>
<!-- 屏蔽dubbo自带的spring -->
			<exclusion>
				<groupId>org.springframework</groupId>
				<artifactId>spring</artifactId>
			</exclusion>
		</exclusions>
	</dependency>
	<dependency>  
        <groupId>org.apache.zookeeper</groupId>  
        <artifactId>zookeeper</artifactId>  
        <version>3.4.9</version>  
    </dependency>
<!-- 看看有没有其他的zkclient -->
	<dependency>
	  <groupId>com.github.sgroschupf</groupId>
	  <artifactId>zkclient</artifactId>
	  <version>0.1</version>
	</dependency>

由于dubbo内置的spring版本是2.5,低于我们使用的最新版4.3  所有把内置的spring排除注意添加完成后,maven update,然后再maven clean,maven install

导入jar包,然后写实现类:

package com.mycompany.dubboServer;

import org.springframework.stereotype.Service;

import com.mycompany.dubboService;
@Service("dubboService")
public class dubboServerImpl implements dubboService{

	public String getString(String arg0) {
		return arg0+"Dubbo";
	}

}

新建spring-dubbo.xml:

<?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-4.3.xsd
        http://code.alibabatech.com/schema/dubbo
        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">   

<!-- 指定注册中心 -->
<dubbo:registry address="zookeeper://192.168.13.118:2181" check="false"/>
<!-- 配置当前应用信息 -->
<dubbo:application  name="myWebAppServer"/>
<!-- 服务提供方指定的端口 -->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 提供服务者配置 -->
<dubbo:service  cluster="failsafe" ref="dubboService" interface="com.mycompany.dubboService" timeout="6000"  />

</beans>

web.xml中配置:

<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:spring.xml,
		classpath:springDubbo.xml,
		classpath:springQuartz.xml
		</param-value>
</context-param>

接着project-clean下,用tomcat8启动即可。由于这个时候那三台虚拟机还开着,所以我们就可以在监控中心和控制台中看到服务提供者:

zookeeper 开启认证 dubbo zookeeper在dubbo中的作用_dubbo-admin_13

注:如果在启动的时候报刚才的jar包找不到对应的类,那就设置下编译路径:

zookeeper 开启认证 dubbo zookeeper在dubbo中的作用_dubbo-admin_14

还有运行时路径:

zookeeper 开启认证 dubbo zookeeper在dubbo中的作用_zookeeper_15


这样设置好了之后,除非在pom中新增依赖,否则就不要随便maven install了,不然路径的设置会被破坏,还要重新设置。

四.dubboClient端

配置和Server端基本相同,下面是几个不同:

4.1 新建一个完全一样的项目,更改项目名,导入jar包,新建一个消费服务的类:

zookeeper 开启认证 dubbo zookeeper在dubbo中的作用_dubbo_16

package com.mycompany.dubboClient;

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

import com.mycompany.dubboService;

@Service("dubboClientTest")
public class dubboClientTest{

	@Autowired
	private dubboService dubboService;
	
	public void test(){
		System.out.println("dubboClientTest.test():"+dubboService.getString("Client"));
	}
}

4.2 spring-dubbo.xml少量不同:

<?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-4.3.xsd
        http://code.alibabatech.com/schema/dubbo
        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">   

<!-- 指定注册中心 -->
<dubbo:registry address="zookeeper://192.168.13.118:2181" check="false"/>
<!-- 配置当前应用信息 -->
<dubbo:application  name="myWebAppClient"/>
<!-- 服务提供方指定的端口 -->
<dubbo:protocol name="dubbo" port="20880" />
<dubbo:consumer check="false" />
<!-- 提供服务者配置 -->
<dubbo:reference  cluster="failsafe"  id="dubboService" interface="com.mycompany.dubboService" timeout="6000" />

</beans>

4.3 准备使用定时器来执行Client端,在spring-Quartz.xml中增加配置:

zookeeper 开启认证 dubbo zookeeper在dubbo中的作用_dubbo_17

4.4 配置一个新的tomcat8,修改端口号和上面那个tomcat8不同即可:

zookeeper 开启认证 dubbo zookeeper在dubbo中的作用_分布式集群_18

然后启动,我们可以在Client端的Console看到每隔一分钟就会打印信息,并且控制台出现了消费者:

zookeeper 开启认证 dubbo zookeeper在dubbo中的作用_dubbo-monitor_19

zookeeper 开启认证 dubbo zookeeper在dubbo中的作用_dubbo-admin_20

五.总结

先看一下服务类和消费类在项目中位置:

zookeeper 开启认证 dubbo zookeeper在dubbo中的作用_dubbo-admin_21

zookeeper 开启认证 dubbo zookeeper在dubbo中的作用_dubbo_22

到此基本上就已经结束了,只是明白了dubbo最基本的使用,即应用之间的rpc调用,服务提供者和使用者;关于原理等其他内容,后面再进行学习。