4、实践测试

4.1)、提出需求

某个电商系统,订单服务需要调用用户服务获取某个用户的所有地址;
我们现在 需要创建两个服务模块进行测试 

测试预期结果:
订单服务web模块在A服务器,用户服务模块在B服务器,A可以远程调用B的功能。

TEST..........................

接口以及需要用的bean进行提取为一个新的工程

UserAddress.java

public class UserAddress {
private Integer id;
private String userAddress;//地址
private String userId;//用户id
private String consignee;//收件人
private String idDefault;//是否默认地址
private String phoneNum;//电话
...
}

OrderService.java

//用户服务
public interface UserService { //按照用户id返回所有的收货地址
public List<UserAddress> getUserAddressList(String userId);
}
此时的工程只有bean实例和功能实现的接口
实现相关都在其他工程中进行实现
实现分离的目的
 

服务的提供者:

依赖关系的配置:

    <dependencies>
<dependency>
<groupId>com.cr</groupId>
<artifactId>user-interface</artifactId>
<version>1.0</version>
</dependency>
</dependencies>

UserServiceImpl.java

public class UserServiceImpl  implements UserService {
@Override
public List<UserAddress> getUserAddressList(String userId) {
UserAddress address1 = new UserAddress(, "安徽合肥蜀山区", "", "程老师", "否", "");
UserAddress address2 = new UserAddress(, "安徽合肥包河区", "", "程老师", "否", "");
List<UserAddress> list = new ArrayList<UserAddress>();
list.add(address2);
list.add(address1);
return list;
}
}

服务消费者 

引入依赖:

  <dependencies>
<dependency>
<groupId>com.cr</groupId>
<artifactId>user-interface</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
OrderServiceImpl.java
public class OrderServiceImpl implements OrderService{
UserService userService;
@Override
public void initOrder(String userId) { //查询用户的收货地址
List<UserAddress> addressList = userService.getUserAddressList(userId);
System.out.println(addressList);
}
}

此时需要使用Dubbo进行远程调用消息服务者的接口进行实现功能!!!

改造的步骤:

1.1.导入dubbo依赖(2.6.2)

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

<!-- 注册中使用的是zookeeper,需要引入操作zookeeper的客户端 -->
<!-- 由于我们使用zookeeper作为注册中心,所以需要操作zookeeper
dubbo 2.6以前的版本引入zkclient操作zookeeper
dubbo 2.6及以后的版本引入curator操作zookeeper
-->

<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.</version>
</dependency>

1.2.配置服务提供者

<?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/dubbohttp://dubbo.apache.org/schema/dubbo/dubbo.xsd"> <!-- 、指定当前服务/应用的名字(同样的服务名字,不要和别的服务同名 -->
<dubbo:application name="user-service-provider"></dubbo:application> <!-- 、指定注册中心的位置 -->
<!-- 两种写法 -->
<!-- dubbo:registry protocol="zookeeper" address="10.20.153.10:2181" -->
<dubbo:registry address="zookeeper://127.0.0.1:2181" /> <!-- 、指定通信规则(通信协议&通信端口 --> <dubbo:protocol name="dubbo" port=""></dubbo:protocol> <!-- 、暴露服务 -->
<!-- interface是只想接口,ref属性是指定接口的实现 -->
<dubbo:service interface="com.cr.service.UserService" ref="userServiceImpl"></dubbo:service>
<!-- 服务的实现 -->
<bean id="userServiceImpl" class="com.cr.service.impl.UserServiceImpl"></bean> </beans>
注册中心的配置
详情可以参考官方的配置

http://dubbo.apache.org/zh-cn/docs/user/references/registry/zookeeper.html

1.3、启动服务

public class MainApplication {
public static void main(String[] args) { ClassPathXmlApplicationContext ioc = new
ClassPathXmlApplicationContext("provider.xml");
ioc.start();
try {
System.in.read();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

此时可以在dubbo-admin管理控制台

2、让服务消费者这到注册中心订阅服务提供者的服务地址

<?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"
xmlns:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.3.xsd"> <context:component-scan base-package="com.cr.service.impl"></context:component-scan>
<!-- 、指定当前服务/应用的名字(同样的服务名字,不要和别的服务同名 -->
<dubbo:application name="user-order-consumer"></dubbo:application> <!-- 、指定注册中心的位置 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181" /> <!-- 、声明 需要调用的远程服务接口:生成远程服务代理-->
<!-- userService注册到容器中 -->
<dubbo:reference interface="com.cr.service.UserService" id="userService"></dubbo:reference> </beans>

OrderServiceImpl.java

//import org.springframework.stereotype.Service;
@Service
public class OrderServiceImpl implements OrderService{
@Autowired
UserService userService;

@Override
public void initOrder(String userId) { System.out.println(userService);
System.out.println("用户id:"+ userId);
//查询用户的收货地址
List<UserAddress> addressList = userService.getUserAddressList(userId); for(UserAddress address : addressList){
System.out.println(address.getUserAddress());
}
}
}

此时的 UserService userService 是注册中心中找到

MainApplication.java
public class MainApplication {
public static void main(String[] args) {
ClassPathXmlApplicationContext app = new
ClassPathXmlApplicationContext("consumer.xml"); OrderService service = app.getBean(OrderService.class); service.initOrder(""); System.out.println("调用结束...");
try {
System.in.read();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

此时运行得到的结果如下:

com.alibaba.dubbo.common.bytecode.proxy0@1c39680d
用户id:
安徽合肥包河区
安徽合肥蜀山区
调用结束...

4、Dubbo-工程实践的更多相关文章

  1. 分布式学习系列【dubbo入门实践】

    分布式学习系列[dubbo入门实践] dubbo架构 组成部分:provider,consumer,registry,monitor: provider,consumer注册,订阅类似于消息队列的注册 ...

  2. panguan(判官):一个自研的任务执行引擎的工程实践

    来某厂接近半年了,几乎没写过C++代码,说实话还真的有点手生.最近刚好有一个需求,然而我感觉我也没有办法用C++以外的语言去实现它.于是还是花了几天时间用C++完成编码,这是一个简单的任务执行引擎,它 ...

  3. 公司简介 - CCDI悉地国际-工程实践专业服务的引领者

    公司简介 - CCDI悉地国际-工程实践专业服务的引领者 关于悉地国际         CCDI悉地国际(以下简称"CCDI")创立于1994年,是在城市建设和开发领域从事综合专业 ...

  4. 离github在导入dubbo工程

    dubbo移动到github目前已经有一些时间,我们可能根本不习惯使用github.因此,我们仍然使用以前的版本号. 由于某些原因.阿里下载前关闭.在这里给大家提供一个私有地址: 链接:http:// ...

  5. Linux开源模块迁移概述暨交叉编译跨平台移植总结--从《嵌入式Linux驱动模板简洁和工程实践》

    本文摘录<嵌入式Linux驱动模板简洁和工程实践>一本书"开发和调试技术". Linux强大的是,有那么多的开源项目可以使用.通常非常需要可以通过寻找相关的源模块被定义 ...

  6. LDA工程实践之算法篇之(一)算法实现正确性验证(转)

    研究生二年级实习(2010年5月)开始,一直跟着王益(yiwang)和靳志辉(rickjin)学习LDA,包括对算法的理解.并行化和应用等等.毕业后进入了腾讯公司,也一直在从事相关工作,后边还在yiw ...

  7. 工程实践:给函数取一个"好"的名字

    工程实践:给函数取一个"好"的名字 早在2013年,国外有个程序员做了一个有意思的投票统计(原始链接请见:<程序员:你认为最难做的事情是什么?>),该投票是让程序员从以 ...

  8. webpack 从入门到工程实践

    from:https://www.jianshu.com/p/9349c30a6b3e?utm_campaign=maleskine&utm_content=note&utm_medi ...

  9. C++工程实践 一个开始

    打算把C++工程过程中的一些总结写下来.从打算写这个内容到今天(2017/1/12)已经很多年了,但是一直没有想好如何写,反正就这样,有什么写什么吧. C++工程实践之所以难产,主要原因有几个 内容比 ...

  10. Go 在游戏行业中的工程实践

    在今年 1 月由七牛云主办的 ECUG Con 十周年盛会上,真有趣技术总监陈明达带来了题为< Go 在游戏行业中的工程实践>的精彩分享,深入讲解了 Go 的工程经验,错误和异常处理,in ...

随机推荐

  1. Java中名词的解释

    在上一篇中说到了Java的四大特性,里面出现了很多名次,包括以后学习Java中也会出现很多常用到的名次,对初学者来说可能不知道是什么意思,或者是对这些刺耳的理解不是特别透彻,这里我就我自己的理解来解释 ...

  2. 时间复杂度为O(logN)的常用算法

    时间复杂度为O(logN)的常用算法 折半查找 /* * 折半查找 * 默认查找的数组已经排过序 */ public static int binarySearch(int[] a,int x){ i ...

  3. log4j2配置文件

    项目里面经常用到日志,Java开发一般用log4j.slf4j这些框架,看着配置文件有点懵.这几天看公司代码的时候,也有用到log4j,感觉要复杂一点.在本地打log,也有打到hive里面存的.看了一 ...

  4. Fill Table Row(it’s an IQ test question)

    Here is a table include the 2 rows. And the cells in the first row have been filled with 0~4. Now yo ...

  5. python学习之老男孩python全栈第九期_day019知识点总结——collections模块、时间模块、random模块、os模块、sys模块

    一. collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:namedtuple.deque.Counte ...

  6. 有关动态规划(主要是数位DP)的一点讨论

    动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法.20世纪50年代初美国数学家在研究多阶段决策过程的优化问题时, ...

  7. Shellinabox安装及使用教程

    本文转载自: shellinabox:一款使用 AJAX 的基于 Web 的终端模拟器 一.shellinabox简介 通常情况下,我们在访问任何远程服务器时,会使用常见的通信工具如OpenSSH和P ...

  8. SpringBoot 整合 Mybatis + Mysql——XML配置方式

    一.介绍 SpringBoot有两种方法与数据库建立连接,一种是集成Mybatis,另一种用JdbcTemplate,本文主要讨论集成Mybatis方式. SpringBoot整合Mybatis也有两 ...

  9. Ubuntu 批量修改图片大小

    现在的相机拍摄出来的照片通常远远大于电脑屏幕,不但尺寸很大,占用磁盘量也很大,我都是拍完照片立马就将其缩小到差不多HD的分辨率 改图片分辨率的软件有很多,除了耳熟能详的PS,Ubuntu下也有开源gi ...

  10. 【JavaScript】闭包应用之数据缓存

    最近的开发中的许多事件会被频繁的触发,由于没有做缓存的处理,每次事件触发都会后台调用一样的数据.这几天我突然意识到自己的代码有很大的优化空间,继而想起了闭包可以有缓存的功能,于是乎便对其进行了深入的研 ...