基于Dubbo和Zookeeper实现服务间通信DEMO

环境准备

         * zookeeper单点或集群环境,演示使用集群

         * 基于maven进行项目构建

         * 必要jar包依赖

无注册中心的dubbo协调通信

    1,服务端整体结构

         a,服务端项目框架

            

            -- dubbo-server为服务端整体项目结构,其下分有两个子模块,dubbo-api和dubbo-service

            -- dubbo-api为服务端对外接口,依赖于dubbo-service

            -- dubbo-service为依赖dubbo-api,为dubbo-api中接口的实现类,具体实现对外接口

            -- 服务端对外接口提供只需提供dubbo-api,而具体实现的dubbo-service则对外隐藏

            -- 如果包依赖后一直错误提示不存在,记得对server-api-service依次install

        b,dubbo-api模块

            * pom文件

                   dubbo-api只负责对外提供接口,无需依赖包结构,除非接口传参有特殊需求

            * 接口文件

public interface IDubboDemoService {

    String showMsg(String msg);
}

        c,dubbo-service模块

             * pom文件

                    -- 不依赖zookeeper注册中心的通信, 只需要依赖dubbo和接口包进行服务发布

<dependency>
            <groupId>com.gupao.dubbo</groupId>
            <artifactId>dubbo-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.5.3</version>
        </dependency>

           * 接口实现类

                  -- 对接口做一个简单实现

public class DubboDemoService implements IDubboDemoService {
    @Override
    public String showMsg(String msg) {
        return "HELLO : " + msg;
    }
}

           * 配置文件 -- dubbo.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"
       xmlns:bean="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="dubbo-server" owner="ZPJ"/>

    <!-- DUBBO注册中心 -->
    <dubbo:registry address="N/A"/>

    <!-- 协议名称 -->
    <dubbo:protocol name="dubbo" port="20880"/>

    <!-- 接口地址 -->
    <dubbo:service interface="com.gupao.dubbo.IDubboDemoService" ref="gupaoHello"/>

    <!-- 引用服务 -->
    <bean id="gupaoHello" class="com.gupao.dubbo.impl.DubboDemoService"/>

</beans>

              * 配置文件 -- log4j.properties

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c:/mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###

log4j.rootLogger=info, stdout

        d,基本Spring发布服务(Spring为dubbo依赖包,无需刻意引入)

public class DubboDemoTest {
    public static void main(String[] args) throws IOException {
        // 加载配置文件
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("dubbo-server.xml");
        // 启动容器
        context.start();
        System.in.read();
    }
}

        e,服务端启动效果

                 -- 标注出来链接为无注册中心时,客户端需要引用的服务链接

    2,客户端整体结构

           a,pom文件

                  -- 引用必要的服务端对外接口jar包和dubbo包

<dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>dubbo</artifactId>
      <version>2.5.3</version>
    </dependency>
    <dependency>
      <groupId>com.gupao.dubbo</groupId>
      <artifactId>dubbo-api</artifactId>
      <version>1.0-SNAPSHOT</version>
    </dependency>
    <dependency>

           b,配置文件 -- dubbo.xml

                   -- 无注册中心时,dubbo引用服务需要添加url路径,路径为服务端启动日志中标注的内容

<?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"
       xmlns:bean="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="dubbo-server" owner="ZPJ"/>

    <!-- DUBBO注册中心 -->
    <dubbo:registry address="N/A"/>

    <!-- 协议名称 -->
    <dubbo:protocol name="dubbo" port="20880"/>

    <!-- 引用接口地址 -->
    <dubbo:reference id="gupaoHello" interface="com.gupao.dubbo.IDubboDemoService"
        url="dubbo://192.168.93.1:20880/com.gupao.dubbo.IDubboDemoService"/>

</beans>

             c,客户端调用

public class demo {
    public static void main(String[] args) throws InterruptedException {
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("dubbo-master.xml");
        for (int i = 0; i < 10; i++) {
            IDubboDemoService service = (IDubboDemoService) context.getBean("gupaoHello");
            System.out.println(service.showMsg("DUBBO连接成功"));
            Thread.sleep(2000);
        }
    }
}

             d,执行结果

            

    3,无注册中心的dubbo协调通信完成,后续在此基础上扩展

有注册中心的dubbo协调通信

    1,给服务端添加注册中心配置 -- 注册中心应用zookeeper注册中心

            * 修改dubbo.xml文件,只需修改注册中心那一条配置,此处引用的是zookeeper集群

<!-- DUBBO注册中心 -->
    <dubbo:registry protocol="zookeeper" address="192.168.91.128:2181,192.168.91.129:2181,192.168.91.130:2181"/>

            * 服务启动

                   -- 通过日志可以看到,服务已经注册到zookeeper注册中心

             * zookeeper客户端节点查看

    2,客户端添加注册中心配置

           a,配置文件 -- dubbo.xml

                  -- 添加zookeeper注册中心

<!-- DUBBO注册中心 -->
    <dubbo:registry protocol="zookeeper" address="192.168.91.128:2181,192.168.91.129:2181,192.168.91.130:2181"/>

                  -- 接口引用取消URL属性,dubbo会自动从注册中心读取

<!-- 引用接口地址 -->
    <dubbo:reference id="gupaoHello" interface="com.gupao.dubbo.IDubboDemoService"/>

           b,客户端调用

public class demo {
    public static void main(String[] args) throws InterruptedException {
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("dubbo-master.xml");
        for (int i = 0; i < 10; i++) {
            IDubboDemoService service = (IDubboDemoService) context.getBean("gupaoHello");
            System.out.println(service.showMsg("DUBBO连接成功"));
            Thread.sleep(2000);
        }
    }
}

           c,结果分析

                   * 从日志中可以看到客户端请求通过zookeeper和dubbo连接到服务端的全过程

服务端集群下的dubbo协调通信

     1,服务端集群测试,是为了测试dubbo自身所提供的负载均衡机制;集群测试,只变更服务端服务为集群情况,客户端不变更

     2,服务端变更集群

            * 以多服务模拟集群下的多节点

public class DubboCluster1Service implements IDubboDemoService {
    @Override
    public String showMsg(String msg) {
        return "I'm cluster_1 service : " + msg;
    }
}
public class DubboCluster2Service implements IDubboDemoService {
    @Override
    public String showMsg(String msg) {
        return "I'm cluster_2 service : " + msg;
    }
}

           * 配置文件配置不同的端口号模拟集群机器

                  -- dubbo-cluster_1.xml

<!-- 协议名称 -->
    <dubbo:protocol name="dubbo" port="20880"/>

                  -- dubbo-cluster_2.xml

<!-- 协议名称 -->
    <dubbo:protocol name="dubbo" port="20881"/>

           * 分别启动两台服务

                -- 启动第一台

public class DubboClusterTest_1 {
    public static void main(String[] args) throws IOException {
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("dubbo-cluster-1.xml");
        context.start();
        System.in.read();
    }
}

 

                -- 启动第二台

public class DubboClusterTest_2 {
    public static void main(String[] args) throws IOException {
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("dubbo-cluster-2.xml");
        context.start();
        System.in.read();
    }
}

          * 查看zookeeper节点

    3,客户端代码不变,直接调用,查看结果

           -- 十次循环,类似于之前写到的通过随机数实现负载均衡,服务1和服务2各有分配执行

猜你喜欢

转载自blog.csdn.net/u011976388/article/details/81784760