搭建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的接口一樣,才能保證獲取服務
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章