dubbo 入门教程 基于zookeeper

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

 

从上午发布的安装zookeeper 遇到的第一个错误开始 一直在搞dubbo 中午吃了饭 睡了会觉 。中间错误一个又一个 慢慢的都解决了。小有成就,哈哈。算这个星期天没有白费吧。

 

学习的过程值得留恋。分享一下吧

只是之前听网友提过dubbo这个东西 一直都没有百度和使用过。前天答应老板 我们框架中留一个口出来 给dubbo 。今天天气热 就在宿舍研究吧。

 

首先是百度 知道是做什么的 后来就开始找教程 但是大家都知道 百度的教程 基本都是一个模板。看了大概有20篇 基本就换换字 代码 都是一样的。试了一下 不行 也不报错 也不知道在哪里入口。后来想想一定是不行 换一种方式吧 直接用main方法启动服务的方式。百度了一推 还是一样的模板 就是maven 但是哥没有使用过maven。在关键的时候还要研究一下maven 比较耗时间了。后来准备放弃的时候 聊会天,继续找有权威性的 找到dubbo的团队提供出来的。继续 发现spring的xml报错。后来浏览器访问啊 ping 啊 各种尝试 最后不行。再微博上看了dubbo发布的 在14年的时候 域名绑定就换成dubbo.io了 后来在这个网上看到了一个下载。是github 然后进去看看。 下载了2个demo。一个是基于http的,还有一个是基于ws也就是websevice的。看了一下 都是基于maven的。有点恼火了。刚刚开始百度的时候 第一步就是用zookeeper。最后官网给的例子不是zookeeper。继续看之前的例子,(总不能放弃吧)。还是没有结果。想想 先一步一步来吧。 于是新建了一个web项目 放入spring对应的包。找到dubbo的包 放了进来,然后找到zookeeper的包 放进来, 写一个接口 写一个实现类,配置文件就用的百度过来的,开始不明白,看了很多资料 自己也开始慢慢地理解过来了,于是在main里面启动服务,错误,说找不到类,好办了 我想一定是我的zookeeper的client没有加,但是我是服务器这边的 应该是不要的 想想  先加进去试试。服务器启动 再次报错。有看了一下包名 不是这个开放团队的client。再找 放进去 试试。还是对 少各种class 一个一个找 放进去。还不错 对了。服务启动  不抱错了,然后任何提示 启动成功的标志都没有 之后就学网上的人 在start 后面打印一句话。打印不出来,怎么回事呢。难道还是不对,百思不得其解。后来在想想 我是同时zookeeper注册的 我的zookeeper没有开。打开zookeeper。再次启动 对了。那叫一个兴奋。服务端就这样好了。

客户端就直接copy网上的代码,调用成功。 开始聊天 吹牛逼、。终于成功了。后来发现我的服务端和客户端都在一个项目上面的。然后在新建一个项目 放客户端。继续报错。 说找不到方法。找到对应的类下面的方法。是有的啊。难道是缓存。clear一下。还是不对。头晕了。准备放弃了。实在没有办法了。准备换http或者是ws的了。休息一下 喝杯水。想到了 难道是版本的问题。 找到上午发布文章的zookeeper下载的连接,下载了一个3.3.6的版本的zookeeper.jar放进去,好了。测试几次 真的是好了。哈哈

 

上面的话是写给我自己的 下面的教程是写给大家的。哈哈 有想法的可以评论 ;

第一步 在spring官网下载一个spring比较全的包。 我用的还是以前的3.2

第二步 新建一个web项目。将spring的包放在lib下面。

第三步 在dubbo.io官网的版本库下载dubbo的jar包。

第四步 在Apache的官网下载zookeeper的项目。 zookeeper的安装方法在上篇文章讲过了。拿出zookeeper根目录下面的zookeeper.jar就可以。

附加一些jar 工程下面有的 可以无视。slf4j-api-1.7.5.jar,slf4j-log4j12-1.7.5.jar,netty-3.7.0.Final.jar,jetty-util-6.1.26.jar,jetty-6.1.26.jar,commons-cli-1.2.jar 这些jar在zookeeper3.5的lib下面都有。直接拷贝就可以。

还有一个就是zkclient-0.1.0.jar 一定要下载I0Itec的,这个应该不是zk开发的。这个我也忘记在哪里下载的了。不好意思。要是需要的可以在下面评论 留个邮箱什么的。

下面新建一个接口:

?
1
2
3
4
5
6
package  com.unj.dubbotest.provider;
public  abstract  interface  DemoService {
  
  public  abstract  String build(String name)  throws  Exception;
  
}

新建一个实现类

?
1
2
3
4
5
6
7
8
package  com.unj.dubbotest.provider.impl;
import  com.unj.dubbotest.provider.DemoService;
public  class  DemoServiceImpl  implements  DemoService {
  public  String build(String name)  throws  Exception {
   System.out.println( "name is === "  + name);
   return  "你好 名称是 ------------- >>>> "  + name;
  }
}

在src下面新建一个applicationContext.xml 内容如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?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.unj.dubbotest.provider.impl.DemoServiceImpl"  />
  <!-- 提供方应用信息,用于计算依赖关系 -->
  <dubbo:application name= "xixi_provider"  />
  <!-- 使用multicast广播注册中心暴露服务地址 
   <dubbo:registry address= "multicast://224.5.6.7:1234"  />-->
  <!-- 使用zookeeper注册中心暴露服务地址 -->
  <dubbo:registry address= "zookeeper://127.0.0.1:2181"  />
  <!-- 用dubbo协议在 20880 端口暴露服务 -->
  <dubbo:protocol name= "dubbo"  port= "20880"  />
  <!-- 声明需要暴露的服务接口 -->
  <dubbo:service  interface = "com.unj.dubbotest.provider.DemoService"
   ref= "demoService"  />
</beans>

最后写一个启动服务的类 (用过cxf的都知道)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package  com.unj.dubbotest.provider;
import  org.springframework.context.support.ClassPathXmlApplicationContext;
public  class  Provider {
  
     public  static  void  main(String[] args)  throws  Exception {
      
      ClassPathXmlApplicationContext context =  new  ClassPathXmlApplicationContext( new  String[] { "applicationContext.xml" });
         context.start();
  
         System.out.println( "新浪微博:疯狂的杨中仁." );
         
         System.in.read();  // 按任意键退出
     }
  
}

 

启动zookeeper。在执行启动服务的类 控制台打印了如下信息

?
1
2
3
4
log4j:WARN No appenders could be found  for  logger (org.springframework.core.env.StandardEnvironment).
log4j:WARN Please initialize the log4j system properly.
SLF4J: This version of SLF4J requires log4j version  1.2 . 12  or later. See also http: //www.slf4j.org/codes.html#log4j_version
新浪微博:疯狂的杨中仁.

说明启动成功了。

下面在做客户端。同意 新建一个web项目 把服务端的jar全部拷贝到lib下面去。

新建一个接口 包名和服务端一样 这边接口 其实要在服务器那边拿过来的。

?
1
2
3
4
5
6
package  com.unj.dubbotest.provider;
public  abstract  interface  DemoService {
  
  public  abstract  String build(String name)  throws  Exception;
  
}

在src下面新建一个 applicationConsumer.xml文件。内容如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  <?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  
         ">
  <!-- consumer application name -->
  <dubbo:application name= "consumer-of-helloworld-app"  />
  <!-- registry address, used  for  consumer to discover services -->
  <dubbo:registry address= "zookeeper://127.0.0.1:2181"  />
  <dubbo:consumer timeout= "5000"  />
  <!-- which service to consume? -->
  <dubbo:reference id= "demoService"
   interface = "com.unj.dubbotest.provider.DemoService"  />
</beans>

 

新建一个main类来测试:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package  com;
import  org.springframework.context.support.ClassPathXmlApplicationContext;
import  com.unj.dubbotest.provider.DemoService;
public  class  Main {
  
  public  static  void  main(String[] args) {
   
   
   ClassPathXmlApplicationContext context =  new  ClassPathXmlApplicationContext(
     new  String[] {  "applicationConsumer.xml"  });
   context.start();
   DemoService demoService = (DemoService) context.getBean( "demoService" );  // get
   // service
   // invocation
   // proxy
   String hello =  "" ;
   try  {
    hello = demoService.build( "新浪微博:疯狂的杨中仁" );
   catch  (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   // do invoke!
   System.out.println(Thread.currentThread().getName() +  " "  + hello);
  }
  
}

打印信息如下:

?
1
2
3
  log4j:WARN No appenders could be found  for  logger (org.springframework.core.env.StandardEnvironment).
log4j:WARN Please initialize the log4j system properly.
main 你好 名称是 ------------- >>>> 新浪微博:疯狂的杨中仁

在看一下服务器端打印的信息

 

这样就是dubbo 基于zookeeper。是客户端的 web还没有测试。 http,ws 也会在这几天写出来。

下文将介绍基于web容器的。

我想共享一些准备好的jar出来,但是没找到地方,看csdn 但是容量小。求方案。

 

引自:http://my.oschina.net/superman158/blog/466637