RPC框架之-DUBBO(一)入門

前言:

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




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章