Dubbo的学习与总结(二)- -使用Dubbo
2016-03-28 15:42
134 查看
在上一篇中,我们对Dubbo有了一个大概的认识,现在我们来说如何使用。Dubbo的服务发现和使用是基于注册中心的,推荐使用zookeeper作为注册中心,注册中心的安装参考:http://blog.csdn.net/lf_214/article/details/50998910 Dubbo是一个面向服务的治理方案,那首先我们要有服务,还要定义出服务之间的规范,说到规范,我们就想到了Java中的接口,接口就是我们提供的规范。不论是服务调用方还是服务使用方,都要依照这个规范来使用。所以,规范应该是独立的。我们以用户服务为例,采用Maven来构建一个项目。
1.项目结构:
d-parent d-facade d-provider d-client
2.父pom.xml文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.ums</groupId> <artifactId>d-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <name>d-parent</name> <url>http://maven.apache.org</url> <modules> <module>../d-client</module> <module>../d-facade</module> <module>../d-provider</module> </modules> <properties> <!-- jar包版本 --> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <jdk.version>1.6</jdk.version> </properties> <dependencyManagement> <dependencies> <!-- spring依赖包 --> <!-- 支持springaop --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>3.2.8.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>3.2.8.RELEASE</version> </dependency> <!-- 日志依赖包 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.10</version> </dependency> <!-- logback start --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.1.2</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.1.2</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>1.7.10</version> </dependency> <!-- logback end --> <!-- dubbo start --> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.3</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring</artifactId> </exclusion> </exclusions> </dependency> <!-- dubbo end --> <!-- dubbo 支持Zookeeper 用于分布式服务管理 --> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.6</version> </dependency> <!-- dubbo 支持Zookeeper end --> <!-- dubbo 内置服务 --> <dependency> <groupId>org.jboss.netty</groupId> <artifactId>netty</artifactId> <version>3.2.5.Final</version> </dependency> <!-- dubbo 内置服务 --> <!-- 单元测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> </dependencyManagement> <build> <finalName>${project.artifactId}</finalName> <resources> <resource> <targetPath>${project.build.directory}/classes</targetPath> <directory>src/main/resources</directory> <filtering>true</filtering> <includes> <include>**/*.xml</include> <include>**/*.properties</include> </includes> </resource> </resources> <testResources> <testResource> <directory>src/test/resources</directory> <filtering>true</filtering> </testResource> </testResources> <plugins> <!-- 资源文件拷贝插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>2.7</version> <configuration> <encoding>${project.build.sourceEncoding}</encoding> </configuration> </plugin> <!-- java编译插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>${jdk.version}</source> <target>${jdk.version}</target> <encoding>${project.build.sourceEncoding}</encoding> </configuration> </plugin> </plugins> <pluginManagement> <plugins> <!-- 配置Tomcat插件 --> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> </plugin> </plugins> </pluginManagement> </build> </project>
3.定义规范d-facade
package com.ums.facade; import com.ums.dto.UserRequest; import com.ums.dto.UserResponse; public interface IUserQueryFacade { public UserResponse queryUser(UserRequest userRequest); public UserResponse queryAllUser(); } package com.ums.dto; import java.io.Serializable; public class UserRequest implements Serializable{ /** * @Fields serialVersionUID : TODO(用一句话描述这个变量表示什么) */ private static final long serialVersionUID = -8315084174735728065L; private String userId; public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } @Override public String toString() { return "UserRequest [userId=" + userId + "]"; } } package com.ums.dto; import java.io.Serializable; public class UserResponse implements Serializable{ /** * @Fields serialVersionUID : TODO(用一句话描述这个变量表示什么) */ private static final long serialVersionUID = 1148480200357449237L; private String code; private String msg; public void setCode(String code){ this.code = code; } public String getCode(){ return code; } public void setMsg(String msg){ this.msg = msg; } public String getMsg(){ return msg; } @Override public String toString() { return "UserResponse"; } }
4.按照规范编写服务
[code]package com.ums.facade.impl;
import org.springframework.stereotype.Service;
import com.ums.dto.UserRequest;
import com.ums.dto.UserResponse;
import com.ums.facade.IUserQueryFacade;
@Service("userQuery")
public class UserQueryFacadeImpl implements IUserQueryFacade{
public UserResponse queryUser(UserRequest userRequest) {
UserResponse userResponse = new UserResponse();
String userId = userRequest.getUserId();
System.out.println("查询用户userId:"+userId);
userResponse.setCode("000");
userResponse.setMsg("成功");
return userResponse;
}
public UserResponse queryAllUser() {
UserResponse userResponse = new UserResponse();
userResponse.setCode("000");
userResponse.setMsg("成功");
return userResponse;
}
}
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:task="http://www.springframework.org/schema/task"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.2.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!-- dubbo 提供服务 -->
<!-- 1: 提供服务 名称 不能同名-->
<dubbo:application name="dubbo-provider-ums" logger="slf4j"/>
<!-- 2:向zookeeper集群注册中心注册,集群内用逗号分割,不同注册中心用|分割 -->
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"/>
<!-- 3:以dubbo协议提供服务 默认20880 -->
<dubbo:protocol name="dubbo" port="20880"/>
<!-- 当ProtocolConfig和ServiceConfig某属性没有配置时,采用此缺省值 -->
<dubbo:provider timeout="10000" threadpool="fixed" threads="100" accepts="1000" />
<!-- 4:暴露接口给消费方 单位毫秒 -->
<dubbo:service interface="com.ums.facade.IUserQueryFacade" ref="userQuery" protocol="dubbo"/>
</beans>
5.按照规范编写客户端调用
package com.ums.client; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.ums.dto.UserRequest; import com.ums.dto.UserResponse; import com.ums.facade.IUserQueryFacade; /** * Hello world! * */ public class App { public static void main( String[] args ) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml"); IUserQueryFacade userQuery = (IUserQueryFacade) context.getBean("userQuery"); UserRequest userRequest = new UserRequest(); userRequest.setUserId("123"); UserResponse userResponse = userQuery.queryUser(userRequest); System.out.println("响应结果:"+userResponse); context.close(); } } <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:task="http://www.springframework.org/schema/task" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.2.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- dubbo 提供服务 --> <!-- 1: 服务消费者--> <dubbo:application name="dubbo-consumer-ums" logger="slf4j"/> <!-- 2:向注册中心 以广播的形式注册 --> <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"/> <!-- 3:调用服务提供方暴露的接口 --> <dubbo:reference interface="com.ums.facade.IUserQueryFacade" id="userQuery" check="false"/> <!-- 全局设置 连接超时时间 单位是毫秒 当前是10分钟 并设置启动时dubbo不检索是否有相对应的服务提供方 仅开发阶段使用 --> <dubbo:consumer timeout="6000"/> </beans>
6.启动服务
package com.ums.provider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * 启动dubbo服务 * @author liufei * @date 2016-3-28 */ public class DubboProvider { private static final Logger log = LoggerFactory.getLogger(DubboProvider.class); public static void main(String[] args) { try { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml"); context.start(); } catch (Exception e) { log.error("== DubboProvider context start error:",e); } synchronized (DubboProvider.class) { while (true) { try { DubboProvider.class.wait(); } catch (InterruptedException e) { log.error("== synchronized error:",e); } } } } }
7.执行客户端调用,可以看到客户端打印成功的日志信息。项目的源码已经上传:http://download.csdn.net/detail/lf_214/9474592
相关文章推荐
- DOM节点的类型及指针
- 地理定位
- mysql 随机查询 记录集
- 申请企业证开发者账号流程
- 最小边覆盖&最小路径覆盖
- 最受欢迎的5个Android ORM框架
- C++中的static关键字
- install scrapy on debian 7
- 详解/etc/inittab文件
- hdu 1078 FatMouse and Cheese 记忆化搜索/动态规划
- 安卓开发 切图
- WinInet、winhttp、winsock的含义和区别
- Android 两种双击退出方法
- android persistent属性研究
- HDU 4608 I-number(模拟)
- Swift中实现点击、双击、捏、旋转、拖动、划动、长按手势的类和方法介绍
- RequestBodyAdvice和ResponseBodyAdvice
- JS定义一个立即执行的可重用函数
- 田忌赛马,求赢得的最大分数(分类,脑洞题)
- SilkTest Runner V1.0 发布了!