Dubbo入门

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: Dubbo入门教程

Dubbo入门

作者:海鹰

此教程参考阿里巴巴Dubbo官方网站(http://dubbo.io>)的例子进行编写

此教程提供PDF文档下载:
https://github.com/SeaEagle/Dubbo-Example/blob/master/dubbo-example.pdf>

代码在提交Github时已通过测试,运行无误

版权所有,未经允许,请勿随意转载。

1. 开发环境

正所谓工欲善其事,必先利其器。

笔者的开发环境

  1. 操作系统:OSX 10.10.5
  2. 开发语言:Java
  3. 构建工具:Maven
  4. 注册中心:ZooKeeper

验证Java

在命令行运行 java -version:

eagledeMacBook-Pro:~ eagle$ java -version
java version "1.7.0_80"
Java(TM) SE Runtime Environment (build 1.7.0_80-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)

验证Maven

在命令行运行 mvn -v:

eagledeMacBook-Pro:~ eagle$ mvn -v
Apache Maven 3.2.5 (12a6b3acb947671f09b81f49094c53f426d8cea1; 2014-12-15T01:29:23+08:00)
Maven home: /Users/eagle/ProgramTool/apache-maven-3.2.5
Java version: 1.7.0_80, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: "mac os x", version: "10.10.5", arch: "x86_64", family: "mac"

简单介绍ZooKeeper的安装及配置

获取

先到官网( http://zookeeper.apache.org )下载stable版本的Release包,发布此教程时,笔者使用的是3.4.6版本。

安装

将下载下来的包zookeeper-3.4.6.tar.gz解压,得到zookeeper-3.4.6文件夹之后,将其文件夹复制到个人喜好的位置。

配置 ( 此处只展示单机配置,关于集群配置可自行查阅文档 )

在与文件夹zookeeper-3.4.6同个目录下,创建三个文件夹,分别是datadataloglogs:

eagledeMacBook-Pro:standalone eagle$ ls
data        datalog        logs        zookeeper-3.4.6

进入文件夹zookeeper-3.4.6下的conf目录,复制zoo_sample.cfg文件,并将其命名为zoo.cfg,然后打开zoo.cfg文件进行编辑:

默认使用的是`clientPort=2181`,此处暂不要对其修改,以免无法运行笔者提供的代码。

zoo.cfg文件里添加两个配置,分别是dataDir和dataLogDir,并指向刚刚创建的data目录和datalog目录对应的路径,如:

dataDir=/Users/eagle/ProgramTool/zookeeper/standalone/data
dataLogDir=/Users/eagle/ProgramTool/zookeeper/standalone/datalog

运行

通过命令行cd到zookeeper-3.4.6目录下,运行bin/zkServer.sh start:

eagledeMacBook-Pro:zookeeper-3.4.6 eagle$ bin/zkServer.sh start
JMX enabled by default
Using config: /Users/eagle/ProgramTool/zookeeper/standalone/zookeeper-3.4.6/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

测试

运行bin/zkCli.sh -server 127.0.0.1:2181进行登录,登录成功之后则显示内容大致如下:

WATCHER::

WatchedEvent state:SyncConnected type:None path:null
[zk: 127.0.0.1:2181(CONNECTED) 0]

运行一些简单的指令进行测试:

[zk: 127.0.0.1:2181(CONNECTED) 7] ls /
[zookeeper]
[zk: 127.0.0.1:2181(CONNECTED) 8] create /dubbo dubbo
Created /dubbo
[zk: 127.0.0.1:2181(CONNECTED) 9] ls /
[dubbo, zookeeper]
[zk: 127.0.0.1:2181(CONNECTED) 10] get /dubbo
dubbo
cZxid = 0x5a
ctime = Fri Oct 09 10:27:07 CST 2015
mZxid = 0x5a
mtime = Fri Oct 09 10:27:07 CST 2015
pZxid = 0x5a
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0

当删除一个有子节点的节点时,会提示Node not empty:

[zk: 127.0.0.1:2181(CONNECTED) 2] get /dubbo
dubbo
cZxid = 0x2
ctime = Wed Sep 30 16:56:42 CST 2015
mZxid = 0x2
mtime = Wed Sep 30 16:56:42 CST 2015
pZxid = 0x6
cversion = 1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 1
[zk: 127.0.0.1:2181(CONNECTED) 3] delete /dubbo
Node not empty: /dubbo

此时可以使用rmr指令:

[zk: 127.0.0.1:2181(CONNECTED) 5] rmr /dubbo

关闭

运行bin/zkServer.sh stop即可关闭:

eagledeMacBook-Pro:zookeeper-3.4.6 eagle$ bin/zkServer.sh stop
JMX enabled by default
Using config: /Users/eagle/ProgramTool/zookeeper/standalone/zookeeper-3.4.6/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED

2. 编码

说到底,还是要撸代码的……

这个例子需要两个项目,一个为Provider,一个为Consumer

Provider项目

使用Maven构建一个简单的J2SE项目

新建一个服务接口DemoService.java:

public interface DemoService {
    /**
     * 测试方法
     * @param name
     * @return
     */
    String sayHello(String name);
}

新建一个服务接口实现类DemoServiceImpl:

public class DemoServiceImpl implements DemoService {
    /**
     * 测试方法 - 实现
     * @param name
     * @return
     */
    public String sayHello(String name) {
        return "Hello " + name;
    }
}

通过Spring进行注入,并将其服务注册到ZooKeeper:

<!-- 和本地bean一样实现服务 -->
<bean id="demoService" class="cn.eaglefire.app.service.impl.DemoServiceImpl" />

<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="hello-world-app-provider"  />

<!-- 使用zookeeper广播注册中心暴露服务地址 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181" />

<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />

<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="cn.eaglefire.app.service.DemoService" ref="demoService" />

Consumer项目

使用Maven构建一个简单的J2SE项目

新建一个服务接口DemoService.java:

public interface DemoService {
    /**
     * 测试方法
     * @param name
     * @return
     */
    String sayHello(String name);
}

通过Spring把注册到ZooKeeper的服务注入进来:

<!-- 使用zookeeper注册中心暴露服务地址 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181" />

<!-- 生成远程服务代理,可以像使用本地bean一样使用demoService -->
<dubbo:reference id="demoService" interface="cn.eaglefire.app.service.DemoService" />

项目之间的连接点

可以很明显的看到,在两个项目中都必须有服务接口DemoService.java,在实际开发应用中,这个接口将打包在一个jar包,并提供给Provider和Consumer两个项目使用,Provider对接口进行实现并注册到ZooKeeper,而Consumer在到ZooKeeper中寻找对应的接口实现。

3. 测试

不测试一下,怎么知道做得对不对

Provider项目

编写个主方法并直接运行,运行之后将在ZooKeeper中注册接口实现:

public class Provider {
    /**
     * 主方法
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        //
        System.out.println("Begin to load");
        // 加载Spring配置文件
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"spring/ApplicationContext.xml"});
        context.start();
        //
        System.out.println("End to load");
        // 为保证服务一直开着,利用输入流的阻塞来模拟
        System.in.read();
    }
}

运行结果:

Connected to the target VM, address: '127.0.0.1:50305', transport: 'socket'
Begin to load
log4j:WARN No appenders could be found for logger (org.springframework.core.env.StandardEnvironment).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
End to load

Consumer项目

编写个主方法并直接运行,运行之后将在ZooKeeper中寻找接口实现:

public class Consumer {
    /**
     * 主方法
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        //
        System.out.println("Begin to load");
        // 加载Spring配置文件
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"spring/ApplicationContext.xml"});
        context.start();
        //
        System.out.println("End to load");

        // 调用远程方法
        DemoService demoService = (DemoService)context.getBean("demoService");
        String result = demoService.sayHello("Eagle");
        System.out.println("The result is: "+result);

        // 为保证服务一直开着,利用输入流的阻塞来模拟
        System.in.read();
    }
}

运行结果:

Connected to the target VM, address: '127.0.0.1:50309', transport: 'socket'
Begin to load
log4j:WARN No appenders could be found for logger (org.springframework.core.env.StandardEnvironment).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
End to load
The result is: Hello Eagle

4. 结语

本教程到此结束,欢迎指正,互相交流。


版权所有,未经允许,请勿随意转载。

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
9月前
|
Dubbo Java 应用服务中间件
springboot + dubbo + zookeeper入门到实战超级详解
springboot + dubbo + zookeeper入门到实战超级详解
132 0
|
10月前
|
Dubbo Java 应用服务中间件
Netty入门到超神系列-手撸简单版RPC框架(仿Dubbo)
原理还是比较简单 : 代理 + 线程池 + Netty 下面做一些解释: 首先需要定义一个统一的API接口,例:UserApi , 服务端(provider)需要实现这个接口,提供相应的方法UserApiImpl#save,客户端通过远程来调用该接口。 然后需要约定一个协议,服务器如何才能识别到客户端要调用哪个接口?:我这里用 “接口权限定名#方法名#参数” ,的方式来,因为是一个简单版本的RPC。服务端解析该内容就能匹配对应的接口的实现类,然后调用该方法。并把方法的返回值通过Netty写回给客户端 使用的编解码器都是比价简单的String的编解码器
120 0
|
10天前
|
监控 负载均衡 Dubbo
分布式架构与Dubbo基础入门与实践
分布式架构与Dubbo基础入门与实践
40 1
|
10天前
|
Dubbo Java 应用服务中间件
分布式应用简单入门及SpringBoot整合Dubbo+Zookeeper
分布式应用简单入门及SpringBoot整合Dubbo+Zookeeper
51 1
|
6月前
|
Dubbo Java 应用服务中间件
微服务技术系列教程(29) - Dubbo-介绍&环境安装&入门案例
微服务技术系列教程(29) - Dubbo-介绍&环境安装&入门案例
58 0
|
10月前
|
SpringCloudAlibaba Dubbo 网络协议
十二.SpringCloudAlibaba极简入门-集成dubbo
在之前 《什么是 Spring Cloud Alibaba》一文中我们有介绍过Dubbo,除了SpringCloud以外,Dubbo它也是用来作为微服务架构落地的成熟解决方案,并且它在服务通信上比SpringCloud性能更高,这取决于它的底层实现是基于原生的TCP协议,它的定位就是一款高性能的RPC(远程过程调用)框架,所以在国内很多的企业都选择Dubbo作为微服务框架,本文章的目的是帮助同学们将Dubbo这款高性能的RPC框架集成到SpringCloud中,真正实现SpringCloud 和 Dubbo的混用。
|
缓存 负载均衡 监控
Dubbo-入门指南+实例
Dubbo-入门指南+实例
51 0
|
XML 负载均衡 监控
终于有人从入门到实战把Dubbo讲的这么清清楚楚了
很多时候,其实我们使用这个技术的时候,可能都是因为项目需要,所以,我们就用了,但是,至于为什么我们需要用到这个技术,可能自身并不是很了解的,但是,其实了解技术的来由及背景知识,对于理解一项技术还是有帮助的,那么,dubbo是怎么被提上日程的呢?
|
XML Dubbo Java
Dubbo3 入门实践:如何使用 Spring Boot 方式快速开发 Dubbo 应用
> 示例演示了如何使用 Spring Boot 方式快速开发 Dubbo 应用 > Dubbo 还提供了包括[XML](../../reference-manual/config/xml)、[API](../../reference-manual/config/api)等多种启动与接入方式,更多开发方式和配置细节可参见[配置手册](../../reference-manual/config/)。
335 0
|
Dubbo Java 应用服务中间件
dubbo的入门学习(三)springboot整合dubbo
dubbo的入门学习(三)springboot整合dubbo
dubbo的入门学习(三)springboot整合dubbo