转载请注明源文出处:http://www.cnblogs.com/lighten/p/6828026.html

1 简介

dubbo是一个分布式服务框架,由阿里巴巴的工程师开发,致力于提供高性能和透明化的RPC远程服务调用。可惜的是该项目在2012年之后就没有再更新了,之后由当当基于dubbo开发了dubbox。这里对dubbo的入门构建进行简单的介绍。不涉及dubbo的运行机制,只是搭建过程,方便学习者快速构建项目,运行、熟悉该框架。

dubbo提供了两种构建项目的方法。1.通过Spring容器快速构建,其中还有注解的方式;2.通过直接使用API(不推荐)。以下对其一一说明。

2 前期工作

创建一个普通的maven项目,导入dubbo的依赖:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dubbo</artifactId>
    <version>2.5.3</version>
</dependency>

<dependency>
     <groupId>com.101tec</groupId>
     <artifactId>zkclient</artifactId>
     <version>0.4</version>
 </dependency>

下载zookeeper作为注册中心,具体步骤参考这里

3 Spring配置方式

3.1 生产者Provider

dubbo的生产者是用于提供服务的,先定义服务接口和服务的实现类:

public interface DemoService {

    public String greet(String name);
public List<User> getUsers(); }

这里有两个服务一个是输入一个字符串,一个是返回一个一个List对象,User类的内容如下:

public class User implements Serializable{

	private static final long serialVersionUID = 1L;

	private String name;
private int age;
private String sex; public User(String name, int age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
} public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
} @Override
public String toString() {
return "User [name=" + name + ", age=" + age + ", sex=" + sex + "]";
}
}

由于接口中会传递一个List的User对象,所以User需要实现Serializable接口。下面是DemoServiceImpl,接口的实现类中的内容:

public class DemoServiceImpl implements DemoService{

	@Override
public String greet(String name) {
return "Hello " + name;
} @Override
public List<User> getUsers() {
List<User> list = new ArrayList<User>(); User user1 = new User("张三",10,"男");
User user2 = new User("李四",11,"女");
User user3 = new User("王五",12,"男"); list.add(user1);
list.add(user2);
list.add(user3); return list;
} }

这就是一个简单的生产者提供的服务了,和普通的服务类没有什么区别,关键是下面的dubbo配置了。与Spring结合,需要一个dubbo的配置xml文件,我命名为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 -->
<bean id="demoService" class="com.xxx.dubbo.service.impl.DemoServiceImpl" /> <dubbo:application name="provider" /> <dubbo:registry address="zookeeper://127.0.0.1:2181" /> <dubbo:protocol name="dubbo" port="20886" payload="16777216"/> <dubbo:service interface="com.xxx.dubbo.service.DemoService" ref="demoService" />
</beans>

上面的XML配置文件就将服务暴露出去了,将其注册到了zookeeper中。最后运行Spring,测试:

public class Provider {

	public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"provider.xml"});
context.start();
System.in.read();
}
}

控制台输出日志如下,就可以了:

3.2 消费者

消费者的配置就更加简单了,其只需要想要调用的服务的接口,在这里就是DemoService接口,注意要确保是同一个接口。然后配置消费者的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="consumer"/> <dubbo:registry address="zookeeper://127.0.0.1:2181"/> <dubbo:reference id="demoService" interface="com.xxx.dubbo.service.DemoService" />
</beans>

reference就代表着引用一个服务,从暴露服务注册的注册中心获取,在spring中就有一个这样的接口实例了。测试类:

public class Consumer {

	public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"consumer.xml"});
context.start(); DemoService demoService = (DemoService) context.getBean("demoService");
System.out.println(demoService.greet("张三"));
System.out.println(demoService.getUsers());
}
}

开启刚刚的生产者测试类,再运行这个消费者测试类,就会看到打印出:

3.3 注解方式

  注解的方式配置起来非常的简单,全部如下:

  生产者就是实现类上打上@Service注解就可以了,注意这个注解是com.alibaba.dubbo.config.annotation.Service,不是Spring的Service注解。

@Service
public class AnnotationProvider implements DemoService{ @Override
public String greet(String name) {
return "Hello " + name;
} @Override
public List<User> getUsers() {
List<User> list = new ArrayList<User>(); User user1 = new User("张三",10,"男");
User user2 = new User("李四",11,"女");
User user3 = new User("王五",12,"男"); list.add(user1);
list.add(user2);
list.add(user3); return list;
}
}

配置文件也就是去掉了bean和<dubbo:service>,使用<dubbo:annotation>取代了:

<?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="provider" /> <dubbo:registry address="zookeeper://127.0.0.1:2181" /> <dubbo:protocol name="dubbo" port="20886" payload="16777216"/> <dubbo:annotation package="com.xxx.dubbo.spring.annotation.provider"/>
</beans>

消费者也相差无几:

@Service
public class AnnotationComsumer { @Reference(check=false)
private DemoService demoService; public void print() {
System.out.println(demoService.greet("张三"));
System.out.println(demoService.getUsers());
} }

注意这个Service是Spring的注解。配置文件如下:

<?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="consumer"/> <dubbo:registry address="zookeeper://127.0.0.1:2181"/> <dubbo:annotation package="com.xxx.dubbo.spring.annotation.consumer" />
</beans>

启动程序如下:

public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"annotation-provider.xml"});
context.start();
System.in.read();
} public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"annotation-consumer.xml"});
context.start();
AnnotationComsumer demoService = (AnnotationComsumer) context.getBean("annotationComsumer");
demoService.print();
}

最终效果和之前的一样。

4. API配置方式

这个简单说明一下,其实看API的方式和配置文件的方式就会明白一些,不做详细介绍。

public class APIProvider {

	public static boolean running = true;

	public static void main(String[] args) {

        DemoService demoService = new DemoServiceImpl();

        ApplicationConfig applicationConfig =  new ApplicationConfig();
applicationConfig.setName("provider"); RegistryConfig registryConfig = new RegistryConfig();
registryConfig.setAddress("zookeeper://127.0.0.1:2181"); ProtocolConfig protocolConfig = new ProtocolConfig();
protocolConfig.setName("dubbo");
protocolConfig.setPort(20886);
protocolConfig.setPayload(16*1024*1024); ServiceConfig<DemoService> service = new ServiceConfig<DemoService>(); service.setApplication(applicationConfig);
service.setRegistry(registryConfig);
service.setProtocol(protocolConfig);
service.setInterface(DemoService.class);
service.setRef(demoService); service.export(); Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
synchronized (APIProvider.class) {
running = false;
APIProvider.class.notify();
}
}
}); synchronized(APIProvider.class) {
while(running) {
try {
APIProvider.class.wait();
} catch (Throwable e) {
}
}
}
}
}
public class APIConsumer {

    public static void main(String[] args) {

        ApplicationConfig applicationConfig =  new ApplicationConfig();
applicationConfig.setName("consumer"); RegistryConfig registryConfig = new RegistryConfig();
registryConfig.setAddress("zookeeper://127.0.0.1:2181"); ReferenceConfig<DemoService> reference = new ReferenceConfig<DemoService>();
reference.setApplication(applicationConfig);
reference.setRegistry(registryConfig);
reference.setInterface(DemoService.class); DemoService demoService = reference.get();
System.out.println(demoService.greet("李四"));
System.out.println(demoService.getUsers());
}
}

都是要先定义ApplicationConfig和<dubbo:application>一致,后面RegistryConfig也一样<dubbo:registry>。具体过程之后篇章介绍。这种API的方法不被推荐使用。

5 后记

本篇主要是帮助新手快速入门搭建一个dubbo服务,之后会从整体结构上介绍一下dubbo是如何工作的,再往后会讲解一下源码实现。水平有限,有错请指教。

dubbo学习(1)--简单的入门搭建实例的更多相关文章

  1. Dubbo学习之简单环境搭建

    Dubbo服务的发展和作用: 首先,看下一般网站架构随着业务的发展,逻辑越来越复杂,数据量越来越大,交互越来越多之后的常规方案演进历程. 其次,当服务越来越多之后,我们需要做哪些服务治理? 最后,是d ...

  2. PYTHON 学习笔记1 PYTHON 入门 搭建环境与基本类型

    简介 Python,当然大家听到这个名词不再是有关于像JAVA 一样的关于后台,我们学习Python 的目的在于对于以后数据分析和机器学习AI 奠定基础,Python 在数据分析这一块,可谓是有较好的 ...

  3. 【深度学习】--DCGAN从入门到实例应用

    一.前述 DCGAN就是Deep Concolutions应用到GAN上,但是和传统的卷积应用还有一些区别,最大的区别就是没有池化层.本文将详细分析卷积在GAN上的应用. 二.具体 1.DCGAN和传 ...

  4. VASP学习笔记--简单的VASP运行实例:CrI3做非磁的优化

    一.总体思路 1)写入INCAR: 2)写入POSCAR,就是坐标文件: 3)写入KPOINTS文件,就是K点的选择: 4)写入POTCAR,写入POTCAR(找到势文件,然后按照POSCAR中的元素 ...

  5. Dubbo学习-5-监控中心simpleMonitor搭建

    之前已经下载好的dubbo-admin-master源码中,有dubbo-monitor-simple工程,同理,使用maven命令打包成一个可执行的jar包: 1.进入dubbo-monitor-s ...

  6. Dubbo学习-4-dubbo简单案例-2-服务提供者和消费者配置

    在上一篇帖子的基础上,开始使用dubbo来实现RPC调用: 根据dubbo的架构图可知,需要做以下几件事情: 1.将服务提供者注册到注册中心(暴露服务) (1)引入dubbo依赖, 这里依赖2.6.2 ...

  7. Dubbo学习-4-dubbo简单案例-1

    模拟一个需求,通过dubbo实现RPC调用: 这里用户服务模块的查询用户地址的功能,就是一个服务提供者,而订单服务模块的创建订单模块就是一个服务消费者: 1. 创建服务提供者的maven工程:user ...

  8. rpc框架dubbo学习入门及环境搭建(spring boot+Kotlin)

    学习之前,确保有以下知识基础: Java网络编程 Socket传输数据 IO流 rpc简介及实现 rpc是remote procedure call的简写,意思为远程过程调用. rpc应用较多的情景是 ...

  9. 《从0到1学习Flink》—— Mac 上搭建 Flink 1.6.0 环境并构建运行简单程序入门

    准备工作 1.安装查看 Java 的版本号,推荐使用 Java 8. 安装 Flink 2.在 Mac OS X 上安装 Flink 是非常方便的.推荐通过 homebrew 来安装. brew in ...

随机推荐

  1. 45 The Effect of External Rewards on Behavior 外界奖励对行为的影响

    The Effect of External Rewards on Behavior 外界奖励对行为的影响 ①Psychologists take opposing views on how exte ...

  2. angularjs写公共方法

    'use strict'; angular.module('fast-westone') .factory('commonUtilService', function () { return { /* ...

  3. DIV+CSS实战(二)

    一.说明 在DIV+CSS实战(一)中,已经把框架搭建起来了,现在就需要往框架里面添加内容了.需要实现的内容如下图: 二.头部的设计(全媒体订阅) 左侧是一张图片+标题 ,右侧是登录名 和上次登录的时 ...

  4. 搜狗Q3业绩迅猛增长,战略整合稳步推进

        继9月16日腾讯与搜狗战略结盟之后,最近搜狗再次吸引了业界关注的目光,10月29日,搜狗公布了截至2013年9月30日的第三季度未经审计的财务报告.财报显示,新搜狗Q3营收达5700万美元,同 ...

  5. paip.双网卡多网卡不能上网的联网配置

    paip.双网卡多网卡不能上网的联网配置 作者Attilax ,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog.csdn.net/att ...

  6. matlab toolboxes 大全

    MATLAB Toolboxes top (Top) Audio - Astronomy - BiomedicalInformatics - Chemometrics  - Chaos - Chemi ...

  7. sklearn 中fit_tansform 与 transform的区别

    https://blog.csdn.net/anecdotegyb/article/details/74857055 先fit_transform 后transform,不然会报错.

  8. Alwayson--问题总结二

    1. 备份首选项作用 答:备份首选项并不影响实际的备份操作,只是在备份前提供标示当前副本是否是推荐的备份副本.管理员可以忽略备份首选项在任意副本上执行完整备份和日志备份. 2. 在辅助副本和主副本备份 ...

  9. python——回文函数(reversed)

    回文数:正向排列与反向排列所得结果是相等的(即从左到右和从右到左的结果是相等的),例如:“123321”,“0000”等. reversed函数:反转一个序列对象,将其元素从后向前颠倒构建成一个新的迭 ...

  10. Flask基础-配置,路由

    一,配置文件 flask中的配置文件是一个flask.config.Config对象(继承字典),默认配置为: { 'DEBUG': get_debug_flag(default=False), 是否 ...