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

本项目采用maven进行编译和依赖管理。dubbo-api 提供服务接口,供 dubbo-provider 和 dubbo-consumer 模块依赖。dubbo-provider 实现 dubbo-api中接口,而 dubbo-consumer 是服务客户端实现。
该模块实现了 dubbo-api 中的服务接口。然后将实现的服务暴露出去,供客户端消费。如下图:

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)

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>