前言:
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.cmdlinux下啓動: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:啓動的時候,先啓動服務提供方,再啓動服務消費方