Dubbo创建提供者&消费者工程
1. 前言
Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。如果不想使用Spring配置,也可以通过使用API的方式进行调用(不推荐)。
使用Spring配置方式进行Dubbo配置时,服务定义部分放在服务提供方 remote-provider.xml,将服务引用部分放在服务消费方 remote-consumer.xml 。并在提供方增加暴露服务配置 <dubbo:service>,在消费方增加引用服务配置 <dubbo:reference>。
2. 需求
2.1 需求
电商系统,订单服务 需要调用 用户服务 获取某个用户的所有地址。
2.2 需求分析
由上面的信息可以判断出:暴露服务的服务提供方为【用户服务】,调用远程服务的服务消费方为【订单服务】,服务注册与发现的注册中心这里我们使用最常用【zookeeper】,服务运行容器我们使用Dubbo自带的【Spring容器】,监控中心不影响功能,下节再涉及。
2.3 注意事项
参考dubbo文档(服务化最佳实践),本程序设计时尽量遵循以下几条原则。

将提供方和消费方共同使用的POJO对象及接口抽离出来,减少代码冗余,接口实现放在其各自的包中。(将用户服务和订单服务都会用到的地址类提取出来,同时也把定义了获取地址方法的接口单独提取出来,共同放在一个API包中,消费方和提供方通过引入该API包,实现该包中的接口来定义各自获取地址的方法实现)

接口尽量大粒度,接口中的一个方法实现一个完整功能,接口中只定义本包相关业务的方法。(提供方实现用户服务获取地址的方法,消费方实现通过调用用户服务来获取地址的方法)

服务提供方和消费方共同调用的地址对象为POJO对象,实现序列化。

3. 开发
3.1 准备工作
启动zookeeper注册中心服务。(安装步骤之前讲过,链接)
3.2 分包
将服务提供方和消费方共用的服务模型和服务接口提取出来。

public class UserAddress implements Serializable {
private Integer id;
private String userAddress; //用户地址
private String userId; //用户id
private String consignee; //收货人
private String phoneNum; //电话号码
private String isDefault; //是否为默认地址 Y-是 N-否
//构造方法和getter/setter方法 略···
public interface UserService {
//按照用户id返回所有的收货地址
public List<UserAddress> getUserAddressList(String userId);
}
public interface OrderService {
//初始化订单
public List<UserAddress> initOrder(String userId);
}
3.3 服务提供方
在服务提供方实现接口:(对服务消费方隐藏实现)

引入相关依赖,引入dubbo包的同时会自动引入Spring相关jar包,此外,需要注意根据dubbo版本引入合适的zookeeper工具包。
<!-- 引入API包,实现其接口 -->
<dependency>
<groupId>com.zang.gmall</groupId>
<artifactId>gmall-interface</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency> <!-- 引入dubbo -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.2</version>
</dependency> <!-- 由于我们使用zookeeper作为注册中心,所以需要操作zookeeper dubbo 2.6以前的版本引入zkclient操作zookeeper
dubbo 2.6及以后的版本引入curator操作zookeeper -->
<!--
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
-->
<!-- curator-framework -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
@Service
public class UserServiceImpl implements UserService { @Override
public List<UserAddress> getUserAddressList(String userId) {
//模拟获取数据过程,这里为简化,自定义两个地址对象返回
UserAddress address1 = new UserAddress(1, "北京市昌平区宏福科技园综合楼3层", "1", "李老师", "010-56253825", "Y");
UserAddress address2 = new UserAddress(2, "深圳市宝安区西部硅谷大厦B座9层", "1", "王老师", "010-56253825", "N"); return Arrays.asList(address1, address2);
}
}
provider.xml,使用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://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://dubbo.apache.org/schema/dubbo
http://dubbo.apache.org/schema/dubbo/dubbo.xsd"> <!-- 1、指定当前服务/应用的名字(同样的服务名字相同,不要和别的服务同名) -->
<dubbo:application name="gmall-user-provider"></dubbo:application> <!-- 2、指定注册中心的位置 -->
<!-- <dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry> -->
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"></dubbo:registry> <!-- 3、指定通信规则(通信协议 通信端口) -->
<dubbo:protocol name="dubbo" port="20880"></dubbo:protocol> <!-- 4、暴露服务 ref:指向服务的真正的实现对象 -->
<dubbo:service interface="com.zang.gmall.service.UserService" ref="userServiceImpl"></dubbo:service> <!-- 服务的实现对象 -->
<bean id="userServiceImpl" class="com.zang.gmall.service.impl.UserServiceImpl"></bean> </beans>
通过Spring容器加载配置,启动服务
public class Provider {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("provider.xml");
context.start();
System.in.read(); //堵塞一下,等待消费方调用
}
}
3.4 服务消费方

引入同样的依赖
<dependency>
<groupId>com.zang.gmall</groupId>
<artifactId>gmall-interface</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency> <!-- 引入dubbo -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.2</version>
</dependency> <!-- curator-framework -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
实现通过服务提供者暴露的服务获取用户地址
/**
* 1、将服务提供者注册到注册中心(暴露服务)
* 1)、导入dubbo依赖(2.6.2)\操作zookeeper的客户端(curator)
* 2)、配置服务提供者
* 2、让服务消费者去注册中心订阅服务提供者的服务地址
*/
@Service
public class OrderServiceImpl implements OrderService { @Autowired
UserService userService; @Override
public List<UserAddress> initOrder(String userId) {
System.out.println("用户id:"+userId); List<UserAddress> addressList = userService.getUserAddressList(userId);
for (UserAddress userAddress : addressList) {
System.out.println(userAddress.getUserAddress());
}
return addressList;
}
}
consumer.xml:通过Spring配置引用远程服务
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- 开启包扫描 -->
<context:component-scan base-package="com.zang.gmall.service.impl"></context:component-scan> <!-- 1、指定当前服务/应用的名字(同样的服务名字相同,不要和别的服务同名) -->
<dubbo:application name="gmall-order-consumer"></dubbo:application>
<!-- 2、指定注册中心的位置 -->
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"></dubbo:registry>
<!-- 3、声明需要调用的远程服务的接口;生成远程服务代理 -->
<dubbo:reference id="userService" interface="com.zang.gmall.service.UserService"></dubbo:reference>
</beans>
加载Spring配置,调用远程服务
public class Consumer {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("consumer.xml");
OrderService orderService = context.getBean(OrderService.class);
orderService.initOrder("1");
System.out.println("调用完成....");
System.in.read();
}
}
4. 调用结果

控制台查看
通过管理控制台可以看到服务的提供者和消费者的详细信息


Dubbo创建提供者&消费者工程的更多相关文章
- dubbo 解决既是消费者又是提供者 Duplicate application configs 的问题
首先 有应用A 是 提供者 应用B 来实现既是消费者又是提供者 在应用 B 这边新建两个xml dubbo-consumer.xml 消费者 <!-- 自动扫描注解:通过dubbo实现 - ...
- 工程启动没有报错,但是dubbo后台显示没有提供者,工程没有提供服务
先说一下我遇到的问题:服务工程启动没有异常,消费者工程启动会出现很多nested(嵌套的)错误,但其根本错误是No provider available(缺少服务提供者).可是服务工程起来的时候明明没 ...
- Dubbo应用到web工程
一.创建提供者03-provider-web (1) 创建工程 创建Maven的web工程,然后创建实现类. (2) 导入依赖 Spring的版本为4.3.16 需要的依赖有: dubbo2.7.0版 ...
- dubbo学习(八)dubbo项目搭建--消费者(服务消费者)
PS: 项目架子以及工程间的maven依赖配置暂时省略,后续看情况可能会单独写一篇文章捋捋框架结构,先马克~ 配置和启动 1.pom文件引入dubbo和zookeeper的操作客户端(此步骤与生产者 ...
- 使用IntelliJ IDEA创建Maven聚合工程、创建resources文件夹、ssm框架整合、项目运行一体化
一.创建一个空的项目作为存放整个项目的路径 1.选择 File——>new——>Project ——>Empty Project 2.WorkspaceforTest为项目存放文件夹 ...
- springcloud-Netflix创建服务消费者
目录 springcloud-Netflix创建服务消费者 Ribbon 创建服务消费者-Ribbon方式 ribbon的架构 Feign 创建包和基本项目结构 创建Feign访问服务的接口和访问co ...
- 【转载】使用IntelliJ IDEA创建Maven聚合工程、创建resources文件夹、ssm框架整合、项目运行一体化
一.创建一个空的项目作为存放整个项目的路径 1.选择 File——>new——>Project ——>Empty Project 2.WorkspaceforTest为项目存放文件夹 ...
- 简单读读源码 - dubbo多提供者(provider)配置方法
简单读读源码 - dubbo多提供者(provider)配置方法 消费者端dubbo的yml配置 dubbo: consumer: timeout: 300000 protocol: name: du ...
- 使用Eclipse创建Maven Web工程
方法/步骤 1 使用Eclipse创建Maven Web工程 2 找到Maven Project,点击Next 3 勾选上Create a simple project (不使用骨架),Next 4 ...
随机推荐
- PyTorch保存模型与加载模型+Finetune预训练模型使用
Pytorch 保存模型与加载模型 PyTorch之保存加载模型 参数初始化参 数的初始化其实就是对参数赋值.而我们需要学习的参数其实都是Variable,它其实是对Tensor的封装,同时提供了da ...
- mysql分布式数据库中间件对比
目前数据库中间件有很多,基本这些中间件在下都有了解和使用,各种中间件优缺点及使用场景也都有些心的.所以总结一个关于中间件比较的系列,希望可以对大家有帮助. 1. 什么是中间件 传统的架构模式就是 应用 ...
- Qt5.3.1 静态编译的configure
今天最终自己静态编译过了QT5.3.1, 成功用在项目上了, 记录下configure指令. configure -confirm-license -opensource -platform win ...
- PHP跨页面传递时session失效
一直都是使用wamp作为本地的PHP集成开发环境 今天遇到一个很奇怪的问题,就是在跨页面传递时session竟然失效了,而之前从来没有出现过这种问题 因为使用的是开源的php框架为了测试方便就新建了两 ...
- ASP入门(九)-Request对象小案例
我们将制作一个能够记住访问者姓名的页面,在这个小案例中,你将学会如何使用Request对象的Cookies.Form以及ServerVariables集合的值,还可以学习到如何使用Response对象 ...
- JAVA基础编程50题(4-6题)具体解释
一.描写叙述 1.将一个正整数分解质因数.比如:输入90,打印出90=2*3*3*5. 程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完毕: (1)假设这个质数恰等于n,则说明 ...
- C++中public、protected、private的差别
第一: private,public,protected的訪问范围: private: 仅仅能由该类中的函数.其友元函数訪问,不能被不论什么其它訪问.该类的对象也不能訪问. protected: ...
- C++ 第十课:标准c时间与日期函数
asctime() 时间文本格式 clock() 返回自程序开始运行所经过的时间 ctime() 返回特定格式时间 difftime() 两时刻的间隔 gmtime() 返回指向当前格林威治时间的指针 ...
- android studio 开发经常使用快捷键使用分享
windows开发经常使用快捷键 实体类生成get set 等方法 快捷生成变量快捷 windows开发经常使用快捷键 实体类生成get set 等方法 快捷键 alt + insert 快捷生成变量 ...
- 算法笔记_202:第三届蓝桥杯软件类决赛真题(Java高职)
目录 1 填算式 2 提取子串 3 机器人行走 4 地址格式转换 5 排日程 前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 填算式 [结果填空] (满分11分) 看这个算式: ☆☆☆ + ☆☆ ...