dubbo+zookeeper小例子

来源:互联网 发布:a5域名交易 编辑:程序博客网 时间:2024/05/13 00:12

项目使用:SpringMVC+maven

项目需要使用dubbo,所以自学了几天,仅提供给新手,请根据文档查看…该项目仅是测试项目,并不完善,只实现了需要使用的基本功能,并且只提供了使用dubbo模块的代码。写该博客一是希望能够帮助刚学习的新人,二是加深自己的印象,如果忘了也可以再看看,有些片段是从其他博客学习来的,如有问题希望能提出来,由衷的感谢。

zookeeper

zookeeper相当于注册中心客户端,Dubbo未对Zookeeper服务器端做任何侵入修改,只需安装原生的Zookeeper服务器即可,所有注册中心逻辑适配都在调用Zookeeper客户端时完成,也就是说zookeeper安装完后并不需要额外的修改,就可以实现基本功能。

zookeeper的安装:

以下zookeeper的安装都是在Linux下操作,需要在你的Linux中下载好tomcat,当然也需要配置好你的java环境变量

因为链接经常找不到,所以大家还是在官网http://www.apache.org/dyn/closer.cgi/zookeeper/自己下载,或者在csdn中也有免费的可以下载。

下载先解压,并且需要先修改conf文件下的一个文件名称

tar zxvf zookeeper-***.tar.gzcd zookeeper-***cp conf/zoo_sample.cfg conf/zoo.cfg

zookeeper的配置:

然后可以根据自己的需求修改zookeeper的配置,就是刚修改的zoo.cfg文件

vi conf/zoo.cfg
tickTime=2000   # Zookeeper服务器心跳时间,单位毫秒initLimit=10    # 投票选举新leader的初始化时间。syncLimit=5 # Leader与Follower之间的最大响应时间单位,响应超过syncLimit*tickTime,Leader认为Follwer死掉,从服务器列表中删除FollwerdataDir=/home/dubbo/zookeeper-3.3.3/data    # 数据持久化路径clientPort=2181 # 连接端口

当然Zookeeper也支持集群,我暂时没有用,所以还没有测试,在这里就不介绍,如有需要可以自己看其他的博客学习。

zookeeper服务的启动和停止:

进入自己解压的zookeeper文件夹内:
启动

./bin/zkServer.sh start

启动显示

JMX enabled by defaultUsing config: /home/zjm/Downloads/zookeeper-3.4.6/bin/../conf/zoo.cfgStarting zookeeper ... STARTED

表示启动成功

停止

./bin/zkServer.sh stop

zookeeper管理控制台安装

管理控制台为内部裁剪版本,开源部分主要包含:路由规则,动态配置,服务降级,访问控制,权重调整,负载均衡,等管理功能。

安装

首先进入自己安装的tomcat目录,删除webapps/ROOT

rm -rf webapps/ROOT

下载dubbo-admin解压到tomcat的webapps/ROOT

unzip dubbo-admin-2.4.1.war -d webapps/ROOT

配置

可以根据自己需求配置,也可以不修改(楼主没有修改)

vi webapps/ROOT/WEB-INF/dubbo.properties
dubbo.registry.address=zookeeper://127.0.0.1:2181dubbo.admin.root.password=rootdubbo.admin.guest.password=guest

启动tomcat

./bin/startup.sh

显示以下信息,表示启动成功
tomcat启动

访问控制台 (用户:root,密码:root 或 用户:guest,密码:guest)

http://127.0.0.1:8080/

zookeeper管理控制台首页

如果显示该页面表示安装成功,zookeeper就可以结束了,不需要其他的操作和配置。

如果需要在其他地方下访问注意关闭Linux的防火墙

dubbo

提供者

  • pom.xml
<!-- dubbo --><dependency>    <groupId>com.alibaba</groupId>    <artifactId>dubbo</artifactId>    <version>2.5.3</version></dependency><dependency>    <groupId>org.apache.zookeeper</groupId>    <artifactId>zookeeper</artifactId>    <version>3.4.6</version></dependency><dependency>    <groupId>com.github.sgroschupf</groupId>    <artifactId>zkclient</artifactId>    <version>0.1</version></dependency>
  • applicationContext.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 -->    <bean id="demoService" class="com.usercenter.service.impl.test.DemoServiceImpl" />    <!-- 提供方应用信息,用于计算依赖关系 -->    <dubbo:application name="dubbo_provider" />    <!-- 使用multicast广播注册中心暴露服务地址 <dubbo:registry address="multicast://224.5.6.7:1234"         /> -->    <!-- 使用zookeeper注册中心暴露服务地址:部署zookeeper控制台的电脑ip,也就是我刚才linux的ip -->    <dubbo:registry address="zookeeper://192.168.0.179:2181" />    <!-- 用dubbo协议在20880端口暴露服务 -->    <dubbo:protocol name="dubbo" port="20880" />    <!-- 声明需要暴露的服务接口 ,对应的具体实现类是自定义bean:demoService -->    <dubbo:service interface="com.usercenter.service.test.DemoService" ref="demoService" /></beans>

如果你的applicationContext.xml没有配置dubbo.xsd可能会报以下错误

Multiple annotations found at this line:    - cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'dubbo:application'.    - schema_reference.4: Failed to read schema document 'http://code.alibabatech.com/schema/dubbo/dubbo.xsd', because 1) could not      find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.

解决办法(我使用的是eclipse):

windows->preferrence->xml->xmlcatalog
点击Add

xmlcatalog

Location中写的是你自己的dubbo.xsd路径;Key是:http://code.alibabatech.com/schema/dubbo/dubbo.xsd。

dubbo.xsd你可以找到maven自动下载的dubbo-*.jar,右键压缩文件打开后,META-INF中有一个dubbo.xsd,解压出来到你自己的路径(注意不要放在eclipse的工程中)。

  • 首先自己写了个测试用的实体类,用于测试跨项目调用Bean(注意需要序列化)
package com.usercenter.service.impl.test;import java.io.Serializable;public class UserInfo implements Serializable {    /**     *      */    private static final long serialVersionUID = 1L;    private Integer id;    private String name;    private String password;    public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }}
  • 测试用的service接口(对应applicationContext.xml中暴露的service接口)
package com.usercenter.service.test;import java.util.List;import com.usercenter.service.impl.test.UserInfo;public interface DemoService {    String sayHello(String name);    public List<UserInfo> getUsers();}

测试用的service接口实现类(对应applicationContext.xml中暴露的service具体实现接口)

package com.usercenter.service.impl.test;import java.util.ArrayList;import java.util.List;import com.usercenter.service.test.DemoService;public class DemoServiceImpl implements DemoService {    public String sayHello(String name) {        return "Hello " + name;    }    public List<UserInfo> getUsers() {        List<UserInfo> list = new ArrayList<UserInfo>();        UserInfo user = new UserInfo();        user.setId(1);        user.setName("~~~~~~~~~~~~~~~~~~~~~zjm~~~~~~~~~~~~~~~~~~~~~");        user.setPassword("000000");        list.add(user);        return list;    }}
  • 启动“提供者”的类
package com.usercenter.service.impl.test;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Provider {    public static void main(String[] args) {        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "test/applicationContext.xml" });        context.start();        // 为保证服务一直开着,一直循环等待        synchronized (Provider.class) {            while (true) {                try {                    Provider.class.wait();                } catch (Throwable e) {                    System.out.println("服务异常:" + e.toString());                    context.close();                }            }        }    }}

最后需要把该项目打包成jar,放到“消费者”的项目中(maven直接打包成jar并上传到你的本地仓库或私服仓库就好了,每次修改只需要重新deploy就好了)

消费者

  • pom.xml
<!-- 提供者的jar --><dependency>    <groupId>renai.usercenter</groupId>    <artifactId>renai-usercenter-service</artifactId>    <version>1.0</version></dependency><dependency>    <groupId>com.alibaba</groupId>    <artifactId>dubbo</artifactId>    <version>2.5.3</version></dependency><dependency>    <groupId>org.apache.zookeeper</groupId>    <artifactId>zookeeper</artifactId>    <version>3.4.6</version></dependency><dependency>    <groupId>com.github.sgroschupf</groupId>    <artifactId>zkclient</artifactId>    <version>0.1</version></dependency>
  • applicationContext.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注册中心暴露服务地址:部署zookeeper控制台的电脑ip,也就是我刚才linux的ip -->    <dubbo:registry address="zookeeper://192.168.0.179:2181" />    <!-- 生成远程服务代理,可以像使用本地bean一样使用demoService -->    <dubbo:reference id="demoService" interface="com.usercenter.service.test.DemoService" /></beans>
  • 测试用的远程调用类(消费者)
package com.renai.card.manage.consumer;import java.util.List;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.usercenter.service.impl.test.UserInfo;import com.usercenter.service.test.DemoService;public class Consumer {    public static void main(String[] args) {        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "spring/renai-dubbo.xml" });        context.start();        DemoService demoService = (DemoService) context.getBean("demoService");        String hello = demoService.sayHello("~~~~~~~~~~~~~~~~~~~~~~~~~~炸酱面~~~~~~~~~~~~~~~~~~~~~~~~~~");        System.out.println(hello);        List<UserInfo> list = demoService.getUsers();        System.out.println(list.get(0).getName());    }}

以上就完成了dubbo的基本功能

如果想实现远程调用,首先需要启动提供者的Provider(我自己写的那个)类

启动后在zookeeper管理控制台上可以看到有了一个“提供者”
提供者

这样远程调用(运行我的“消费者”)就可以看到一下结果
远程调用运行结果

0 0
原创粉丝点击