【dubbo】小实例

来源:互联网 发布:音响 知乎 编辑:程序博客网 时间:2024/06/04 18:03
       本教程所有安装包以及程序代码已上传至GitHub,下载路径:https://github.com/zhangzhenhua92/dubbo-framework.git   

零、需求:
       如图所示,有dubbo-a和dubbo-b系统,两个系统之间进行调用,dubbo-a调用dubbo-b中的方法,实现查询列表功能:
         

        同时参照这张架构图来进行设计:
         

一、准备“注册中心”

       1.安装zookeeper注册中心
       解压安装包之后,修改zoo.cfg的配置文件路径(\zookeeper\zookeeper-3.4.8\conf):
        

        2.启动zookeeper,双击bin\zkServer.cmd
   

      
二、"dubbo-b-api"系统

      首先,“dubbo-a”和“dubbo-b”会使用相同的pojo实体,同时"dubbo-a"需要知道所要调用的"dubbo-b"的接口名称,即pojo和interface都需要被两个系统所公用,为了避免繁冗,就提取出了系统“dubbo-b-api”,目录结构如下:
        

       如图所示,在该系统中定义了dubbo-a和dubbo-b所公用的pojo和接口,pom.xml文件无需修改。(代码参考github代码链接)


三、“dubbo-b”系统

       1.添加pom依赖
       由于dubbo-b系统充当provider,此时对其pom文件进行扩充:
<dependencies><!-- 引用公用的pojo以及接口 --><dependency><groupId>cn.itcast.dubbo</groupId><artifactId>dubbo-b-api</artifactId><version>0.0.1-SNAPSHOT</version></dependency> <!-- dubbo采用spring配置方式,所以需要导入spring容器依赖 --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>4.1.3.RELEASE</version></dependency><!-- 引用sl4j做日志 --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.6.4</version></dependency><!-- 引入dubbo的jar包 --><dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><version>2.5.3</version><exclusions><exclusion><!-- 排除传递spring依赖 --><artifactId>spring</artifactId><groupId>org.springframework</groupId></exclusion></exclusions></dependency><!-- 引入zookeeper充当注册中心 --><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.3.3</version></dependency><!-- 同上算作zookeeper充当注册中心 --><dependency><groupId>com.github.sgroschupf</groupId><artifactId>zkclient</artifactId><version>0.1</version></dependency></dependencies><build><finalName>dubbo-b</finalName><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><port>8181</port><path>/</path></configuration></plugin></plugins></build>  
       如上可见,dubbo采用spring配置方式,并对dubbo,日志,zookeeper相关jar分别进行了依赖。

       2.编写接口实现
       
       如图所示,在cn.itcast.dubbo.service.impl目录下,编写UserServiceImpl.java的代码实现:
import java.util.ArrayList;import java.util.List;import cn.itcast.dubbo.pojo.User;import cn.itcast.dubbo.service.UserService;public class UserServiceImpl implements UserService {    /**     * 实现查询,模拟实现,不做具体的数据库查询。     */    public List<User> queryAll() {        List<User> list = new ArrayList<User>();        for (int i = 0; i < 10; i++) {            User user = new User();            user.setAge(10 + i);            user.setId(Long.valueOf(i + 1));            user.setPassword("123456");            user.setUsername("username_" + i);            list.add(user);        }        return list;    }}

      3.添加配置
      3.1添加log4j.properties配置
log4j.rootLogger=DEBUG,A1log4j.logger.com.taotao = DEBUGlog4j.logger.org.mybatis = DEBUGlog4j.appender.A1=org.apache.log4j.ConsoleAppenderlog4j.appender.A1.layout=org.apache.log4j.PatternLayoutlog4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n

      3.2dubbo文件夹,并在其中添加“dubbo-server.xml”配置文件。
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"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-4.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsdhttp://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.xsdhttp://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"><!-- 提供方应用信息,用于计算依赖关系 --><dubbo:application name="dubbo-b-server" /><!-- 这里使用的注册中心是zookeeper --><dubbo:registry address="zookeeper://127.0.0.1:2181"client="zkclient" /><!-- 用dubbo协议在20880端口暴露服务 --><dubbo:protocol name="dubbo" port="20880" /><!-- 将该接口暴露到dubbo中,多个接口 --><dubbo:service interface="cn.itcast.dubbo.service.UserService"ref="userServiceImpl" /><!-- 将具体的实现类加入到Spring容器中 --><bean id="userServiceImpl" class="cn.itcast.dubbo.service.impl.UserServiceImpl" /><!-- 在注册中心中自动查找监控服务 --><dubbo:monitor protocol="registry"/></beans>
       这个配置文件,是dubbo配置的核心,dubbo官网对它的讲解:http://dubbo.io/user-guide/reference-xmlconf/introduction.html,多去参考官方文档,这块就会很熟悉。

       3.3添加web.xml配置
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"id="WebApp_ID" version="2.5"><display-name>dubbo-b</display-name><!-- 指定debbo的配置文件 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:dubbo/dubbo-*.xml</param-value></context-param><!--Spring的ApplicationContext 载入 --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list></web-app>
       如上所示,通过<context-param>指定dubbo的配置文件,以及Spring的ApplicationContext载入。
       
     4.执行mvn package,将其war包部署到tomcat上
   


四、“dubbo-a”系统

     新建maven项目,如github链接,目录结构如图:
       
       1.配置文件
       此时pom.xml文件和"dubbo-b"一致,log4j.properties文件和"dubbo-b"一致,在dubbo目录下,新建“dubbo-consumer.xml”,如下:
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"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-4.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsdhttp://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.xsdhttp://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"><!-- 提供方应用信息,用于计算依赖关系 --> <dubbo:application name="dubbo-a-consumer" /><!-- 这里使用的注册中心是zookeeper --><dubbo:registry address="zookeeper://127.0.0.1:2181"client="zkclient" /><!-- 从注册中心中查找服务 --><dubbo:reference id="userService"interface="cn.itcast.dubbo.service.UserService" /></beans>
       consumer这方仅仅三个声明,1.consumer方应用信息、2.注册中心声明、3.从注册中心要查找的服务
 
       2.测试代码
       编写UserServiceTest.java测试类
import java.util.List;import org.junit.Before;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import cn.itcast.dubbo.pojo.User;public class UserServiceTest {private UserService userService;    @Before    public void setUp() throws Exception {        // 完成UserService的初始化,通过dubbo拿到远程的impl实例        ApplicationContext applicationContext = new ClassPathXmlApplicationContext(                "classpath:dubbo/dubbo-*.xml");        this.userService = applicationContext.getBean(UserService.class);    }    @Test    public void testQueryAll() {        for (int i = 0; i < 500; i++) {            List<User> list = this.userService.queryAll();            for (User user : list) {                System.out.println(user);            }                        try {                Thread.sleep(i * 10);            } catch (InterruptedException e) {                e.printStackTrace();            }        }           }}
      在@Before方法中,完成UserService初始化,拿到远程impl的实例,在@Test方法中调用其方法并打印user.
      运行结果:
      

      至此,通过dubbo实现远程RPC调用成功。









原创粉丝点击