标签:
在本篇文章中我们将通过集体的示例来对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对其进行引用,如下:
<dependencies>
<dependency>
<groupId>org.pactera.dubbo</groupId>
<artifactId>dubbo-demo-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.4.10</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.3</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
2 接下来为了能够让Dubbo的提供者通过Spring方式加载,我们需要对其进行相关配置,如下文件内容.
/dubbo-demo/dubbo-demo-provider/src/main/resources/dubbo-demo-provider.xml
<?xmlversion="1.0" encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
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
">
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:applicationname="hello-world-app" />
<!-- 使用zookeeper广播注册中心暴露服务地址 -->
<dubbo:registryprotocol="zookeeper" address="127.0.0.1:2181" />
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo"port="20881" />
<dubbo:monitorprotocol="registry"></dubbo:monitor>
<!-- 声明需要暴露的服务接口 -->
<dubbo:serviceinterface="org.pactera.dubbo.DemoService" ref="demoService"/>
<!-- 和本地bean一样实现服务 -->
<bean id="demoService"class="org.pactera.dubbo.provider.DemoServiceImpl" />
</beans>
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,你便可以在监控中心看到此提供者服务的具体信息.限于篇幅的原因,关于消费者的相关示例将在接下来的文章进行阐述.
标签:
原文地址:http://blog.csdn.net/jnqqls/article/details/44762501