怎么用Dubbo+Zookeeper+Spring实现Demo

发布时间:2021-07-05 14:59:14 作者:chen
来源:亿速云 阅读:204

这篇文章主要讲解了“怎么用Dubbo+Zookeeper+Spring实现Demo”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用Dubbo+Zookeeper+Spring实现Demo”吧!

一、Dubbo介绍

1、简介

  Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。 微服务使用最广泛的框架就是SpringCloud跟Dubbo。Dubbo比较专注于服务治理这块,而SpringCloud全家桶则提供了微服务的一整套解决方案

2、核心

3、功能

4、特点

Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,不管是Provider还是Consumer都可以通过Spring的配置文件进行配置,配置完之后,就可以像使用springbean一样进行服务暴露和调用了,完全看不到dubboapi的存在。Dubbo基于Spring的Schema扩展进行加载。

现在还可以通过 API 的方式进行调用。

5、组成:节点角色

6、架构图及角色之间调用关系

怎么用Dubbo+Zookeeper+Spring实现Demo

7、四大特性

<?xml version="1.0" encoding="UTF-8"?>

<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">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.test</groupId>
  <artifactId>dubbo_demo</artifactId>
  <version>1.0-SNAPSHOT</version>
  <modules>
    <module>dubbo_consumer</module>
    <module>dubbo_provider</module>
    <module>dubbo_api</module>
  </modules>
  <packaging>pom</packaging>

  <name>dubbo_demo Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.0.4.RELEASE</version>
    </dependency>

    <!-- 添加 日志依赖包 -->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.24</version>
    </dependency>

    <!-- 添加 dubbo 依赖包 -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>dubbo</artifactId>
      <version>2.6.3</version>
    </dependency>
    <!-- 添加 zookeeper 相关依赖包 -->
    <dependency>
      <groupId>org.apache.zookeeper</groupId>
      <artifactId>zookeeper</artifactId>
      <version>3.4.14</version>
    </dependency>

    <dependency>
      <groupId>org.apache.curator</groupId>
      <artifactId>curator-framework</artifactId>
      <version>2.8.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.curator</groupId>
      <artifactId>curator-recipes</artifactId>
      <version>2.8.0</version>
    </dependency>
    <!-- 添加 zkclient 依赖包 -->
    <dependency>
      <groupId>com.github.sgroschupf</groupId>
      <artifactId>zkclient</artifactId>
      <version>0.1</version>
    </dependency>

  </dependencies>

  <build>
    <finalName>dubbo_demo</finalName>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

    (2) 创建dubbo_api moudle,在项目中定义服务接口:该接口需单独打包,在服务提供方和消费方共享 在dubbo-api中定义服务接口DemoService,如下:

package com.test;

public interface DemoService {
    public String sayHello(String name);
}

    (3)创建dubbo_provider moudle,然后在dubbo_provider中实现上述接口。为什么这里能实现跨moudle调用接口并且完成接口实现,因为在provider的pom.xml文件中添加了dubbo_api作为依赖,故能引入上述接口。如图

怎么用Dubbo+Zookeeper+Spring实现Demo

        其中接口实现类DemoServiceImpl代码如下:

import com.test.DemoService;

public class DemoServiceImpl implements DemoService {


    public String sayHello(String name) {
        
        return "hello"+name;
    }
}

     同时在此moudle下写一个启动测试类,便于后面启动provider:

import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.io.IOException;

public class ProviderTest {
    public static void main(String[] args){
        ClassPathXmlApplicationContext applicationContext =
                new ClassPathXmlApplicationContext("classpath:dubbo-provider.xml");
        applicationContext.start();

        System.out.println("Dubbo provider start,启动服务提供..");

        try {
            System.in.read();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

    (4)创建dubbo_consumer moudle,然后在dubbo_consumer中写一个启动测试类,便于后面启动consumer调用provider提供的服务:

import com.test.DemoService;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.io.IOException;

public class ConsumerTest {
    public static void main(String[] args){
        ClassPathXmlApplicationContext applicationContext =
                new ClassPathXmlApplicationContext("classpath:dubbo-consumer.xml");
        applicationContext.start();

        DemoService demoService =
                (DemoService) applicationContext.getBean("ddemoService");

        System.out.println(demoService.sayHello(" guy"));

        try {
            System.in.read();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

    (5)上述代码写好后,好像各个moudle看起来好像没有联系?大家都好奇就是Dubbo是怎么实现服务的发布和远程调用的吧。接下来是重点,进行provider和consumer的配置

a. 在dubbo_provider的resource中新建dubbo_provider.xml文件,实现dubbo中provider的配置:

     首先完成应用配置,配置当前提供方应用名为dubbo_provider。

     然后完成注册中心配置,将Zookeeper作为注册中心,设定其地址。

    然后进行协议配置,用于配置提供服务的协议信息,协议只由provider指定,使用port="20880"作为服务提供的接口,供consumer调用。

     最后进行服务配置,用于暴露一个服务接口,其绝对路径interface="com.test.DemoService",代号为ref="demoService"

    这里还需要为接口实现类配置一个bean,以供在provider的启动测试类中调用bean中的方法。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

    <!-- 提供方应用信息,用于计算依赖关系 -->
    <dubbo:application name="dubbo_provider"  />

    <!-- 使用zookeeper注册中心暴露服务地址 -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181" />

    <!-- 用dubbo协议在20880端口暴露服务 -->
    <dubbo:protocol name="dubbo" port="20880" />

    <!-- 和本地bean一样实现服务 -->
    <bean id="demoService" class="DemoServiceImpl" />

    <!-- 声明需要暴露的服务接口 -->
    <dubbo:service interface="com.test.DemoService" ref="demoService" />

</beans>

b. 在dubbo_consumer的resource中新建dubbo_consumer.xml文件,实现dubbo中consumer的配置。

     首先完成应用配置,配置当前消费方应用名为dubbo_consumer;

     然后完成完成注册中心配置,将Zookeeper作为注册中心,设定其地址。消费方向注册中心订阅自己所需的服务;

    最后生成远程服务代理,调用到了绝对路径为interface="com.test.DemoService" 的接口,设定其代号为id="ddemoService",可以和本地bean一样使用ddemoService、

    (这里可能大家有个问题,为什么这里多了个d,因为为了和dubbo_provider.xml暴露的服务接口和bean做区别。说明消费方调用到此接口服务后,相当于自己的本地有了这个接口,所以接口名可以和provider的不一样。相当于我在别人那里拿了一个苹果,在我这里我就可以不叫他苹果,我叫他梨也可以,因为这个东西是在我手上(本地),我怎么用本地都清楚,不需要外人(provider)清楚)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

    <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
    <dubbo:application name="dubbo_consumer" />
        
    <!-- 使用zookeeper注册中心暴露发现服务地址 -->
    <dubbo:registry  protocol="zookeeper" address="zookeeper://127.0.0.1:2181" />
        
    <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
    <dubbo:reference id="ddemoService" interface="com.test.DemoService" />
        
</beans>

    (6)项目结构如下,具体可以在文末下载本项目demo。

怎么用Dubbo+Zookeeper+Spring实现Demo

3、测试结果

    依次启动zookeeper(打开bin文件下的zkServer.cmd,并且不要关闭。如果闪退的会可以用cmd调用文件名打开)、运行dubbo-provider、运行dubbo-consumer获得测试结果如下。

怎么用Dubbo+Zookeeper+Spring实现Demo

4、项目遇到的问题

     本项目遇到了一个比较奇葩的问题找了我一天,每次在运行provider和consumer的时候都会出现下述问题。

    问题:找不到Spring命名空间处理程序。

Offending resource: class path resource [dubbo-consumer.xml]; nested exception is org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://dubbo.apache.org/schema/dubbo]

Offending resource: class path resource [dubbo-consumer.xml]

    就是下图红框的两个地址有问题,可是这两个地址都是可以打开的。

怎么用Dubbo+Zookeeper+Spring实现Demo

    问题所在:最终发现之前有段时间dubbo被关闭了一段时间,那段时间dubbo的域名是code.alibabatech.com ,网上找到别人的案例里面配置的都是下面这种地址,结果发现这些地址都失效。按道理我现在程序里用最新的应该没错,为什么还会报错了。又只能继续到处找bug。

        http://code.alibabatech.com/schema/dubbo
        http://code.alibabatech.com/schema/dubbo/dubbo.xsd ">

怎么用Dubbo+Zookeeper+Spring实现Demo

    后来开始怀疑是不是我一开始用的版本比较旧(2.5.X);然后发现果然如此。问题在于: dubbo-config-spring-2.6.1.jar --> META-INF-->spring.handlers 中的配置还是之前的域名 code.alibabatech.com , 但是这个域名已经不可用了,所以用dubbo旧版本的需要注意下这个问题(参考https://blog.csdn.net/huweijun_2012/article/details/80239803)

怎么用Dubbo+Zookeeper+Spring实现Demo

     但是现在2.6.2以上都版本都不出现这个问题了,spring.handlers 中的配置还是之前的域名 包含旧的和新的域名,相当于可以兼容。但是由于code.alibabatech.com 域名已经不可用,所以解决办法只能是在pom.xml文件中修改dubbo的版本,使用至少2.6.2以上版本就不会出现此问题。

感谢各位的阅读,以上就是“怎么用Dubbo+Zookeeper+Spring实现Demo”的内容了,经过本文的学习后,相信大家对怎么用Dubbo+Zookeeper+Spring实现Demo这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

推荐阅读:
  1. storm的本地模式demo怎么实现
  2. Jpgraph使用demo

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

dubbo zookeeper spring

上一篇:Python中怎么读取文本文件的内容

下一篇:C++11中lambda表达式如何使用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》