dubbo(分布式架构)+zookeeper(注册中心)+spring(provider和consumer) 基本使用
2015-07-24 14:44
971 查看
1.前言
看到网上各种dubbo的教程,应该基本上都是从一个地方贴过来的,一看到千篇一律的provider中main方法中的system.in.read()就头疼了,随便找找都是一个样,估计都没自己认真写过吧!工作之余,今天就写一个基于tomcat容器的provider、基于zookeeper单节点注册中心来玩玩儿。
2.准备工作
1>由于项目都是在maven下构建的,请先安装maven、开发工具eclipse以及maven插件
2>由于注册中心、监控中心、provider以及consumer都部署到不同的服务器,请先安装virtualbox,用虚拟机安装一个Linux系统,centos mini即可
3>虚拟机安装的centos我将其ip配置为静态,且与我本机位同一网段, 保证本机与虚拟机centos之间可以相互访问.
4>下载zookeeper的tar包导centos并解压到/usr/local/program/zookeeper
5>下载jdk7的tar包导centos并解压到/usr/local/program/jdk
6>下载dubbo建议监控中心的zip包并解压到本机E:\software\dobbo\monitor
3.配置
1>配置jdk
2>配置zookeeper 进入zookeeper的bin目录下 ./zkServer.sh start 运行上述命令 以默认配置开启zookeeper服务即可
3>配置监控中心 进入monitor的conf目录 编辑dubbo配置文件 配置注册中心信息dubbo.registry.address=zookeeper://10.4.2.254:2181 修改jetty的端口为8081保存 进入bin目录 点击start即可启动 由于是弄着玩儿的 直接将centos的防火墙关闭即可 省的配置端口开发 service iptables stop运行这条命令即可
4>浏览器中访问http://localhost:8081即可看到监控中心界面 点击services即可看到一个provider 就是监控中心本身的信息 后续开发provider启动之后会在这里看到provider的信息
4.开发
1>配置maven、安装eclipse以及maven插件
2>新建一个maven(webapp)工程 配置如下
1>provider.xml配置
2>web.xml配置
4>pom.xml配置
3>代码以及结构
1>包结构
com.dubbo.provider
------bean
----------------Users
------service
----------------DemoService
----------------DemoServiceImpl
2>代码
package com.dubbo.provider.service;
import java.util.ArrayList;
import java.util.List;
import com.alibaba.dubbo.config.annotation.Service;
import com.dubbo.provider.bean.User;
//注解方式
//@Service(interfaceClass = DemoService.class, version = "1.0.0")
public class DemoServiceImpl implements DemoService {
public String sayHello(String id) {
// TODO Auto-generated method stub
System.out.println("调用sayHell成功...");
return "hello:" + id;
}
public List<User> getUsers() {
System.out.println("调用getUsers成功...");
List<User> list = new ArrayList<User>();
list.add(new User("jianglong", 28, "nan"));
list.add(new User("tianqq", 25, "nv"));
return list;
}
}
3>新建一个普通的maven工程 demo-consumer
1>consumer.xml配置如下
2>pom.xml与provider相同
3>将provider打成jar包导入到consumer以备调用
4>写一个main方法调用dubboprovider的接口 代码如下
最后将privider用tomcat容器启动,在监控中心即可看到新添加了一条provider的信息 说明provider在注册中心注册成功。此时运行consumer的main方法 即可看到控制台有成功调用的提示 调用成功 简单的使用方式就成功了
遇到的问题:可以看到
看到网上各种dubbo的教程,应该基本上都是从一个地方贴过来的,一看到千篇一律的provider中main方法中的system.in.read()就头疼了,随便找找都是一个样,估计都没自己认真写过吧!工作之余,今天就写一个基于tomcat容器的provider、基于zookeeper单节点注册中心来玩玩儿。
2.准备工作
1>由于项目都是在maven下构建的,请先安装maven、开发工具eclipse以及maven插件
2>由于注册中心、监控中心、provider以及consumer都部署到不同的服务器,请先安装virtualbox,用虚拟机安装一个Linux系统,centos mini即可
3>虚拟机安装的centos我将其ip配置为静态,且与我本机位同一网段, 保证本机与虚拟机centos之间可以相互访问.
4>下载zookeeper的tar包导centos并解压到/usr/local/program/zookeeper
5>下载jdk7的tar包导centos并解压到/usr/local/program/jdk
6>下载dubbo建议监控中心的zip包并解压到本机E:\software\dobbo\monitor
3.配置
1>配置jdk
2>配置zookeeper 进入zookeeper的bin目录下 ./zkServer.sh start 运行上述命令 以默认配置开启zookeeper服务即可
3>配置监控中心 进入monitor的conf目录 编辑dubbo配置文件 配置注册中心信息dubbo.registry.address=zookeeper://10.4.2.254:2181 修改jetty的端口为8081保存 进入bin目录 点击start即可启动 由于是弄着玩儿的 直接将centos的防火墙关闭即可 省的配置端口开发 service iptables stop运行这条命令即可
4>浏览器中访问http://localhost:8081即可看到监控中心界面 点击services即可看到一个provider 就是监控中心本身的信息 后续开发provider启动之后会在这里看到provider的信息
4.开发
1>配置maven、安装eclipse以及maven插件
2>新建一个maven(webapp)工程 配置如下
1>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 ">
<!--此处主要使用注解方式,xml中配置了bean的话 此处可直接注释掉-->
<!--<dubbo:annotation package="com.dubbo.provider" />--> <!-- 具体的实现bean --> <bean id="demoService" class="com.dubbo.provider.service.DemoServiceImpl" /> <!-- 提供方应用信息,用于计算依赖关系 --> <dubbo:application name="test_provider" /> <!-- 使用zookeeper注册中心暴露服务地址 --> <dubbo:registry address="zookeeper://10.4.2.254:2181" /> <!-- 用dubbo协议在20880端口暴露服务 --> <dubbo:protocol name="dubbo" port="20880"/> <!-- <dubbo:monitor protocol="registry" address="127.0.0.1:7070"/> --> <!-- 声明需要暴露的服务接口 --> <dubbo:service interface="com.dubbo.provider.service.DemoService" ref="demoService" version="1.0.0"/> </beans>
2>web.xml配置
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>dubbo-webservice</display-name> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:provider.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>dubbo</servlet-name> <servlet-class>com.alibaba.dubbo.remoting.http.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dubbo</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> </web-app>
4>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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>demo-provider</groupId> <artifactId>demo-provider</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>demo-provider Maven Webapp</name> <url>http://maven.apache.org</url> <properties> <spring.version>4.1.7.RELEASE</spring.version> <cxf.version>3.1.1</cxf.version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <!-- <dependency> <groupId>com.bubugao.framework</groupId> <artifactId>bubugao-framework</artifactId> <version>0.9.0-SNAPSHOT</version> </dependency> --> <!-- dubbo dependency --> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.3</version> </dependency> <dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.18.1-GA</version> </dependency> <dependency> <groupId>org.jboss.netty</groupId> <artifactId>netty</artifactId> <version>3.2.9.Final</version> </dependency> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.4</version> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.6</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.12</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.12</version> </dependency> <dependency> <groupId>org.jboss.netty</groupId> <artifactId>netty</artifactId> <version>3.2.10.Final</version> </dependency> </dependencies> <build> <finalName>demo-provider</finalName> </build> </project>
3>代码以及结构
1>包结构
com.dubbo.provider
------bean
----------------Users
------service
----------------DemoService
----------------DemoServiceImpl
2>代码
package com.dubbo.provider.bean; public class User { private String name; private int age; private String sex; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public User() { super(); // TODO Auto-generated constructor stub } public User(String name, int age, String sex) { super(); this.name = name; this.age = age; this.sex = sex; } }
package com.dubbo.provider.service; import java.util.List; import com.dubbo.provider.bean.User; public interface DemoService { public String sayHello(String name); public List<User> getUsers(); }
package com.dubbo.provider.service;
import java.util.ArrayList;
import java.util.List;
import com.alibaba.dubbo.config.annotation.Service;
import com.dubbo.provider.bean.User;
//注解方式
//@Service(interfaceClass = DemoService.class, version = "1.0.0")
public class DemoServiceImpl implements DemoService {
public String sayHello(String id) {
// TODO Auto-generated method stub
System.out.println("调用sayHell成功...");
return "hello:" + id;
}
public List<User> getUsers() {
System.out.println("调用getUsers成功...");
List<User> list = new ArrayList<User>();
list.add(new User("jianglong", 28, "nan"));
list.add(new User("tianqq", 25, "nv"));
return list;
}
}
3>新建一个普通的maven工程 demo-consumer
1>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="test_consumer" />
<!-- 使用zookeeper注册中心暴露服务地址 -->
<dubbo:registry address="zookeeper://10.4.2.254:2181" />
<!-- <dubbo:monitor protocol="registry" address="127.0.0.1:7070"/> -->
<!-- 声明需要暴露的服务接口 -->
<dubbo:reference interface="com.dubbo.provider.service.DemoService" id="demoService" version="1.0.0"/>
</beans>
2>pom.xml与provider相同
3>将provider打成jar包导入到consumer以备调用
4>写一个main方法调用dubboprovider的接口 代码如下
package com.dubbo.consumer.boot; import java.text.SimpleDateFormat; import java.util.Date; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.dubbo.provider.service.DemoService; public class Boot { public static void main(String[] args) { // TODO Auto-generated method stub ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"consumer.xml"}); context.start(); System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); DemoService demoService=(DemoService) context.getBean("demoService"); System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); System.out.println(demoService.sayHello("jianglong")); System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); } }
最后将privider用tomcat容器启动,在监控中心即可看到新添加了一条provider的信息 说明provider在注册中心注册成功。此时运行consumer的main方法 即可看到控制台有成功调用的提示 调用成功 简单的使用方式就成功了
遇到的问题:可以看到
DemoService demoService=(DemoService) context.getBean("demoService");这句代码耗时有5秒左右 目前还没查出耗时这么久的原因来 后来我将provider zookeeper consumer以及monitor都放到本机来测试 耗时依然是5秒左右屡试不爽 目前为止还没有找到原因 若有知道的同仁 请多多请教和指正
相关文章推荐
- java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: Java heap space
- 在spring中使用MethodInterceptor实现aop(附项目中demo)
- JAVA抽象类和接口的理解
- Struts2注解 特别注意
- java实现从网上下载图片到本地的方法
- [LeetCode][Java] Pascal's Triangle
- JAVA的比较之==
- Java 中最常见的 5 个错误
- Spring 整合 Hibernate
- Eclipse中安装subclipse插件
- Spring 开发第一步导入jar包
- 几种任务调度的 Java 实现方法与比较
- java中eclipse的快捷键
- 框架之 spring
- spring jpa 行级锁的实现
- 【leetcode-14】Longest Common Prefix(java)
- Java程序:计算两个日期之间的天数,小时,等等
- Eclipse快捷键大全(转载)
- Java生成图片验证码2
- Java中Date类与Calendar类的用法和转化