分布式框架Dubbo配置和实例
准备工作:
1、ZooKeeper:需要去Apache Zookeeper官网下载Zookeeper.tar.gz包,Dubbo是依赖于Zookeeper的
2、Maven:需要去Apache Maven官网下载Maven-xxx.bin.zip包,主要是为了打包war挂在Tomcat下
3、Tomcat:当做运行的服务器
4、Dubbo:http://dubbo.io/ 需要下载dubbo.zip到本地
5、Ecplise,IDE供写代码使用(不要忘记安装和配置JDK)
废话不说,直接开始
一、创建项目提供者
打开Ecplise----File-----New------Project,选择Maven Project,然后Next
这里只是为了演示,Group Id和Artifact Id名称你可以随意起
然后等待项目创建完成
创建完成之后修改项目下的pom.xml文件
1 <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"> 2 <modelVersion>4.0.0</modelVersion> 3 <groupId>com.luo</groupId> 4 <artifactId>provider</artifactId> 5 <version>0.0.1-SNAPSHOT</version> 6 <properties> 7 <spring.version>3.2.8.RELEASE</spring.version> 8 </properties> 9 10 <dependencies> 11 <dependency> 12 <groupId>com.alibaba</groupId> 13 <artifactId>dubbo</artifactId> 14 <version>2.5.3</version> 15 <exclusions> 16 <exclusion> 17 <groupId>org.springframework</groupId> 18 <artifactId>spring</artifactId> 19 </exclusion> 20 </exclusions> 21 </dependency> 22 <dependency> 23 <groupId>com.github.sgroschupf</groupId> 24 <artifactId>zkclient</artifactId> 25 <version>0.1</version> 26 </dependency> 27 <!-- spring相关 --> 28 <dependency> 29 <groupId>org.springframework</groupId> 30 <artifactId>spring-core</artifactId> 31 <version>${spring.version}</version> 32 </dependency> 33 <dependency> 34 <groupId>org.springframework</groupId> 35 <artifactId>spring-beans</artifactId> 36 <version>${spring.version}</version> 37 </dependency> 38 <dependency> 39 <groupId>org.springframework</groupId> 40 <artifactId>spring-context</artifactId> 41 <version>${spring.version}</version> 42 </dependency> 43 <dependency> 44 <groupId>org.springframework</groupId> 45 <artifactId>spring-jdbc</artifactId> 46 <version>${spring.version}</version> 47 </dependency> 48 <dependency> 49 <groupId>org.springframework</groupId> 50 <artifactId>spring-web</artifactId> 51 <version>${spring.version}</version> 52 </dependency> 53 <dependency> 54 <groupId>org.springframework</groupId> 55 <artifactId>spring-webmvc</artifactId> 56 <version>${spring.version}</version> 57 </dependency> 58 <dependency> 59 <groupId>org.springframework</groupId> 60 <artifactId>spring-aop</artifactId> 61 <version>${spring.version}</version> 62 </dependency> 63 <dependency> 64 <groupId>org.springframework</groupId> 65 <artifactId>spring-tx</artifactId> 66 <version>${spring.version}</version> 67 </dependency> 68 <dependency> 69 <groupId>org.springframework</groupId> 70 <artifactId>spring-orm</artifactId> 71 <version>${spring.version}</version> 72 </dependency> 73 <dependency> 74 <groupId>org.springframework</groupId> 75 <artifactId>spring-context-support</artifactId> 76 <version>${spring.version}</version> 77 </dependency> 78 <dependency> 79 <groupId>org.springframework</groupId> 80 <artifactId>spring-test</artifactId> 81 <version>${spring.version}</version> 82 </dependency> 83 <dependency> 84 <groupId>org.springframework</groupId> 85 <artifactId>spring-jms</artifactId> 86 <version>${spring.version}</version> 87 </dependency> 88 </dependencies> 89 </project>
然后在项目中添加文件
ITestService.java和TestService.java
1 package com.song.Iservice; 2 3 public interface ITestService { 4 public String getName(); 5 }
1 package com.song.service; 2 import com.song.Iservice.*; 3 public class TestService implements ITestService { 4 5 public String getName() { 6 // TODO Auto-generated method stub 7 return "song"; 8 } 9 10 }
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans 6 http://www.springframework.org/schema/beans/spring-beans.xsd 7 http://code.alibabatech.com/schema/dubbo 8 http://code.alibabatech.com/schema/dubbo/dubbo.xsd "> 9 <!--具体实现的bean--> 10 <bean id="testService" class="com.luo.service.impl.TestServiceImpl" /> 11 <!--提供方应用信息,用于计算依赖关系--> 12 <dubbo:application name="provider" /> 13 <!--使用Zookeeper注册中心暴露服务地址--> 14 <dubbo:registry address="zookeeper://127.0.0.1:2181" /> 15 <!--用dubbo协议在29014端口暴露服务--> 16 <dubbo:protocol name="dubbo" port="29014" /> 17 <!--声明需要暴露的服务接口--> 18 <dubbo:service interface="com.luo.service.TestService" ref="testService" /> 19 </beans>
上面是application.xml
下面是Test.java
1 package com.song.test; 2 3 import java.io.IOException; 4 import org.springframework.context.support.ClassPathXmlApplicationContext; 5 6 public class Test { 7 public static void main(String[] args) { 8 ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"application.xml"}); 9 context.start(); 10 System.out.println("Provider register Success"); 11 try { 12 System.in.read();//让此程序一直跑,表示一直提供服务 13 } 14 catch(IOException e) { 15 e.printStackTrace(); 16 } 17 } 18 }
上面提供者的程序已经写完了
接下来是配置了
1、Zookeeper配置:打开Zookeeper所在文件的bin目录运行zkServer.cmd(别忘了配置conf里面的cfg文件并且重命名为zoo.cfg)
2、打开dubbo所在文件dubbo-admin目录,在此目录中打开cmd 然后输入
mvn package -Dmaven.skip.test=true
如果成功会生成一个target文件夹,里面有个war文件,把这个文件拷贝到Tomcat下的WebApps目录下
3、运行Tomcat会生成一个和war同名称的文件夹,打开这个文件夹,下面的WEB-INF子文件夹里面有个dubbo.properties的文件
可以看到下面的内容,这就是网页登录的账号和密码
1 dubbo.registry.address=zookeeper://127.0.0.1:2181 2 dubbo.admin.root.password=root 3 dubbo.admin.guest.password=guest
在Tomcat中输入访问的文件夹名称就会弹出登录对话框,输入完用户和密码后就会进入到Dubbo-admin的主界面
3、启动Ecplise的Test.java---Run as Java Application,可以看到logcat输出“Provider register Success”
输入:com.song.service可以得到如下界面
下面我们来写Consumer的代码
和前面一样建一个Maven项目,命名为consumer
1、修改pom.xml
1 <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"> 2 <modelVersion>4.0.0</modelVersion> 3 <groupId>com.song</groupId> 4 <artifactId>consumer</artifactId> 5 <version>0.0.1-SNAPSHOT</version> 6 <properties> 7 <spring.version>3.2.8.RELEASE</spring.version> 8 </properties> 9 10 <dependencies> 11 <!-- 添加provider的jar包 --> 12 <dependency> 13 <groupId>com.song</groupId> 14 <artifactId>provider</artifactId> 15 <version>0.0.1-SNAPSHOT</version> 16 </dependency> 17 <!-- 添加dubbo依赖 --> 18 <dependency> 19 <groupId>com.alibaba</groupId> 20 <artifactId>dubbo</artifactId> 21 <version>2.5.3</version> 22 <exclusions> 23 <exclusion> 24 <groupId>org.springframework</groupId> 25 <artifactId>spring</artifactId> 26 </exclusion> 27 </exclusions> 28 </dependency> 29 <!-- 添加zk客户端依赖 --> 30 <dependency> 31 <groupId>com.github.sgroschupf</groupId> 32 <artifactId>zkclient</artifactId> 33 <version>0.1</version> 34 </dependency> 35 <!-- spring相关 --> 36 <dependency> 37 <groupId>org.springframework</groupId> 38 <artifactId>spring-core</artifactId> 39 <version>${spring.version}</version> 40 </dependency> 41 <dependency> 42 <groupId>org.springframework</groupId> 43 <artifactId>spring-beans</artifactId> 44 <version>${spring.version}</version> 45 </dependency> 46 <dependency> 47 <groupId>org.springframework</groupId> 48 <artifactId>spring-context</artifactId> 49 <version>${spring.version}</version> 50 </dependency> 51 <dependency> 52 <groupId>org.springframework</groupId> 53 <artifactId>spring-jdbc</artifactId> 54 <version>${spring.version}</version> 55 </dependency> 56 <dependency> 57 <groupId>org.springframework</groupId> 58 <artifactId>spring-web</artifactId> 59 <version>${spring.version}</version> 60 </dependency> 61 <dependency> 62 <groupId>org.springframework</groupId> 63 <artifactId>spring-webmvc</artifactId> 64 <version>${spring.version}</version> 65 </dependency> 66 <dependency> 67 <groupId>org.springframework</groupId> 68 <artifactId>spring-aop</artifactId> 69 <version>${spring.version}</version> 70 </dependency> 71 <dependency> 72 <groupId>org.springframework</groupId> 73 <artifactId>spring-tx</artifactId> 74 <version>${spring.version}</version> 75 </dependency> 76 <dependency> 77 <groupId>org.springframework</groupId> 78 <artifactId>spring-orm</artifactId> 79 <version>${spring.version}</version> 80 </dependency> 81 <dependency> 82 <groupId>org.springframework</groupId> 83 <artifactId>spring-context-support</artifactId> 84 <version>${spring.version}</version> 85 </dependency> 86 <dependency> 87 <groupId>org.springframework</groupId> 88 <artifactId>spring-test</artifactId> 89 <version>${spring.version}</version> 90 </dependency> 91 <dependency> 92 <groupId>org.springframework</groupId> 93 <artifactId>spring-jms</artifactId> 94 <version>${spring.version}</version> 95 </dependency> 96 </dependencies> 97 </project>
其实就是添加了前一个项目的依赖
1 <!-- 添加provider的jar包 --> 2 <dependency> 3 <groupId>com.song</groupId> 4 <artifactId>provider</artifactId> 5 <version>0.0.1-SNAPSHOT</version> 6 </dependency>
application.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans 5 http://www.springframework.org/schema/beans/spring-beans.xsd 6 http://code.alibabatech.com/schema/dubbo 7 http://code.alibabatech.com/schema/dubbo/dubbo.xsd "> 8 <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 --> 9 <dubbo:application name="consumer" /> 10 <!-- 使用multicast广播注册中心暴露发现服务地址 --> 11 <dubbo:registry protocol="zookeeper" address="zookeeper://127.0.0.1:2181" /> 12 <!-- 生成远程服务代理,可以和本地bean一样使用demoService --> 13 <dubbo:reference id="testService" interface="com.luo.service.TestService" /> 14 </beans>
consumerTest.java
1 package consumer; 2 3 import java.io.IOException; 4 5 import org.springframework.context.support.ClassPathXmlApplicationContext; 6 7 import com.luo.service.TestService; 8 9 public class consumerTest { 10 public static void main(String[] args) { 11 ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( 12 new String[] { "application.xml" }); 13 context.start(); 14 TestService testService = (TestService) context.getBean("testService"); 15 System.out.println(testService.getName()); 16 try { 17 System.in.read(); 18 } catch (IOException e) { 19 e.printStackTrace(); 20 } 21 22 } 23 }
然后启动项目,会在消费者那里看到有一个IP