注:本笔记接dubbo入门学习笔记之环境准备继续记录;(另外麻烦管理员秒删我的博客请注明原因以便我下次注意,我发邮件给你们直接被你们忽视了)

  (四)开发服务提供者和消费者并让他们在启动时分别向注册中心注册和订阅服务

  需求:订单服务中初始化订单功能需要调用用户服务的获取用户信息的接口(订单服务与用户服务分别部署在不同的服务器)

  思路:1、基于官网的dubbo服务化最佳实践,我们开发一个入门级demo可以先开发一个公共的接口层,然后服务提供者和服务消费者分别引用该接口的依赖

     2、本例中我们需要新建一个公共接口层的maven项目pub-interfence,定义查询用户信息的接口和初始化订单的接口

       3、新建服务提供者和消费者的项目分别引入pub-interfence依赖并实现对应接口

       4、进行整合dubbo的相关配置,测试服务提供者和消费者是否成功向注册中心注册和订阅

  (1)新建公共接口层的maven项目pub-interfence,定义查询用户信息的接口和初始化订单的接口,关键代码如下:

/**
 * 订单服务相关接口
 */
public interface OrderService {
    
    /**
     * 初始化订单
     * @param userId
     */
    List<User> initOrder(String userId);

}
/**
 *   @author 董琳琳
 *   @date 2018/9/14 11:38
 *   @description   用户服务相关接口
 */
public interface UserService {

    /**
     * 获取用户信息
     * @param userId
     * @return
     */
    List<User> getUserList(String userId);
}

  (2)新建服务提供者user-service-provider引入pub-interfence并向注册中心注册,关键代码如下:

  pom.xml:  

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.darling.dubboDemo</groupId>
    <artifactId>user-service-provider</artifactId>
    <version>1.0-SNAPSHOT</version>


    <dependencies>
        <!-- 引入公共接口层的依赖 -->
        <dependency>
            <groupId>com.darling.dubboDemo</groupId>
            <artifactId>pub-interfence</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <!-- 引入dubbo -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.6.2</version>
        </dependency>
        <!-- 注册中心使用的是zookeeper,引入操作zookeeper的客户端端 -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>2.12.0</version>
        </dependency>

    </dependencies>

</project>
  UserServiceImpl:
/**
 *   @author 董琳琳
 *   @date 2018/9/28 10:24
 *   @description   用户服务的实现类 这里用来向订单服务提供相关服务
 */
public class UserServiceImpl implements UserService {

    /**
     * 查询用户信息(这里为订单服务的初始化订单接口提供服务)
     * @param userId
     * @return
     */
    @Override
    public List<User> getUserAddressList(String userId) {
        List<User> list = new ArrayList();
        list.add(new User(3,"韦德","男",36,"迈阿密"));
        list.add(new User(23,"詹姆斯","男",34,"洛杉矶"));
        list.add(new User(24,"科比","男",39,"洛杉矶"));
        return list;
    }
}

   在项目的resource目录下新建provider.xml整合dubbo:

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xmlns="http://www.springframework.org/schema/beans"
       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">

    <!-- 当前服务的名称 -->
    <dubbo:application name="user-service-provider"/>

    <!-- 注册中心的地址 这里注册中心用的是zookeeper -->
    <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"/>

    <!-- 指定通信规则(通信协议?通信端口) -->
    <dubbo:protocol name="dubbo" port="20883"></dubbo:protocol>

    <!-- 需要暴露的服务 -->
    <dubbo:service interface="com.darling.pubIn.service.UserService" ref="userService" version="1.0.0"/>

    <!-- 需要暴露的服务的实现类 -->
    <bean id="userService" class="com.darling.user.service.UserServiceImpl"/>

    <!-- 监控中心协议,如果为protocol="registry",表示从注册中心发现监控中心地址,否则直连监控中心 -->
    <dubbo:monitor protocol="registry"></dubbo:monitor>
    
    <!--
        timeout:超时时间配置
        retries:重试次数配置(超时报错后重试连接的次数,不含第一次调用,如果目标服务有多个重试的时候会自动切换别的服务)
     -->
    <dubbo:provider timeout="2000" retries="6"></dubbo:provider>
</beans>

  至此一个简单的服务提供者算是搭建完毕了,下面通过spring来加载 配置文件,测试是否成功向注册中心注册了,测试代码如下:

/**
 *   @author 董琳琳
 *   @date 2018/9/14 14:51
 *   @description  测试服务提供者(用户服务)向注册中心注册是否成功
 */
public class TestProviderDemo {

    public static void main(String[] args) throws IOException {
        // 加载配置文件
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("provider.xml");
        // 容器启动
        applicationContext.start();
        // 使程序阻塞(由于是单元测试,如果程序跑完了我们再dubbo控制台看不到效果)
        System.in.read();
    }
}

   如果一切顺利的话,打开dubbo-admin的首页点击服务治理==>应用将会看到:

  (3)新建服务消费者order-service-consumer引入pub-interfence并向注册中心订阅服务,关键代码如下:

  pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.darling</groupId>
    <artifactId>order-service-consumer</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!-- 引入公共接口层的依赖 -->
        <dependency>
            <groupId>com.darling.dubboDemo</groupId>
            <artifactId>pub-interfence</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!-- 引入dubbo -->
        <!-- https://mvnrepository.com/artifact/com.alibaba/dubbo -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.6.2</version>
        </dependency>
        <!-- 注册中心使用的是zookeeper,引入操作zookeeper的客户端端 -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>2.12.0</version>
        </dependency>
    </dependencies>
</project>

   OrderServiceImpl:

/**
 *   @author 董琳琳
 *   @date 2018/9/14 11:50
 *   @description   订单服务的实现类
 */
@Service
public class OrderServiceImpl implements OrderService {

    @Autowired
    UserService userService;

    /**
     * 初始化订单并调用用户服务的接口
     * @param userId
     * @return
     */
    @Override
    public List<User> initOrder(String userId) {
        return userService.getUserAddressList(userId);
    }
}

    在项目的resource目录下新建consumer.xml整合dubbo:

<?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.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">
    <!-- 开启springmvc的包扫描 -->
    <context:component-scan base-package="com.darling.order"></context:component-scan>
    <!-- 当前服务的名称 -->
    <dubbo:application name="order-service-consumer"/>

    <!-- 注册中心的地址 这里注册中心用的是zookeeper -->
    <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"/>

    <!-- 声明需要调用的远程服务的接口;生成远程服务代理 -->
    <dubbo:reference id="userService" check="false" interface="com.darling.pubIn.service.UserService" version="*"/>

    <!-- 监控中心协议,如果为protocol="registry",表示从注册中心发现监控中心地址,否则直连监控中心 -->
    <dubbo:monitor protocol="registry"></dubbo:monitor>
</beans>

   这样,一个简单的消费者也基本搭建完毕,接下来就是测试了,测试代码如下:

/**
 *   @author 董琳琳
 *   @date 2018/9/14 15:57
 *   @description 测试服务调用者是否成功从注册中心订阅服务
 */
public class TestConsumerDemo {
    public static void main(String[] args) throws IOException {
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("consumer.xml");
        OrderService service = applicationContext.getBean(OrderService.class);
        List<User> list = service.initOrder("1");
        for (User user:list) {
            System.out.println(user.toString());
        }
        System.in.read();
    }
}

   调用成功后控制台会打印UserServiceImpl中返回的用户信息,打开dubbo-admin首页点击服务治理==>应用,内容如下:

  至此,一个简单的通过dubbo进行服务间的调用的demo就全部搭建并测试完毕了,需要注意的是此demo中为了方便并没有连接数据库,数据都是写死的,后续会继续记录如何使用dubbo官网上的一些常用配置以及如何整合dubbo和springboot;