SpringBoot+Dubbo+Zookeeper Demo测试

Posted 尚墨1111

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot+Dubbo+Zookeeper Demo测试相关的知识,希望对你有一定的参考价值。

启动步骤:

  • 启动 zookeeper 的 zkServicer.cmd 服务
  • 进入dubbo下的 dubbo-admin-distribution/target 文件夹,启动cmd
  • 输入 java -jar dubbo-admin-0.3.0-SNAPSHOT.jar
  • 访问 http://localhost:8080

详情参考:dubbo admin

1、创建一个空的项目

2、在项目中创建三个 maven module:common、provider、consumer

注意:实体类必须实现 Serializable 接口

3、在common中创建需要的公共类,完成之后,执行maven的install,将common打包并部署到本地maven仓库

注意:如果更新了common包中的代码,只需要重新 install,便会自动更新

4、编写provider中的代码

  • 先导入相关的依赖
<!--将common的jar包导入provider的maven中,方便引用-->
<dependency>
    <groupId>com.test.SDZ</groupId>
    <artifactId>mall-common</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

<!--将服务注册到注册中心,需要导入dubbo依赖-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dubbo</artifactId>
    <version>2.6.2</version>
</dependency>

<!-- 导入操作注册中心zookeeper的客户端 -->
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-framework</artifactId>
    <version>2.12.0</version>
</dependency>
  • 编写xml文件,将服务注册到zookeeper中
<?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="mall-Provider"></dubbo:application>
    <!--    指定注册中心的地址-->
    <dubbo:registry address="zookeeper://127.0.0.1:2181" protocol="zookeeper" timeout="20000" />
    <!--    使用dubbo协议,将服务暴露在20880端口-->
    <dubbo:protocol name="dubbo" port="20880"/>
    <!--    指定需要暴露的服务-->
    <dubbo:service interface="service.UserService" ref="userService"/>
    <bean name="userService" class="service.UserServiceImpl"></bean>
</beans>
  • 编写测试类,实际注册服务上去
public class Provider {
    public static void main(String[] args) throws IOException {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
                "provider.xml");
        context.start();//启动服务
        System.in.read();//阻塞
    }
}
//运行之后就能在admin中看到服务被注册了

5、编写consumer中的代码

  • 先导入相关依赖
<?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.SDZ</groupId>
    <artifactId>mall-consumer</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>com.test.SDZ</groupId>
            <artifactId>mall-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!--将服务注册到注册中心,需要导入dubbo依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.6.2</version>
        </dependency>

        <!-- 导入操作注册中心zookeeper的客户端 -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>2.12.0</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.25</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
</project>
  • 编写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:context="http://www.springframework.org/schema/context"
       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
                           http://www.springframework.org/schema/context
                  http://www.springframework.org/schema/context/spring-context-4.2.xsd">

    <!--    为了使注解生效,所以需要开启包扫描-->
    <context:component-scan base-package="service.Impl"></context:component-scan>

    <!--设置应用名称-->
    <dubbo:application name="mall-Consumer"></dubbo:application>
    <!-- 指定注册中心地址   -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
    <!--生成远程服务UserService的代理,可以和本地一样调用service-->
    <!--    userService在容器里面,所以可以直接用spring注解注入-->
    <dubbo:reference interface="service.UserService" id="userService" ></dubbo:reference>

    <bean name="orderService" class="service.Impl.OrderServiceImpl"></bean>
</beans>
  • 编写实现类
  • 编写测试类
package Consumer;

import org.springframework.context.support.ClassPathXmlApplicationContext;
import service.OrderService;

import java.io.IOException;

/**
 * @author:liuliping
 * @date:2021/7/28 13:53
 */
public class consumer {
    public static void main(String[] args) throws IOException {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
                "consumer.xml");
        OrderService orderService = context.getBean(OrderService.class);
        //实现输出结果,说明远程调用实现
        orderService.initOrder("1");
        System.out.println("调用完成.....");
        System.in.read();
    }
}

6、可能出现的问题

  • 报错序列化,被传输的实体类必须实现 Serializable 接口
  • 提示bean不存在,说明无法调用注册的服务,重新打开zookeeper、admin、注册服务。再试。

SpringBoot+Dubbo+zookeeper服务注册发现实战

参考:https://www.cnblogs.com/ckfuture/p/14401670.html

1、创建一个空的项目

2、创建 spring initial 项目勾选 web 结构 的 provider和 consumer两个模块

3、provider模块

  • 编写提供者服务,TicketService
  • 实现service
  • 导入依赖
<!--		dubbo的依赖-->
<!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter -->
<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>2.7.3</version>
</dependency>

<!--		zookeeper的依赖-->
<!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient -->
<dependency>
    <groupId>com.github.sgroschupf</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.1</version>
</dependency>

<!--日志会冲突-->
<!--引入zookeeper-->
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-framework</artifactId>
    <version>2.12.0</version>
</dependency>
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-recipes</artifactId>
    <version>2.12.0</version>
</dependency>
<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.4.14</version>
    <!--排除这个slf4j-log4j12-->
    <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </exclusion>
    </exclusions>
</dependency>
  • 配置application.properties
server.port=8001
#服务应用名字
dubbo.application.name=provider-server
#注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#哪些服务要被注册
dubbo.scan.base-packages=com.sommer.demo.service

4、打开 zkService.cmd、zkCli.cmd、启动dubbo.admin

5、运行 provider的启动类,在admin中可以看到注册的服务

6、consumer模块中

  • 设置service类,UserService,获取ticket
  @Service//将服务注册Bean容器中
  public class UserService {
      @Reference//表示使用注册中的服务,但是在本地会报错,所以在相同的路径下,要新建一样的接口
      TicketService ticketService;
  
      public void buyTicket(){
          String ticket = ticketService.getTicket();
          System.out.println("在注册中心拿到一张票"+ticket);
      }
  }
  • 导入依赖
  • 配置 application.properties
server.port=8002

#消费者去哪里获取服务,需要暴露自己的名字,
# 否则注册中心不知道谁要服务
dubbo.application.name=consumer-server
#注册中心的地址
dubbo.registry.address=zookeeper://127.0.0.1:2181

总结:

步骤:

前提:zookeeper服务要开启

1.提供者提供服务

1).导入依赖

2).配置注册中心的地址,以及服务发现名,和要扫描的包

3).在想要被注册的服务上面增加一个注解@Service

2.消费者如何消费

1).导入依赖

2).配置注册中心的地址,配置自己的服务名

3).从远程注入服务 @Reference

以上是关于SpringBoot+Dubbo+Zookeeper Demo测试的主要内容,如果未能解决你的问题,请参考以下文章

dubbo-admin的安装

短信平台README.MD

Dubbo源码学习系列 整合zookeeper注册中心并提供watcher机制

Springboot 整合 Dubbo/ZooKeeper

io.dubbo.springboot版本不兼容dubbo-2.5.3

ali的dubbo与springboot