一、安装zookeeper,集群模式配置
自行百度,下载解压
(由于机器有限,本文使用一台机器不同端口来模拟实现集群模式)
1、创建zookeepere文件夹
2、zookeeper文件夹下新建server1、server2、server3三个文件夹
3、复制解压后的zookeeper文件夹到server1、server2、server3这三个文件夹下
4、再分别在这三个文件夹下创建data、dataLog两个目录
完成后如下图
进入zookeeper-3.4.14/conf文件夹,重命名zoo-sample.cfg为zoo.cfg,并修改配置如下:
# 心跳检测时间间隔,单位ms
tickTime = 2000
#zookeeper集群中包含多台server,其中一台为leader,其余为follower,initLimit参数配置初始化连接时,follower和leader之间的最长心跳时间,设置为5,则表示时间限制为5倍tickTime
initLimit = 5
#syncLimit配置leader和follower之间发送消息、请求和应答的最大时间长度,设置为2,则说明时间限制为2倍tickTime
syncLimit = 2
dataDir=/Library/zookeeper/server1/data
dataLogDir=/Library/zookeeper/server1/dataLog
clientPort=2181
server.1 = 127.0.0.1:2222:2225
server.2 = 127.0.0.1:3333:3335
server.3 = 127.0.0.1:4444:4445
其中dataDir为data文件夹所在的位置, dataLogDir为dataLog文件夹所在的位置
server1里的clientPort=2181, server2里的clientPort=2182, server3里的clientPort=2183
在data文件夹里新增myid文件,文件内容为serverID, 如server1的myid文件的内容为1,server2的myid文件内容为2,以此类推
终端进入zookeeper3.4.14/bin目录下,执行./zkServer.sh start启动zookeeper服务,执行./zkServer.sh status查看服务状态,当状态为一个leader, 2个follower时,则启动成功
二、Dubbo服务生产者
项目结构如下
dubbotestapi项目下创建User对象
public class User implements Serializable{
private static final long serialVersionUID = 5264854701181085862L;
private Long id;
private String username;
private String password;
private Integer age;
public static long getSerialVersionUID() {
return serialVersionUID;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
创建userAPI接口
public interface UserAPI {
public List<User> getUsers();
String sayHello(String name);
}
将dubbotestapi打包生成jar引入dubbotestservice项目,并引入其他依赖的jar包
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.34.Final</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.6</version>
<exclusions>
<exclusion>
<artifactId>spring-context</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.14</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
<exclusions>
<exclusion>
<artifactId>zookeeper</artifactId>
<groupId>org.apache.zookeeper</groupId>
</exclusion>
<exclusion>
<artifactId>log4j</artifactId>
<groupId>log4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.0.1</version>
<exclusions>
<exclusion>
<artifactId>zookeeper</artifactId>
<groupId>org.apache.zookeeper</groupId>
</exclusion>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
配置dubbo-provider.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.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<bean id="userService" class="com.qjj.service.UserAPIImpl"/>
<dubbo:application name="dubbo-provider"/>
<dubbo:registry protocol="zookeeper" address="127.0.0.1:1281,127.0.0.1:2182,127.0.0.1:2183" client="zkclient"/>
<dubbo:protocol name="dubbo" port="20880"/>
<dubbo:service interface="com.qjj.api.UserAPI" ref="userService"/>
</beans>
添加userAPI接口的实现类userAPIImpl文件
public class UserAPIImpl implements UserAPI{
public List<User> getUsers() {
List<User> list = new ArrayList<User>();
for (int i=0;i<10;i++){
User user = new User();
user.setUsername("username_" + i);
user.setId(Long.valueOf(i+1));
user.setAge(10 + i);
user.setPassword("123456");
list.add(user);
}
return list;
}
public String sayHello(String name) {
return "11111";
}
三、Dubbo服务消费者
引入依赖的jar包
<dependency>
<groupId>com.qjj</groupId>
<artifactId>dubbotest.api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.12.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.12.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.12.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.12.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.12.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>4.3.12.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.3.12.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.12.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.3.12.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.12.RELEASE</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.34.Final</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.6</version>
<exclusions>
<exclusion>
<artifactId>spring-context</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.14</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
<exclusions>
<exclusion>
<artifactId>log4j</artifactId>
<groupId>log4j</groupId>
</exclusion>
<exclusion>
<artifactId>zookeeper</artifactId>
<groupId>org.apache.zookeeper</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.2.0</version>
<exclusions>
<exclusion>
<artifactId>zookeeper</artifactId>
<groupId>org.apache.zookeeper</groupId>
</exclusion>
</exclusions>
</dependency>
创建dubbo-consumer.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.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd
">
<!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
<dubbo:application name="dubbo-consumer" />
<!-- 使用zookeeper注册中心暴露服务地址 -->
<!-- <dubbo:registry address="multicast://224.5.6.7:1234" /> -->
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183" client="zkclient"/>
<!-- 生成远程服务代理,可以像使用本地bean一样使用demoService -->
<dubbo:reference id="userService" interface="com.qjj.api.UserAPI" />
</beans>
创建测试类
public class consumer {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
new String[] { "dubbo-consumer.xml" });
context.start();
UserAPI userAPI = context.getBean(UserAPI.class);
String hello = userAPI.sayHello("qijiaojiao");
System.out.println(hello);
List list = userAPI.getUsers();
if (list != null && list.size() > 0) {
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
}
运行测试类,执行结果如下: