在本篇文章中我们将通过集体的示例来对Dubbo的提供和消费进行代码层面的认识.这里所介绍的是基本的提供者和消费者通过Spring容器来进行相关的提供和消费的服务.首先看整个示例的项目结构如下:
我们通过Maven的方式来进行示例,其中dubbo-demo-api为提供者所定义的接口,项目结构如下:
此项目里的内容很简单,为服务的一个接口DemoService:
/dubbo-demo/dubbo-demo-api/src/main/java/org/pactera/dubbo/DemoService.java
packageorg.pactera.dubbo;
/**
*
* @author Qing
*
*/
publicinterface DemoService {
public String sayHello(String str);
}
Dubbo-demo-provider为服务提供者的示例项目,结构如下图:
Dubbo-demo-consumer为服务消费者的示例项目,结构如下图:
以上是整个示例程序的整体框架.
接下来我们将从提供者的项目入手开始.在提供者的项目里先要对相关提供的服务进行配置.
1 在Dubbo-demo-provider的项目里我们需要用到Dubbo,Zookeeper,以及dubbo-demo-api的相关java包,因此需要在pom.xml对其进行引用,如下:
2 接下来为了能够让Dubbo的提供者通过Spring方式加载,我们需要对其进行相关配置,如下文件内容.
/dubbo-demo/dubbo-demo-provider/src/main/resources/dubbo-demo-provider.xml
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd "> 3 需要将dubbo提供的服务接口进行实现. /dubbo-demo/dubbo-demo-provider/src/main/java/org/pactera/dubbo/provider/DemoServiceImpl.java packageorg.pactera.dubbo.provider; importcom.alibaba.dubbo.rpc.RpcContext; importlombok.extern.slf4j.Slf4j; importorg.pactera.dubbo.DemoService; @Slf4j publicclass DemoServiceImpl implements DemoService { public String sayHello(String str) { System.out.println("reqInfo: "+ str + ", request form consumer: " +RpcContext.getContext().getRemoteHost()); return "Hello " + str; } } 4 接下来我们需要再写一个提供者启动服务的程序,主要是用来启动Spring容器,并注入相关的服务,同时将提供者的内容注册到Zookeeper中. 启动程序如下: /dubbo-demo/dubbo-demo-provider/src/main/java/org/pactera/dubbo/Bootstrap.java packageorg.pactera.dubbo; importcom.google.common.util.concurrent.AbstractIdleService; importlombok.extern.slf4j.Slf4j; importorg.springframework.context.support.ClassPathXmlApplicationContext; @Slf4j publicclass Bootstrap extends AbstractIdleService { private ClassPathXmlApplicationContextcontext; public static void main(String[] args) { Bootstrap bootstrap = new Bootstrap(); bootstrap.startAsync(); try { Object lock = new Object(); synchronized (lock) { while (true) { lock.wait(); } } } catch (InterruptedException ex) { System.err.println("ignoreinterruption"); } } /** * Start the service. */ @Override protected void startUp() throws Exception { context = newClassPathXmlApplicationContext("dubbo-demo-provider.xml"); context.start(); context.registerShutdownHook(); System.out.println("----------------provider service startedsuccessfully------------"); } /** * Stop the service. */ @Override protected void shutDown() throws Exception{ context.stop(); System.out.println("-------------service stoppedsuccessfully-------------"); } } 5 提供者服务启动日志: 至此,服务者Provider的示例基本上已经结束,如果读者配置监控中心的话,可以打开监控中心搜索demoService,你便可以在监控中心看到此提供者服务的具体信息.限于篇幅的原因,关于消费者的相关示例将在接下来的文章进行阐述.