前言:
Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。从服务模型的角度来看,Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色。
应用:
这里只介绍dubbo的入门案例。工程为eclipse创建的maven工程
maven依赖
好吧,还在使用maven,请原谅我有点low...
由于本demo基于spring来实现,因此需要spring的基础包。注册中心使用
zookeeper
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.9</version>
</dependency>
zookeeper安装
下载
请在这里
下载zookeeper安装包,版本3.4.9
解压,修改配置文件
zookeeper_path/conf目录下,将默认的zoo_sample.cfg文件拷贝一份到当前目录,重命名为zoo.cfg
由于是纯demo,所以配置文件内容不用修改...
启动
windows下启动:直接运行zookeeper_path/bin目录下的zkServer.cmd
linux下启动:zkServer.sh
点击启动以后的命令行窗口不要关,关闭了zookeeper也关了...
应用程序
服务提供方-接口
package com.noryar.demo.dubbo;
/**
* dubbo服务接口.
* @author Leon Lee.
*/
public interface DemoService {
/**
* 服务方法.
* @param name 参数
* @return 返回值
*/
String sayHello(String name);
}
服务提供方-实现
package com.noryar.demo.dubbo;
/**
* dubbo服务实现.
* @author Leon Lee
*/
public class DemoServiceImpl implements DemoService {
public String sayHello(String name) {
return "dubbo server say : Hello " + name;
}
}
服务提供方-配置(provider.xml)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="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:application name="hello-world-app" />
<!-- 使用zookeeper注册中心暴露服务地址 -->
<dubbo:registry address="zookeeper://192.168.20.185:2181" />
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="com.noryar.demo.dubbo.DemoService" ref="demoService" />
<!-- 和本地bean一样实现服务 -->
<bean id="demoService" class="com.noryar.demo.dubbo.DemoServcieImpl<span style="font-family: Arial, Helvetica, sans-serif;">" /></span>
</beans>
服务提供方-启动(main)
package com.noryar.demo.dubbo;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Provider {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
new String[] { "classpath:provider.xml" });
context.start();
System.in.read(); // 线程阻塞,防止启动完毕以后窗口关闭
}
}
服务消费方-配置(consumer.xml)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="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:application name="consumer-of-helloworld-app" />
<!-- 使用zookeeper注册中心暴露服务地址 -->
<dubbo:registry address="zookeeper://192.168.20.185:2181" />
<!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
<dubbo:reference id="demoService" interface="com.noryar.demo.dubbo.DemoService" />
</beans>
服务消费方-启动(main)
package com.noryar.demo.dubbo;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Consumer {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
new String[] { "classpath:consumer.xml" });
context.start();
DemoService demoService = (DemoService) context.getBean("demoService");
String hello = demoService.sayHello("world");
System.out.println(hello);
System.in.read(); // 线程阻塞,防止窗口自动关闭
}
}
最后,log4j.properties
由于dubbo依赖于log4j,因此这个jar包就不用另外引入了
log4j.rootLogger=info, File, stdout
log4j.appender.File=org.apache.log4j.DailyRollingFileAppender
log4j.appender.File.DatePattern='.'yyyy-MM-dd
log4j.appender.File.File=logs/notify-subscription.log
log4j.appender.File.layout=org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern=%d - %m%n
log4j.appender.File.Append=true
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss} %p [%c] %m%n
PS:启动的时候,先启动服务提供方,再启动服务消费方