springboot 集成 Dubbo + Zookeeper

此处废话不多说,直接上手实战,若需了解基础知识,点击主页查看其他知识文章!或滑倒最下,详看参考文献,直接跳转!!!

一、安装zookeeper,集成dubbo前置工作

由于之前已写过 zookeeper 安装部署手册文章,在此不再做重复工作,详细安装介绍请点击以下链接跳转!

windows安装 :https://blog.csdn.net/hbtstsxy/article/details/135484379

Linux安装(后续公布)

二、创建空项目并集成dubbo

2.1、创建一个空项目

idea 创建一个空项目,删除 src 目录,截图如下:

在这里插入图片描述
右键点击 dubbo-rabitmq 项目名字,选择 new -> module ,新增三个 Module 模块,分别分 common 公共模块 ,consume 消费者模块, produce 提供者模块,效果如下:(创建步骤soay,此处不在截图一一展示…省略…)

在这里插入图片描述

2.2、common 模块

pom.xml依赖如下:

<?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">
    <parent>
        <artifactId>dubbo-rabbitmq</artifactId>
        <groupId>com</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>common</artifactId>
    <name>common</name>

    <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>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>32.0.1-jre</version>
        </dependency>
    </dependencies>

</project>

创建一个实体类 VO,User,如下:

package com.entity;

import lombok.Builder;
import lombok.Data;

import java.io.Serializable;

/**
 * @author : gaogao
 * @version 1.0
 * @date : 2024-01-10 11:02
 */

@Data
@Builder
public class User implements Serializable {

    private static final long serialVersionUID = 766703992823945950L;

    private String id;

    private String name;

    private String phone;

    private String address;

    private String email;

    private String birthday;

}

创建一个接口,UserService,如下:

package com.service;

import com.entity.User;

import java.util.List;

/**
 * @author : gaogao
 * @version 1.0
 * @date : 2024-01-10 11:01
 */

public interface UserService {

    /**
     * 根据出生日期查询用户信息
     *
     * @param birthday 出生日期
     * @return List<User>
     */
    List<User> queryUserByBirthday(String birthday);

}

common 模块整体效果如下:

在这里插入图片描述

2.3、produce 模块

pom.xml 依赖文件:

<?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">
    <parent>
        <artifactId>spring-boot-starter-parent</artifactId>
        <groupId>org.springframework.boot</groupId>
        <version>2.7.14</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>produce</artifactId>
    <name>produce</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>


        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>32.0.1-jre</version>
        </dependency>
		
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-dependencies-zookeeper-curator5</artifactId>
            <version>3.2.8</version>
            <type>pom</type>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>3.2.8</version>
        </dependency>
        
		<!--这里引入common 公共模块的jar,主要完成service的实现类-->
        <dependency>
            <groupId>com</groupId>
            <artifactId>common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

    </dependencies>

</project>

我使用的 zk3.8.3 版本,dubbo 采用 3.0 ,固使用了 3.2.8版本的 pom

由于 Dubbo 使用 Curator 作为与 Zookeeper Server 交互的编程客户端,因此,要特别注意 Zookeeper Server Dubbo 版本依赖的 兼容性,版本对应关系如下:

在这里插入图片描述
application.yml 配置文件如下:

server:
  port: 8082


dubbo:
  protocol:
    # 端口号
    port: 21888
  registry:
    # 上边搭建的zk环境ip地址
    address: zookeeper://XXX.XXX.X.XX:2181
    # 超时时间
    timeout: 50000
  consumer:
    #关闭服务消费方所有服务的自动检查。dubbo缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止Spring初始化完成。
    check: false

编写 UserServiceImpl.java 实现 UserService 接口

/**
 * @author : gaogao
 * @version 1.0
 * @date : 2024-01-10 
 */
@Service
public class UserServiceImpl implements UserService {

    @Override
    public List<User> queryUserByBirthday(String birthday) {
        Map<String, List<User>> map = Produce.users.stream().collect(Collectors.groupingBy(User::getBirthday));
        return map.get(birthday);
    }

}

resources 目录下创建 spring 目录,用于存放 produce.xml 配置文件,暴露 Dubbo 接口。(此处仅列举暴漏一个 UserService 接口,若有其他接口,请自行添加 dubbo:service 标签添加)

<?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
       https://www.springframework.org/schema/context/spring-context.xsd">


    <context:property-placeholder location="classpath:application.yml"/>

    <dubbo:application name="produce"/>

    <dubbo:registry address="${dubbo.registry.address}" timeout="${dubbo.registry.timeout}"/>

    <dubbo:protocol name="dubbo" port="${dubbo.protocol.port}"/>

    <!--关闭服务消费方所有服务的启动检查。dubbo缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止Spring初始化完成。-->
    <dubbo:consumer check="${dubbo.consumer.check}"/>

    <dubbo:service interface="com.service.UserService" class="com.service.impl.UserServiceImpl"/>


</beans>

Produce.java,启动类配置如下,由于此项目未连接DB数据库,在项目启动时默认加载一些假数据,用来当作DB数据库。

@ImportResource(locations = "classpath:spring/produce.xml")
@SpringBootApplication
public class Produce {

    public static List<User> users = Lists.newArrayList();

    public static void main(String[] args) {
        SpringApplication.run(Produce.class, args);
    }

    @PostConstruct
    public void importData() {
        users.add(User.builder().id(getId()).name("gaogao1").phone("18888888888").address("北京市海淀区").email("AAAAAAAAA@qq.com").birthday("20230110").build());
        users.add(User.builder().id(getId()).name("gaogao2").phone("15088888888").address("北京市昌平区").email("BBBBBBBBB@qq.com").birthday("20230111").build());
        users.add(User.builder().id(getId()).name("gaogao3").phone("13888888888").address("北京市朝阳区").email("CCCCCCCCC@qq.com").birthday("20230110").build());
        users.add(User.builder().id(getId()).name("gaogao4").phone("15188888888").address("北京市房山区").email("DDDDDDDDD@qq.com").birthday("20230110").build());
        users.add(User.builder().id(getId()).name("gaogao5").phone("16888888888").address("北京市通州区").email("EEEEEEEEE@qq.com").birthday("20230112").build());
        users.add(User.builder().id(getId()).name("gaogao6").phone("18188888888").address("北京市西城区").email("FFFFFFFFF@qq.com").birthday("20230113").build());
        users.add(User.builder().id(getId()).name("gaogao7").phone("13488888888").address("北京市东城区").email("GGGGGGGGG@qq.com").birthday("20230114").build());
    }

    public String getId() {
        return UUID.randomUUID().toString().replaceAll("-", "");
    }
}

整体目录结构如下:

在这里插入图片描述

运行 produce 启动类:成功运行!

在这里插入图片描述

2.4、consume模块

pom.xml 依赖

<?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">
    <parent>
        <artifactId>spring-boot-starter-parent</artifactId>
        <groupId>org.springframework.boot</groupId>
        <version>2.7.14</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>consume</artifactId>
    <name>consume</name>

    <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>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>32.0.1-jre</version>
        </dependency>

        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-dependencies-zookeeper-curator5</artifactId>
            <version>3.2.8</version>
            <type>pom</type>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>3.2.8</version>
        </dependency>

        <dependency>
            <groupId>com</groupId>
            <artifactId>common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <!--导入配置文件处理器,配置文件进行绑定就会有提示-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

    </dependencies>

</project>

application.yml 配置文件如下:

server:
  port: 8083


dubbo:
  registry:
    address: zookeeper://XXX.XXX.X.XX:2181
    timeout: 50000
  consumer:
    #关闭服务消费方所有服务的自动检查。dubbo缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止Spring初始化完成。
    check: false

resources 目录下创建 spring 目录,用于存放 consume.xml 配置文件,消费 Dubbo 接口。(此处仅列举暴漏一个 UserService 接口,若有其他接口,请自行添加 dubbo:reference 标签添加)
配置文件如下:

<?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
       https://www.springframework.org/schema/context/spring-context.xsd">


    <context:property-placeholder location="classpath:application.yml"/>

    <dubbo:application name="consume"/>

    <dubbo:registry address="${dubbo.registry.address}" timeout="${dubbo.registry.timeout}"/>

    <!--关闭服务消费方所有服务的启动检查。dubbo缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止Spring初始化完成。-->
    <dubbo:consumer check="${dubbo.consumer.check}"/>

    <dubbo:reference id="userService" interface="com.service.UserService"/>

</beans>

Consume.java 启动类:

package com;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;

@ImportResource(locations = "classpath:spring/consume.xml")
@SpringBootApplication
public class Consume {

    public static void main(String[] args) {
        SpringApplication.run(Consume.class, args);
    }

}

此处为了方便测试,直接使用 web形式,调用接口测试,创建 UserControlle 如下:

package com.controller;

import com.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * @author : gaogao
 * @version 1.0
 * @date : 2024-01-10
 */

@Slf4j
@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping(value = "/queryUserByBirthday")
    public List queryUserByBirthday(String birthday) {

        return userService.queryUserByBirthday(birthday);
    }

}

启动 consume 启动类:
在这里插入图片描述

三、测试

由于上边已启动 produceconsumer 模块,现在就可以直接测试了。

浏览器输入以下地址,访问接口,进行测试:

http://localhost:8083/queryUserByBirthday?birthday=20230110

测试结果:
在这里插入图片描述

http://localhost:8083/queryUserByBirthday?birthday=20230111

在这里插入图片描述

接口验证完毕,集成成功。

四、总结

上述方式采用 xml 方式配置,后续发布 通过 dubbo 注解来实现功能,甚至 通过 api 方式集成,文档正在持续更新中。

高高只聊干货,不说废话…若觉得文章不错,请点个关注,在此谢谢。

主页中其他文章也不错呦,有兴趣可以点击查看呢~~~~,持续更新 java 相关文章…

文献参考:

dubbo官网地址

  • 25
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot集成DubboZookeeper非常简单,下面是详细的步骤: 1. 创建一个Spring Boot项目。 2. 在pom.xml文件中添加DubboZookeeper依赖: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.3</version> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.5.5</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency> ``` 3. 在application.properties文件中配置DubboZookeeper: ```properties # Dubbo配置 dubbo.application.name=dubbo-demo dubbo.registry.address=zookeeper://127.0.0.1:2181 dubbo.protocol.name=dubbo dubbo.protocol.port=20880 # Zookeeper配置 zookeeper.session.timeout=60000 zookeeper.connection.timeout=15000 zookeeper.retry.count=3 zookeeper.retry.interval=1000 zookeeper.namespace=dubbo ``` 4. 创建Dubbo服务接口和实现类: ```java public interface HelloService { String sayHello(String name); } @Service public class HelloServiceImpl implements HelloService { @Override public String sayHello(String name) { return "Hello, " + name + "!"; } } ``` 5. 在启动类上添加@EnableDubbo注解启用Dubbo: ```java @SpringBootApplication @EnableDubbo public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 6. 启动Zookeeper服务。 7. 运行Spring Boot应用程序,测试Dubbo服务是否正常工作。 以上就是在Spring Boot集成DubboZookeeper的步骤。如果您遇到任何问题,请随时问我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值