搭建springboot+dubbo+zookeeper的分布式demo就是这么简单

一、架子搭建

环境:

本地:springboot-2.2.6 + jdk1.8 + dubbo-2.7.3
服务器: docker + zookeeper:latest

我们先新建一个空项目,然后分别引入

  • api
  • customer
  • provider

三个模块,以下,贴出api模块构建过程:
1、新建空项目
在这里插入图片描述
在这里插入图片描述
2、创建api模块
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们默认先引入web依赖
在这里插入图片描述
3、创建customerprovider模块,过程同上,结构图如下:
在这里插入图片描述

二、依赖引入

api模块依赖不动,provider——>pom.xml:加入以下内容

<!--导入公共接口模块-->
        <dependency>
            <groupId>com.test</groupId>
            <artifactId>api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.3</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.7.3</version>
        </dependency>

        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>4.0.1</version>
        </dependency>

        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>2.8.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.13</version>
            <type>pom</type>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.10</version>
        </dependency>

customer——>pom.xml添加同上

三、properties配置

同样的api不用动,customer模块的配置如下:

#dubbo configuration
dubbo.application.name=consumer
dubbo.registry.protocol=zookeeper
dubbo.registry.address=zookeeper://你的ip:2181

# provider使用8080
server.port=8081

provider模块:

dubbo.application.name=provider-ticket
dubbo.registry.address=zookeeper://你的ip:2181
dubbo.registry.protocol=zookeeper
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
# 自动扫描
dubbo.scan.base-packages=com.test.provider.service

四、编写测试

1、api编写服务接口

package com.test.api.service;

/**
 * 公共接口
 */
public interface TicketService {
    public String getTicket();
}

2、provider编写服务接口实现类

package com.test.provider.service;

import com.alibaba.dubbo.config.annotation.Service;
import com.test.api.service.TicketService;
import org.springframework.stereotype.Component;

@Component
@Service(version = "1.0.0" ,interfaceClass = TicketService.class) // 将服务暴露
public class TicketServiceImpl implements TicketService{

    @Override
    public String getTicket() {
        return "厉害了,我的国";
    }
}
// 注意:@Service注解的import不是平时spring用的那个

3、customer获取注册的服务,并使用

package com.test.customer.controller;

import com.test.api.service.TicketService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    // 获取服务
    @Reference(version = "1.0.0")
    private TicketService ticketService;

    @GetMapping("/ticket")
    public String hello(){
        String ticket = ticketService.getTicket();
        System.out.println("买到票了" + ticket);
        return "success";
    }
}

4、进行测试

  • 将provider的主类运行起来,然后运行customer的主类:
    在这里插入图片描述
    在这里插入图片描述
  • 在本地浏览器上输入:http://localhost:8081/ticket,显示如下:
    在这里插入图片描述
    同时查看控制台打印:
    在这里插入图片描述

五、踩坑

  • 博主用的是阿里云的服务器,需要添加zookeeper使用端口进安全组,这样本机才能访问,不然一直报连接超时,如果你用的虚拟机,需要打开此接口,直接点关闭防火墙
  • zkclientcurator因为dubbo版本原因可能有些不一样,我没太细看,干脆全部加上
  • 如果不想加一个api模块,那就将接口和实现类写在一起,但是这样的话,比较麻烦,还需要将接口写在customer里面,而且路径名称等必须和provider的接口一样,才能保证获取服务
原创文章 50 获赞 101 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_42173451/article/details/105420678