4、Dubbo-工程实践

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(1, "安徽合肥蜀山区", "2", "程老师", "", "12345");
           UserAddress address2 = new UserAddress(2, "安徽合肥包河区", "2", "程老师", "", "12345");
           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.2</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.0</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">
              
     
     <!-- 1、指定当前服务/应用的名字(同样的服务名字,不要和别的服务同名 -->
     <dubbo:application  name="user-service-provider"></dubbo:application>         
            
     <!-- 2、指定注册中心的位置 -->    
     <!-- 两种写法 -->
     <!-- dubbo:registry protocol="zookeeper"  address="10.20.153.10:2181" -->   
     <dubbo:registry address="zookeeper://127.0.0.1:2181" />    
            
     <!-- 3、指定通信规则(通信协议&通信端口 -->     
     
     <dubbo:protocol name="dubbo" port="20080"></dubbo:protocol>       
     
     
     <!-- 4、暴露服务 -->   
     <!-- 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>
     <!-- 1、指定当前服务/应用的名字(同样的服务名字,不要和别的服务同名 -->
     <dubbo:application  name="user-order-consumer"></dubbo:application>         
            
     <!-- 2、指定注册中心的位置 -->    
     <dubbo:registry address="zookeeper://127.0.0.1:2181" />    
            
     <!-- 3、声明 需要调用的远程服务接口:生成远程服务代理-->
     <!-- 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("2");
     
           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:2
安徽合肥包河区
安徽合肥蜀山区
调用结束...

 

 

 

 

 

posted @ 2019-03-04 21:39  MrChengs  阅读(258)  评论(0编辑  收藏  举报