Java小强个人技术博客站点    手机版
当前位置: 首页 >> 开源 >> Dubbo入门学习之HelloWorld,附代码

Dubbo入门学习之HelloWorld,附代码

120971 开源 | 2016-2-22

需要什么?

Zookeeper,如果在Linux上安装就参考(http://www.javacui.com/opensource/445.html  )。

如果在Windows上,新版本可以直接在Windows运行,只需修改zoo.cfg配置文件即可。


如何设计

之所以用Dubbo,就是为了应付团队模块开发,所以这里会有两个工程,服务和使用。

服务者要提供接口API,和API的具体实现,然后基于类似Spring配置进行Bubbo服务的注册。

使用者拿到API,并实用类似Spring配置相应的对象的引用,然后在代码中可以像平常一个工程中一样使用该即可。

那么这个和一个工程里面的Spring配置有什么区别?在我看来无非就是参数或者返回类型的兼容性,例如本地Spring你可以直接传递某个对象而且不受限制,但是默认情况下Dubbo只能实用其兼容的JDK对象。

官方文档地址:http://dubbo.io/Home-zh.htm 


要引用那些Lib

这里我也实用Maven来配置吧,这年头难以再继续往Lib里面加Jar包了。

这里我给出我的示例工程dependency,我这里就是把该有的包引用过来了,其他还包含了MyBatis,数据库连接池,FastJson等。

<dependencies>
	<dependency>
		<groupId>org.apache.zookeeper</groupId>
		<artifactId>zookeeper</artifactId>
		<version>3.4.5</version>
		<exclusions>
               <exclusion>
                   <groupId>log4j</groupId>
                   <artifactId>log4j</artifactId>
               </exclusion>
           </exclusions>
	</dependency>
	<dependency>
		<groupId>com.alibaba</groupId>
		<artifactId>dubbo</artifactId>
		<version>2.4.9</version>
	</dependency>
	<dependency>
		<groupId>com.github.sgroschupf</groupId>
		<artifactId>zkclient</artifactId>
		<version>0.1</version>
	</dependency>
	<dependency>
		<groupId>log4j</groupId>
		<artifactId>log4j</artifactId>
		<version>1.2.17</version>
	</dependency>
	<dependency>
		<groupId>org.mybatis</groupId>
		<artifactId>mybatis-spring</artifactId>
		<version>1.2.2</version>
	</dependency>
	<dependency>
		<groupId>org.mybatis</groupId>
		<artifactId>mybatis</artifactId>
		<version>3.2.6</version>
	</dependency>
	<dependency>
		<groupId>org.mybatis.caches</groupId>
		<artifactId>mybatis-memcached</artifactId>
		<version>1.0.0</version>
	</dependency>
	<dependency>
		<groupId>c3p0</groupId>
		<artifactId>c3p0</artifactId>
		<version>0.9.1.2</version>
	</dependency>
	<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
		<version>5.1.26</version>
	</dependency>
	<dependency>
		<groupId>org.apache.commons</groupId>
		<artifactId>commons-lang3</artifactId>
		<version>3.0</version>
	</dependency>
	<dependency>
		<groupId>commons-collections</groupId>
		<artifactId>commons-collections</artifactId>
		<version>3.2.1</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-aspects</artifactId>
		<version>3.2.8.RELEASE</version>
	</dependency>
	<dependency>
		<groupId>com.alibaba</groupId>
		<artifactId>fastjson</artifactId>
		<version>1.2.5</version>
	</dependency>
</dependencies>

其他配置请自便,或者根据需要自行修改,总之别少包或者冲突就得。


有哪些配置文件

然后我们还要log4j.properties配置文件,这里就配置只输出到控制台了。

log4j.rootLogger=INFO,stdout
log4j.logger.com.test=DEBUG
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d [%-15.15t] %-5p %c{1} - %m%n

dubbo的配置文件dubbo.properties

dubbo.spring.config=classpath*:spring-config.xml
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.application.name=comTest
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
dubbo.protocol.accesslog=/data/logs/test/access.log
dubbo.monitor.protocol=registry
dubbo.provider.timeout=6000
dubbo.provider.delay=-1
dubbo.provider.retries=0

spring-config.xml是Spring主配置文件

<?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:tx="http://www.springframework.org/schema/tx"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans   
    http://www.springframework.org/schema/beans/spring-beans.xsd   
    http://www.springframework.org/schema/tx   
    http://www.springframework.org/schema/tx/spring-tx.xsd  
    http://www.springframework.org/schema/context  
    http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 自动扫描的包名 -->
    <context:component-scan base-package="com.test"></context:component-scan>
	<context:annotation-config></context:annotation-config>
	<import resource="classpath*:spring/spring-*.xml" />
</beans>

spring-provide.xml在spring文件夹下,用来注册服务提供者,而使用者则用来注册相应的对象。

<?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:service interface="com.test.DubboApi" ref="dubboApi"/>
    <!-- 和本地bean一样实现服务 -->
    <bean id="dubboApi" class="com.test.DubboService" />
</beans>

如果是使用者

<?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:reference id="testApiDubbo" interface="com.test.DubboApi"/>
</beans>


需要写那些代码

如果是提供者,要提供API

package com.test;
import java.util.Map;
public interface DubboApi {
	public Map<String, Object> sayHello(Map<String, Object> para);
}

API实现

package com.test;
import java.util.HashMap;
import java.util.Map;
import com.alibaba.fastjson.JSON;
public class DubboService implements DubboApi{
	@Override
	public Map<String, Object> sayHello(Map<String, Object> para) {
		System.out.println(JSON.toJSONString(para, false));
		Map<String, Object> re = new HashMap<String, Object>();
		re.put("reA", "reA");
		re.put("reB", "reB");
		return re;
	}
}

如果测试实用

服务提供者如要写一个测试方法,把自己的服务注册上去提供服务,同时把API的Jar给使用者

package com.test.service;
import java.io.IOException;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ServerMain {
	@SuppressWarnings("unused")
	public static void main(String[] args) throws IOException, InterruptedException, Exception {
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "spring-config.xml" });
		System.in.read(); // 防止系统退出
	}
}

注册提供服务,启动Spring即可。

使用者,注册该对象,然后实用即可,同样也是启动Spring容器,用测试代码来实现。

package com.test.api;
import java.util.HashMap;
import java.util.Map;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.alibaba.fastjson.JSON;
import com.test.DubboApi;
public class DubboServiceTest {
	public static void main(String[] args) throws Exception {
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "spring-config.xml" });
		DubboApi dubboApi = (DubboApi) context.getBean("testApiDubbo");
		new DubboServiceTest().sayHello(dubboApi);
	}
	public void sayHello(DubboApi dubboApi) throws Exception {
		Map<String, Object> param = new HashMap<String, Object>();
		param.put("paraA", "paraA");
		Map<String, Object> resultMap = dubboApi.sayHello(param);
		System.out.println(JSON.toJSONString(resultMap, true));
	}
}


服务提供者代码目录结构

Dubbo入门学习之HelloWorld

服务使用者代码目录结构

Dubbo入门学习之HelloWorld


代码下载:

test1.zip

test2.zip


结束。

推荐您阅读更多有关于“ 入门 maven Dubbo ”的文章

上一篇:springboot 开发入门 下一篇:zookeeper安装单机模式

猜你喜欢

发表评论:

评论:

回复 java小强 评论于 2016-02-22 17:36
工程示例代码下载在最下面。dubbo.properties配置中,dubbo.protocol.port这个端口每个工程比如不一样,否则报端口冲突。