zoukankan      html  css  js  c++  java
  • Java代码搭建Dubbo+ZooKeeper 的示例

    一、简介

      基于Dubbo + ZooKeeper实现的分布式架构,调用接口方法就像调用本地方法一样调用远程服务。

      来自Dubbo官网的架构图:

                

      节点角色说明
    节点角色说明
    Provider 暴露服务的服务提供方
    Consumer 调用远程服务的服务消费方
    Registry 服务注册与发现的注册中心
    Monitor 统计服务的调用次数和调用时间的监控中心
    Container 服务运行容器
      调用关系说明
    1. 服务容器负责启动,加载,运行服务提供者。
    2. 服务提供者在启动时,向注册中心注册自己提供的服务。
    3. 服务消费者在启动时,向注册中心订阅自己所需的服务。
    4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
    5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
    6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

      Dubbo 架构具有以下几个特点,分别是连通性、健壮性、伸缩性、以及向未来架构的升级性

    二、搭建Zookeeper注册中心详细步骤参考:

      https://www.cnblogs.com/sun-flower1314/p/11341499.html

    三、创建三个maven工程:接口工程;服务端工程;客户端工程。服务端和客户端去依赖接口工程。

      接口工程的作用:定义服务接口,供消服务消费者和提供者使用

      1. 创建接口工程的步骤:

        1)创建一个maven项目,在创建后生成jar包的方式

          

                 

         2)创建完工程后,定义服务接口

    package com.hxc.dubbo.demo;
    
    public interface DemoService {
        String sayHello(String name);
    }

       2. 创建服务端工程的步骤:

         1)和创建接口工程相同,packaging项选择war包的形式

                    

         2)以war包形式创建后,项目的pom.xml文件会报错:

          web.xml is missing and <failOnMissingWebXml> is set to true,原因是没有web.xml文件。

          解决错误的方法:

          ①右击项目,选择Properties ——> Project Facets ——> 将Dynamic Web Module选项去掉,然后选择Apply:

             

          ② 再次选中Dynamic Web Module,点击下方的Futher configuration available...进行配置web.xml,在弹出的界面中,在Content directory项填入:src/main/webapp,依次点击ok-> Apply -> Apply and close

                      

         

         3) 项目创建完成后,在pom.xml中依赖接口工程(即依赖由1创建的接口工程)

        

        或者直接自己手动敲:

        <dependency>
              <groupId>com.hxc.dubboInterfaceDemo</groupId>
              <artifactId>dubboInterfaceDemo</artifactId>
              <version>0.0.1-SNAPSHOT</version>
          </dependency>

       4)添加相应的其他依赖jar包

       <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>2.2</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.6.8</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.5.5</version>
        </dependency>
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.10</version>
        </dependency>

      5)创建服务的接口实现类

    package com.hxc.dubbo.demo.provider;
    
    import com.hxc.dubbo.demo.DemoService;
    
    public class DemoServiceImpl implements DemoService {
    
        public String sayHello(String name) {
            return " Hello " + name;
        }
    }

       6)增加配置文件 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">
    
        <!-- 提供方应用信息,用于计算依赖关系 -->
        <dubbo:application name="hello-world-app"  />
        <!-- 使用multicast广播注册中心暴露服务地址 方式为: <dubbo:registry address="multicast://224.5.6.7:1234" />-->
        <!-- 采用zookeeper的方式 -->
        <dubbo:registry address="192.168.202.132:2181" protocol="zookeeper" />
    
        <!-- 用dubbo协议在20880端口暴露服务 -->
        <dubbo:protocol name="dubbo" port="20880" />
    
        <!-- 声明需要暴露的服务接口 -->
        <dubbo:service interface="com.hxc.dubbo.demo.DemoService" ref="demoService" />
    
        <!-- 和本地bean一样实现服务 -->
        <bean id="demoService" class="com.hxc.dubbo.demo.provider.DemoServiceImpl" />
    </beans>

      7) 测试提供服务的是否能连接通

      测试方式一:写测试代码

    package com.hxc.demo.test;
    
    import java.io.IOException;
    
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class ProviderTest {
        public static void main(String[] args) throws IOException {
            ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("provider.xml");
            context.start();
            System.in.read(); // 按任意键退出
        }
    }

      测试方式二:在web.xml中增加 加载配置文件的 provider.xml 的参数,再将项目添加至tomcat跑起来,查看zookeeper服务中是否已经注册

      在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">
        <!-- needed for ContextLoaderListener -->
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:provider.xml</param-value>
        </context-param>
    
        <!-- Bootstraps the root web application context before servlet initialization -->
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
    </web-app>

      测试通过后,在zookeeper端可以查看服务注册是否成功,若看到下图对应的值,则说明联接成功:

           

     3. 创建客户端工程的步骤:

        1)创建客户端工程和创建服务端工程的步骤相同(1-3步骤)

      2)创建完成后,添加依赖jar包

          <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>2.2</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.6.8</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.5.5</version>
        </dependency>
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.10</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.3.10.RELEASE</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.0</version>
            <scope>provided</scope>
        </dependency>

      3)增加配置文件,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="consumer-of-helloworld-app"  />
    
        <!-- 使用multicast广播注册中心暴露发现服务地址 <dubbo:registry address="multicast://224.5.6.7:1234" /> -->
        <!-- 采用zookeeper的方式 -->
        <dubbo:registry address="192.168.202.132:2181" protocol="zookeeper" />
    
        <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
        <dubbo:reference id="demoService" interface="com.hxc.dubbo.demo.DemoService" />
    </beans>

      4) 测试客户端

      测试时,一定要先启动服务端在zookeeper上注册完接口,然后再测试客户端

      测试方式一:直接写测试代码,运行后在控制台能够看到   Hello world

    package com.hxc.dubbo.demo.test;
    
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import com.hxc.dubbo.demo.DemoService;
    
    public class ConsumerTest {
        public static void main(String[] args) throws Exception {
            ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("consumer.xml");
            context.start();
            DemoService demoService = (DemoService)context.getBean("demoService"); // 获取远程服务代理
            String hello = demoService.sayHello("world"); // 执行远程方法
            System.out.println( hello ); // 显示调用结果
        }
    }

      测试方式二:在web.xml中增加 加载配置文件的 consumer.xml 的参数,再将项目添加至tomcat跑起来,查看zookeeper服务中是否已经注册

      在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" >
        <servlet>
            <servlet-name>springDispatcherServlet</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:demo-service-consumer.xml</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>springDispatcherServlet</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
        
    </web-app>

       5)再zookeeper服务中心查看结果:

                 

    到此就基本完成了整个服务的搭建,至于dubbo更加详细的API,请参考dubbo官方文档。

    关于Dubbo的官方API:https://dubbo.gitbooks.io/dubbo-user-book/  非常全面详细的教程

    记得点个赞哦 

    同时 希望各位能提出宝贵的意见方便改进 不甚感激!!

  • 相关阅读:
    [LeetCode] Word Ladder II
    [LeetCode] Edit Distance
    [LeetCode] Merge Intervals
    内存分配与Segmentation fault
    结构体 指针 数组
    resolv.conf
    无法启动xwindow
    stopping NetworkManager daemon failed
    linux 挂载光盘:mount: you must specify the filesystem type
    修改主机hostname
  • 原文地址:https://www.cnblogs.com/sun-flower1314/p/11344896.html
Copyright © 2011-2022 走看看