bjsxt学习笔记:Dubbo
一、Dubbo诞生背景(摘自Dubbo官网-入门-背景)

二、Dubbo架构图(摘自Dubbo官网-入门-架构)


三、Dubbo核心依赖(jar包):dubbo、zkclient
四、Dubbo项目搭建的方式:配置文件式、注解式
五、Dubbo项目配置文件的核心配置:
(一)配置文件式
1. 服务提供方(下示例):①应用名②协议(建议dubbo协议)③注册中心④暴露的具体服务接口⑤注册暴露的具体服务接口的实现类bean对象
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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="provide-xml"/>
<!--配置协议(用dubbo协议在20880端口(dubbo协议默认端口)暴露服务)-->
<dubbo:protocol name="dubbo" port="20880"/>
<!--配置注册中心,以暴露服务地址-->
<dubbo:registry address="zookeeper://192.168.110.11:2181"/>
<!--配置暴露服务的接口-->
<dubbo:service interface="com.bjsxt.dubbo.service.ITPService_xml" ref="dataServiceImpl"/>
<!--注册暴露的服务接口的实现类的bean对象-->
<bean id="dataServiceImpl" class="com.bjsxt.dubbo.service.impl.ITPServiceImpl_xml"/>
</beans>
2. 服务消费方(下示例):①应用名②注册中心③要调用的提供方所暴露的具体服务接口
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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-xml"></dubbo:application>
<!--配置注册中心,暴露发现服务地址-->
<dubbo:registry address="zookeeper://192.168.110.11:2181"/>
<!--声明所要调用的服务提供方暴露的服务接口(前提:已经将该接口复制到消费方的业务层中)-->
<dubbo:reference interface="com.bjsxt.dubbo.service.ITPService_xml" id="iTPService"/>
</beans>
(二)注解式
1. 服务提供方(下示例):①应用名②协议③注册中心④dubbo注解扫描
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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="provide-annotation"/>
<!--配置协议(用dubbo协议在20880端口(dubbo协议默认端口)暴露服务)-->
<dubbo:protocol name="dubbo" port="20880"/>
<!--配置注册中心,以暴露服务地址-->
<dubbo:registry address="zookeeper://192.168.110.11:2181"/>
<!--配置dubbo注解扫描(注解式:利用dubbo的注解@Service来代替配置式的另外两个配置)-->
<dubbo:annotation package="com.bjsxt.dubbo.service.impl"/>
</beans>
2. 服务消费方(下示例):①应用名②注册中心③dubbo注解扫描④声明调用暴露的具体服务接口的业务层实现类bean对象
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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-annotation"></dubbo:application>
<!--配置注册中心,暴露发现服务地址-->
<dubbo:registry address="zookeeper://192.168.110.11:2181"/>
<!--配置dubbo注解扫描-->
<dubbo:annotation package="com.bjsxt.dubbo.service.impl"/>
<!--配置服务消费者调用提供方暴露的服务接口的业务实现类bean对像-->
<bean id="iTServiceConsumerImpl_SSM" class="com.bjsxt.dubbo.service.impl.ITServiceConsumerImpl_SSM"/>
</beans>
六、示例-简单实现Dubbo项目:
(〇)本人测试项目的环境搭建(极简):
①maven下Java的quickstart模板②没有用SSM框架③注册中心选用zookeeper,安装在Linux虚拟机中
④没有面向对象三层架构中的持久层,只有数据类pojo/entity(测试数据自己在服务方暴露的服务接口的实现类的测试方法中自设定)
(一)配置文件式
1. 项目代码:
(1)服务提供方:
①数据类pojo/entity
package com.bjsxt.dubbo.pojo;
import lombok.Data;
import java.io.Serializable;
@Data
public class TestData implements Serializable {
private Integer uid;
private String uname;
}
②业务层service
i. 暴露的服务接口
package com.bjsxt.dubbo.service;
import com.bjsxt.dubbo.pojo.TestData;
import java.util.List;
public interface ITPService_xml {
//查询测试数据
List<TestData> selectTestData();
}
ii. 暴露的服务接口的实现类
package com.bjsxt.dubbo.service.impl;
import com.bjsxt.dubbo.pojo.TestData;
import com.bjsxt.dubbo.service.ITPService_xml;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
* spring框架中的@Autowired注解、@Resource注解和@Service注解
* @Autowired注解 省去了 在xml中<bean>配置的 <property> 和在对应<bean> 类中 属性的set、get方法
* @Resource注解 和@Autowired注解 极为相似
* @Service注解 省去了 在xml中<bean>的配置 ! 实现 xml零配置
* 详情:再说~
*/
@Service
public class ITPServiceImpl_xml implements ITPService_xml {
//查询测试数据(省略持久层,自定义测试数据)
@Override
public List<TestData> selectTestData() {
ArrayList<TestData> list=new ArrayList<>();
TestData testData=new TestData();
testData.setUid(0);
testData.setUname("fuck");
list.add(testData);
return list;
}
}
(2)服务消费方:
①数据类pojo/entity:同上
②业务层service:将服务提供方暴露的服务接口的代码复制过来,即可
2. 启动方式:
(1)服务提供方:
①API加载配置文件(本人没写这种方式)(可以参考下面的服务消费方的启动方式,也可以看Dubbo官网给出的示例代码):
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Provider {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"http://10.20.160.198/wiki/display/dubbo/provider.xml"});
context.start();
System.in.read(); // 按任意键退出
}
}
②利用dubbo服务运行容器的main方法:
前提:将spring配置文件安放在META-INF目录下的spring目录中,否则dubbo服务运行容器找不到spring配置文件

package com.bjsxt.dubbo;
import com.alibaba.dubbo.container.Main;
public class AppTest {
/**
* 通过加载spring配置文件,以启动dubbo的服务运行容器Container
* (该容器是spring类型的容器,
* dubbo配置式启动方法,除了直接加载spring配置文件,
* 再就是下面的通过dubbo中的Main类加载spring配置文件
* ——该方法须要将spring配置文件放在“META-INF”目录下的“spring”目录中)
*/
public static void main(String[] args) {Main.main(args);}
}
【运行结果·图】(前提:已经启动zookeeper注册中心,注册中心启动成功图略)(注:运行后,须手动关闭)

(2)服务消费方:API加载配置文件
package com.bjsxt.dubbo;
import com.bjsxt.dubbo.pojo.TestData;
import com.bjsxt.dubbo.service.ITPService_xml;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.List;
/**
* 这里只是简单的测试一下,不涉及web,服务提供方也不涉及持久层
*/
public class AppTest {
@Test
public void test(){
/*加载spring配置文件*/
ApplicationContext ac=new ClassPathXmlApplicationContext("spring-consumer.xml");
/*通过配置文件反射获取暴露的服务接口的业务层对象*/
ITPService_xml itpService_xml = ac.getBean("iTPService", ITPService_xml.class);
/*获取服务返回值*/
List<TestData> list=itpService_xml.selectTestData();
/*输出*/
System.out.println(list);
}
}
【运行结果·图】

(二)注解式
1. 项目代码:
(1)服务提供方:
①数据类pojo/entity:同上
②业务层service:同上
(2)服务消费方:
①数据类pojo/entity:同上
②业务层service:
i. 将服务提供方暴露的服务接口的代码复制过来
ii. 创建调用服务接口的消费方接口,及其实现类
package com.bjsxt.dubbo.service;
import com.bjsxt.dubbo.pojo.TestData;
import java.util.List;
public interface ITServiceConsumer_SSM {
//显示测试数据
List<TestData> show();
}
package com.bjsxt.dubbo.service.impl;
import com.alibaba.dubbo.config.annotation.Reference;
import com.bjsxt.dubbo.pojo.TestData;
import com.bjsxt.dubbo.service.ITService_SSM;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class ITServiceConsumerImpl_SSM implements com.bjsxt.dubbo.service.ITServiceConsumer_SSM {
@Reference
private ITService_SSM itService_ssm;
@Override
public List<TestData> show() {
return itService_ssm.selecte();
}
}
2. 启动方式:
(1)服务提供方:同上
(2)服务消费方:同上
(三)对比两种方式的不同:
1. 服务提供方
(1)配置文件:①配置文件式:
i. 需要专门配置:暴露的服务接口、声明暴露的服务接口的业务层实现类的bean对象
ii. 不需要配置:dubbo注解扫描
②注解式:
i. 需要专门配置:dubbo注解扫描
ii. 不需要配置:暴露的服务接口、声明暴露的服务接口的业务层实现类的bean对象
(2)注解:①配置文件式:业务层中,暴露的服务接口的实现类的注解@Service是spring框架的
②注解式:业务层中,暴露的服务接口的实现类的注解@Service是dubbo依赖的
2. 服务消费方:
(1)配置文件:①配置文件式:
i. 不需要配置:dubbo注解扫描
②注解式:
i. 需要专门配置:dubbo注解扫描
ii. 不需要配置:暴露的服务接口、声明暴露的服务接口的业务层实现类的bean对象
(2)注解:注解式:业务层中,暴露的服务接口的实现类里:①注解实现类的@Service是dubbo依赖的②声明服务提供方暴露的服务接口的实现类对象的属性的注解是dubbo依赖里的@Reference
七、个人总结:
1. 配置文件:
(1)服务提供方必须有的配置参数:提供方应用名、协议、注册中心
(2)服务消费方必须有的配置参数:消费方应用名、注册中心
2. 配置式区别于注解式之处
(1)配置文件-服务提供方:须要具体配置每一个暴露的服务接口,以及该接口所对应的实现类bean对象;注解式则只需要配置dubbo扫描即可
(2)配置文件-服务消费方:须要配置所要调用的服务接口(提供方暴露的);注解式则须要再多配置dubbo扫描、自身调用服务接口(提供方暴露的)的实现类
(3)业务层-服务提供方:服务接口(暴露的)的实现类中,使用spring的@Service注解该实现类;注解式则须要用dubbo的@Service(com.alibaba.dubbo.config.annotation.Service;)来注解该实现类
(4)业务层-服务消费方:
①配置式的消费方,可以在启动时(消费方的启动方式只有API加载配置文件这一种)通过反射设直接生成被调用的服务接口的对象(多态+反射),利用该对象完成操作
②注解式的消费方,是通过自身创建的某个接口的实现类,在这个实现类里面去调用提供方暴露的服务接口:
i.须要用spring的@Service(org.springframework.stereotype.Service)来注解该实现类;
ii. 这个实现类里面需要声明被调用的服务接口(提供方暴露的)的对象,该对象须要用dubbo的@Reference(com.alibaba.dubbo.config.annotation.Reference;)来注解
(不可以用spring的@Resource来注解)
3. 配置式相同于注解式之处:都须要将服务提供方暴露的服务接口的源文件复制到服务消费方的业务层中
4. 启动方式:
(1)API加载xml配置文件:略(详情见上面的示例)
(2)dubbo服务运行容器启动:
①只限于服务提供方(因为只有服务提供方有dubbo服务运行容器,可参考Dubbo架构图)
②须要将配置文件放置在META-INF目录下的spring目录中(目录名不可以拼错!!!否则会找不到配置文件的)
③使用dubbo的Main类(com.alibaba.dubbo.container.Main;)的main方法启动
bjsxt学习笔记:Dubbo的更多相关文章
- Dubbo 用户手册学习笔记 —— Dubbo架构
Dubbo的架构 节点角色说明 节点 角色说明 Provider 服务提供方 Consumer 服务消费方 Registry 服务注册与发现的注册中心 Monitor 统计服务的调用次数和调用时间的监 ...
- dubbo入门学习笔记之入门demo(基于普通maven项目)
注:本笔记接dubbo入门学习笔记之环境准备继续记录; (四)开发服务提供者和消费者并让他们在启动时分别向注册中心注册和订阅服务 需求:订单服务中初始化订单功能需要调用用户服务的获取用户信息的接口(订 ...
- Dubbo -- 系统学习 笔记 -- 快速启动
Dubbo -- 系统学习 笔记 -- 目录 快速启动 服务提供者 服务消费者 快速启动 Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubb ...
- Dubbo -- 系统学习 笔记 -- 配置
Dubbo -- 系统学习 笔记 -- 目录 配置 Xml配置 属性配置 注解配置 API配置 配置 Xml配置 配置项说明 :详细配置项,请参见:配置参考手册 API使用说明 : 如果不想使用Spr ...
- Dubbo -- 系统学习 笔记 -- 示例 -- 泛化引用
Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 泛化引用 泛接口调用方式主要用于客户端没有API接口及模型类元的情况,参数及返回值 ...
- Dubbo -- 系统学习 笔记 -- 示例 -- 结果缓存
Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 结果缓存 结果缓存,用于加速热门数据的访问速度,Dubbo提供声明式缓存,以减少用 ...
- Dubbo -- 系统学习 笔记 -- 示例 -- 分组聚合
Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 分组聚合 按组合并返回结果,比如菜单服务,接口一样,但有多种实现,用group区分 ...
- Dubbo -- 系统学习 笔记 -- 示例 -- 多版本
Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 多版本 当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间 ...
- Dubbo -- 系统学习 笔记 -- 示例 -- 服务分组
Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 服务分组 当一个接口有多种实现时,可以用group区分. <dubbo:se ...
随机推荐
- CSS实现单行文本溢出显示省略号
p { width:100px;//设定宽度 //以下三个属性设置均必不可少 white-space: nowrap; text-overflow:ellipsis; overflow:hidden; ...
- js中的回调地狱 Callback to Hell
本文重点:解决方式:1.promise 2. 拆解 function:将各步拆解为单个的 function 3. 通过 Generator 函数暂停执行的效果方式 4. 通过ES8的异步函 ...
- Linux用户都应该了解的命令行省时技巧
每个Linux用户都应该了解的命令行省时技巧 有网友在问答网站Quora上提问:“有哪些省时小技巧,是每个Linux用户都应该知道的?” Joshua Levy 平常就在 Linux 平台工作,并且他 ...
- python中常用的时间操作
python中常用的时间模块有time和datetime,以下是这两个模块中常用的方法: #先引入模块 import timefrom datetime import datetiem, timezo ...
- Linux下安装Dubbox
1.Dubbox简介 Dubbox 是一个分布式服务框架,其前身是阿里巴巴开源项目Dubbo ,被国内电商及互联网项目中使用,后期阿里巴巴停止了该项目的维护,当当网便在Dubbo基础上进行优化,并继续 ...
- 基于Redis做内存管理
1 Redis存储机制: redis存储的数据类型包括,String,Hash,List,Set,Sorted Set,它内部使用一个redisObject对象来表示所有的key和value,这个对象 ...
- phpstorm 生产php pojo类
一. 修改Generate POJO.groovy文件 改为 import com.intellij.database.model.DasTable import com.intellij.datab ...
- 51nod1600 Simple KMP
题目描述 对于一个字符串|S|,我们定义fail[i],表示最大的x使得S[1..x]=S[i-x+1..i],满足(x<i) 显然对于一个字符串,如果我们将每个0<=i<=|S|看 ...
- mybatis获取数据库自增id
http://blog.csdn.net/dyllove98/article/details/8866357 http://www.iteye.com/problems/86864 insert标签中 ...
- oracle SQL in plsql
刚安装好的oracle和plsql,以oracle11g为例 1.刚安装好后有两个默认的系统账号和初始密码:sys/change_on_install,system/manager 2.如果忘记了或不 ...