Dubbo入门实例注解版

本文将使用注解的方式编写Dubbo的入门实例。

在正式学习之前,我们先看看项目在IDEA环境下面的项目结构图,如下:

Dubbo入门实例注解版

本项目采用maven进行编译和依赖管理。dubbo-api 提供服务接口,供 dubbo-provider 和 dubbo-consumer 模块依赖。dubbo-provider 实现 dubbo-api中接口,而 dubbo-consumer 是服务客户端实现。

dubbo-provider

该模块实现了 dubbo-api 中的服务接口。然后将实现的服务暴露出去,供客户端消费。如下图:

Dubbo入门实例注解版

HelloServiceImpl.java 代码

package com.huangx.dubbo.provider;

import com.alibaba.dubbo.config.annotation.Service;
import com.huangx.dubbo.hello.HelloService;
import com.alibaba.dubbo.rpc.RpcContext;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 服务实现
 */
@Service(version = "1.0.0")
public class HelloServiceImpl implements HelloService {

   public String sayHello(String name) {
      SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
      System.out.println("[" + sdf.format(new Date()) + "] Hello " + name
            + ", request from consumer: "
            + RpcContext.getContext().getRemoteAddress());

      return "Hello " + name + ", response from provider: "
            + RpcContext.getContext().getLocalAddress();
   }
}

上面代码使用 @Service 注解将这个服务实现暴露出去供客户端调用(注意 @Service 主机位于com.alibaba.dubbo.config.annotation.Service包)。

Provider.java 代码

package com.huangx.dubbo.provider;

import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 加载 Spring 的配置文件,启动 Dubbo 服务提供者
 */
public class Provider {

   public static void main(String[] args) throws Exception {
      ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
            new String[] {"dubbo-provider.xml"});
      context.start();

      // 按任意键退出
      System.in.read();
      context.close();
   }
}

dubbo-provider.xml 配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
      xmlns:dubbo="https://code.alibabatech.com/schema/dubbo"
      xmlns="https://www.springframework.org/schema/beans"
      xsi:schemaLocation="https://www.springframework.org/schema/beans
         https://www.springframework.org/schema/beans/spring-beans-4.3.xsd
         https://code.alibabatech.com/schema/dubbo
         https://code.alibabatech.com/schema/dubbo/dubbo.xsd">

   <!-- 提供应用名称,用于计算依赖关系 -->
   <dubbo:application name="demo-provider"/>

   <!-- 使用多播注册中心导出服务 -->
   <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" />

   <!-- 扫描注解包路径,多个包用逗号分隔,不填pacakge表示扫描当前ApplicationContext中所有的类 -->
   <dubbo:annotation package="com.huangx.dubbo.provider" />

</beans>

上面配置文件使用 dubbo:annotation 配置扫描那些包下面的文件(带有 @Service)

dubbo-consumer

Dubbo入门实例注解版

HelloAction.java

package com.huangx.dubbo.consumer;

import com.alibaba.dubbo.config.annotation.Reference;
import com.huangx.dubbo.hello.HelloService;
import org.springframework.stereotype.Component;

@Component
public class HelloAction {

    /**
     * 通过注解的方式引入远程服务(创建一个远程服务的代理对象)
     */
    @Reference(version = "1.0.0")
    private HelloService helloService;


    public void invoke() {
        while (true) {
            try {
                Thread.sleep(1000);
                // 调用远程方法
                String hello = helloService.sayHello("word");
                System.out.println(hello);
            } catch (Throwable throwable) {
                throwable.printStackTrace();
            }
        }
    }

}

上面代码通过 @Reference 引用类型为 HelloService 的Dubbo远程服务,然后生成一个代理对象。

Consumer.java

package com.huangx.dubbo.consumer;

import org.springframework.context.support.ClassPathXmlApplicationContext;


/**
 * 加载 Spring 配置,启动 Dubbo 服务消费者
 */
public class Consumer {

   public static void main(String[] args) {
      System.setProperty("java.net.preferIPv4Stack", "true");
      ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
            new String[] {"dubbo-consumer.xml"});
      context.start();

      // 消费
      HelloAction helloAction = context.getBean(HelloAction.class);
      helloAction.invoke();
   }

}

dubbo-comsumer.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
      xmlns:dubbo="https://code.alibabatech.com/schema/dubbo"
      xmlns="https://www.springframework.org/schema/beans"
      xsi:schemaLocation="https://www.springframework.org/schema/beans
         https://www.springframework.org/schema/beans/spring-beans-4.3.xsd
         https://code.alibabatech.com/schema/dubbo
         https://code.alibabatech.com/schema/dubbo/dubbo.xsd">

   <!-- 使用者的应用程序名称,用于计算应用间的依赖关系(不是匹配标准),
      不要设置与提供者相同的设置 -->
   <dubbo:application name="demo-consumer"/>

   <!-- 使用多播注册中心发现服务 -->
   <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" />

   <!-- 扫描注解包路径,多个包用逗号分隔,不填pacakge表示扫描当前ApplicationContext中所有的类 -->
   <dubbo:annotation package="com.huangx.dubbo.consumer" />

</beans>

「资源下载」

不傲才以骄人,不以宠而作威。——诸葛亮
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号