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:启动的时候,先启动服务提供方,再启动服务消费方




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