dubbo框架主要作用是基于RPC的远程调用服务管理,但是注册中心是用的zookeeper,搭建dubbo,首先要安装zookeeper,配置zookeeper。。。
实现功能如图所示:(存在2个系统,A系统和B系统,A系统调用B系统的接口获取数据,用于查询用户列表)
一、安装zookeeper
1、解压下载的安装包
2、修改配置文件zoo.cfg(解压出来不是这个名字,是zoo_sample.cfg,改了一下名字):该目录必须存在。
3、启动zookeeper服务:
二、搭建B系统
1、创建工程(maven工程)
2、导入依赖
1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 3 <modelVersion>4.0.0</modelVersion> 4 <groupId>cn.itcast.dubbo</groupId> 5 <artifactId>dubbo-b</artifactId> 6 <version>1.0.0-SNAPSHOT</version> 7 <packaging>war</packaging> 8 9 <dependencies> 10 <!-- dubbo采用spring配置方式,所以需要导入spring容器依赖 --> 11 <dependency> 12 <groupId>org.springframework</groupId> 13 <artifactId>spring-webmvc</artifactId> 14 <version>4.1.3.RELEASE</version> 15 </dependency> 16 <dependency> 17 <groupId>org.slf4j</groupId> 18 <artifactId>slf4j-log4j12</artifactId> 19 <version>1.6.4</version> 20 </dependency> 21 22 <dependency> 23 <groupId>org.apache.zookeeper</groupId> 24 <artifactId>zookeeper</artifactId> 25 <version>3.3.3</version> 26 </dependency> 27 28 <dependency> 29 <groupId>com.github.sgroschupf</groupId> 30 <artifactId>zkclient</artifactId> 31 <version>0.1</version> 32 </dependency> 33 34 <dependency> 35 <groupId>com.alibaba</groupId> 36 <artifactId>dubbo</artifactId> 37 <version>2.5.3</version> 38 <exclusions> 39 <exclusion> 40 <!-- 排除传递spring依赖 --> 41 <artifactId>spring</artifactId> 42 <groupId>org.springframework</groupId> 43 </exclusion> 44 </exclusions> 45 </dependency> 46 </dependencies> 47 <build> 48 <plugins> 49 <plugin> 50 <groupId>org.apache.tomcat.maven</groupId> 51 <artifactId>tomcat7-maven-plugin</artifactId> 52 <version>2.2</version> 53 <configuration> 54 <port>8181</port> 55 <path>/</path> 56 </configuration> 57 </plugin> 58 </plugins> 59 </build> 60 </project>
3、配置log4j文件
1 log4j.rootLogger=DEBUG,A1 2 log4j.logger.com.taotao = DEBUG 3 log4j.logger.org.mybatis = DEBUG 4 5 log4j.appender.A1=org.apache.log4j.ConsoleAppender 6 log4j.appender.A1.layout=org.apache.log4j.PatternLayout 7 log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n
4、创建User对象
package cn.itcast.dubbo.pojo; //使用dubbo要求传输的对象必须实现序列化接口 public class User implements java.io.Serializable { private static final long serialVersionUID = -2668999087589887337L; private Long id; private String username; private String password; private Integer age; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
5、创建UserService(接口)提供查询服务
1 package cn.itcast.dubbo.service; 2 3 import java.util.List; 4 5 import cn.itcast.dubbo.pojo.User; 6 7 public interface UserService { 8 9 /** 10 * 查询所有的用户数据 11 * 12 * @return 13 */ 14 public List<User> queryAll(); 15 16 }
6、创建UserServiceImpl实现类
1 package cn.itcast.dubbo.service.impl; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import cn.itcast.dubbo.pojo.User; 7 import cn.itcast.dubbo.service.UserService; 8 9 public class UserServiceImpl implements UserService{ 10 11 /** 12 * 实现查询,这里做模拟实现,不做具体的数据库查询 13 */ 14 public List<User> queryAll() { 15 List<User> list = new ArrayList<User>(); 16 for (int i = 0; i < 10; i++) { 17 User user = new User(); 18 user.setAge(10 + i); 19 user.setId(Long.valueOf(i + 1)); 20 user.setPassword("123456"); 21 user.setUsername("username_" + i); 22 list.add(user); 23 } 24 return list; 25 } 26 27 }
7、编写dubbo配置文件
具体配置:(dubbo-server.xml的配置,注意这个自己在eclipse中导入一下dubbo的xsd约束文件,不然会报错的)
1 <beans xmlns="http://www.springframework.org/schema/beans" 2 xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" 3 xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 6 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd 7 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd 8 http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> 9 10 <!-- 提供方应用信息,用于计算依赖关系 --> 11 <dubbo:application name="dubbo-b-server" /> 12 13 <!-- 这里使用的注册中心是zookeeper --> 14 <dubbo:registry address = "zookeeper://127.0.0.1:2181" client="zkclient" /> 15 16 <!-- 用dubbo协议在20880端口暴露服务 --> 17 <dubbo:protocol name="dubbo" port="20880" /> 18 19 <!-- 将该接口暴露到dubbo中 --> 20 <dubbo:service interface="cn.itcast.dubbo.service.UserService " ref="userServiceImpl"/> 21 22 <!-- 将具体的实现类加入到Spring容器中 --> 23 <bean id="userServiceImpl" class="cn.itcast.dubbo.service.impl.UserServiceImpl"/> 24 25 </beans>
8、编写web.xml 文件,主要是配置spring的容器,项目启动的时候启动spring的容器
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xmlns="http://java.sun.com/xml/ns/javaee" 4 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 5 id="WebApp_ID" version="2.5"> 6 <display-name>dubbo-b</display-name> 7 8 <context-param> 9 <param-name>contextConfigLocation</param-name> 10 <param-value>classpath:dubbo/dubbo-*.xml</param-value> 11 </context-param> 12 13 <!--Spring的ApplicationContext 载入 --> 14 <listener> 15 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 16 </listener> 17 18 <welcome-file-list> 19 <welcome-file>index.jsp</welcome-file> 20 </welcome-file-list> 21 22 </web-app>
9、启动Tomcat(Maven Build的方式启动Tomcat)
查看Tomcat日志:发现userservice的服务已经发布成功了。
1 2019-05-19 21:59:13,588 [localhost-startStop-1] [com.alibaba.dubbo.registry.zookeeper.ZookeeperRegistry]-[INFO] [DUBBO] Load registry store file C:\Users\ssc\.dubbo\dubbo-registry-127.0.0.1.cache, data: {cn.itcast.dubbo.service.UserService=empty://169.254.103.222:20880/cn.itcast.dubbo.service.UserService?anyhost=true&application=dubbo-b-server&category=configurators&check=false&dubbo=2.5.3&interface=cn.itcast.dubbo.service.UserService&methods=queryAll&pid=3936&side=provider×tamp=1558177989176}, dubbo version: 2.5.3, current host: 127.0.0.1 2 2019-05-19 21:59:13,606 [localhost-startStop-1] [org.I0Itec.zkclient.ZkConnection]-[DEBUG] Creating new ZookKeeper instance to connect to 127.0.0.1:2181. 3 2019-05-19 21:59:13,608 [ZkClient-EventThread-19-127.0.0.1:2181] [org.I0Itec.zkclient.ZkEventThread]-[INFO] Starting ZkClient event thread.
可以看到,已经将UserService服务注册到zookeeper注册中心,协议采用的是dubbo
三、搭建A系统
1、创建工程
2、导入依赖
1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 3 <modelVersion>4.0.0</modelVersion> 4 <groupId>cn.itcast.dubbo</groupId> 5 <artifactId>dubbo-a</artifactId> 6 <version>0.0.1-SNAPSHOT</version> 7 8 <dependencies> 9 <!-- dubbo采用spring配置方式,所以需要导入spring容器依赖 --> 10 <dependency> 11 <groupId>org.springframework</groupId> 12 <artifactId>spring-webmvc</artifactId> 13 <version>4.1.3.RELEASE</version> 14 </dependency> 15 <dependency> 16 <groupId>org.slf4j</groupId> 17 <artifactId>slf4j-log4j12</artifactId> 18 <version>1.6.4</version> 19 </dependency> 20 21 <dependency> 22 <groupId>com.alibaba</groupId> 23 <artifactId>dubbo</artifactId> 24 <version>2.5.3</version> 25 <exclusions> 26 <exclusion> 27 <!-- 排除传递spring依赖 --> 28 <artifactId>spring</artifactId> 29 <groupId>org.springframework</groupId> 30 </exclusion> 31 </exclusions> 32 </dependency> 33 34 <dependency> 35 <groupId>org.apache.zookeeper</groupId> 36 <artifactId>zookeeper</artifactId> 37 <version>3.3.3</version> 38 </dependency> 39 40 <dependency> 41 <groupId>com.github.sgroschupf</groupId> 42 <artifactId>zkclient</artifactId> 43 <version>0.1</version> 44 </dependency> 45 46 <!-- 单元测试 --> 47 <dependency> 48 <groupId>junit</groupId> 49 <artifactId>junit</artifactId> 50 <version>4.10</version> 51 <scope>test</scope> 52 </dependency> 53 </dependencies> 54 </project>
3、配置log4j文件
1 log4j.rootLogger=DEBUG,A1 2 log4j.logger.com.taotao = DEBUG 3 log4j.logger.org.mybatis = DEBUG 4 5 log4j.appender.A1=org.apache.log4j.ConsoleAppender 6 log4j.appender.A1.layout=org.apache.log4j.PatternLayout 7 log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n
4、从b系统中拷贝User对象、UserService接口到a系统
5、编写dubbo配置文件
配置文件如下:
1 <beans xmlns="http://www.springframework.org/schema/beans" 2 xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" 3 xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 6 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd 7 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd 8 http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> 9 10 <!-- 提供方应用信息,用于计算依赖关系 --> 11 <dubbo:application name="dubbo-a-consumer"/> 12 13 <!-- 这里使用的注册中心是zookeeper --> 14 <dubbo:registry address="zookeeper://127.0.0.1:2181" client="zkclient"/> 15 16 <!-- 从注册中心中查找服务 --> 17 <dubbo:referenceid="userService" interface="cn.itcast.dubbo.service.UserService"/> 18 19 </beans>
6、编写UserService测试用例
1 package cn.itcast.dubbo.service; 2 3 import java.net.InetAddress; 4 import java.util.List; 5 6 import org.junit.Before; 7 import org.junit.Test; 8 import org.springframework.context.ApplicationContext; 9 import org.springframework.context.support.ClassPathXmlApplicationContext; 10 11 import cn.itcast.dubbo.pojo.User; 12 13 import com.alibaba.dubbo.common.utils.NetUtils; 14 15 public class UserServiceTest { 16 17 private UserService userService; 18 19 @Before 20 public void setUp() throws Exception { 21 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:dubbo/*.xml"); 22 this.userService = applicationContext.getBean(UserService.class); 23 } 24 25 @Test 26 public void testQueryAll() { 27 List<User> users = this.userService.queryAll(); 28 for (User user : users) { 29 System.out.println(user); 30 } 31 } 32 33 public static void main(String[] args) { 34 InetAddress localAddress = NetUtils.getLocalAddress(); 35 System.out.println(localAddress.getHostAddress()); 36 37 } 38 }
四、解决代码重复的问题
1、创建dubbo-b-api
2、将dubbo-b中的pojo和service接口移动到dubbo-b-api中
3、在dubbo-b的pom.xml文件中添加dubbo-b-api的依赖
4、在dubbo-a的pom.xml文件中添加dubbo-b-api的依赖,并且将pojo与service接口删除
5、分别删除dubbo-a和dubbo-b中的重复代码
注意:启动时,不要忘记吧dubbo-b-api项目maven install安装到中央仓库