在正式学习之前,我们先看看项目在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>