当前位置: > 其它学习 > Dubbo >

Dubbo创建提供者&消费者工程

时间:2019-02-22 04:16来源:linux.it.net.cn 作者:IT

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. 调用结果

控制台查看

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




(责任编辑:IT)
------分隔线----------------------------