通俗易懂的 Dubbo 教程(二):Dubbo 與 Spring Boot 的整合

準備

首先我們需要搭建 Dubbo 的註冊中心 zookeeper 環境以及搭建好 Dubbo 管理平臺 dubbo-admin,由於這個不是本文的重點,在這裏直接略過,需要了解細節的讀者可以查閱相關資料。

搭建項目

我們創建一個項目名爲 dubbo-test 的 Spring Boot 項目,然後在項目中新建三個模塊,分別如下:

  1. api:接口層,存放提供者與消費者調用的接口
  2. producer:提供者,用於向消費者提供接口實現
  3. consumer:消費者,調用提供者遠程提供的接口實現

項目目錄如下:
在這裏插入圖片描述

api 模塊的實現

我們在 api 模塊中定義一個接口,該接口用於修改名稱。

package edu.szu.api.service;

/**
 * 修改名稱的接口
 */
public interface NameService {
    String updateName(String name);
}

producer 模塊的實現

首先我們在 producer 模塊中得引入相關的依賴 dubbo-spring-boot-starter 以及上面實現的 api 模塊,其 pom 文件實現如下:

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>edu.szu</groupId>
    <artifactId>producer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>producer</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- 引入api模塊 -->
        <dependency>
            <groupId>edu.szu</groupId>
            <artifactId>api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <!-- 引入dubbo環境 -->
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>0.2.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

接下來我們需要編寫 api 模塊定義的 NameService 接口的實現,需要注意的是,在實現類上我們需要加上 @com.alibaba.dubbo.config.annotation.Service 的註解。

package edu.szu.producer.serviceImpl;

import com.alibaba.dubbo.config.annotation.Service;
import edu.szu.api.service.NameService;
import org.springframework.stereotype.Component;

@Component
@Service
public class NameServiceImpl implements NameService {

    @Override
    public String updateName(String name) {
        return "修改後的名稱:" + name;
    }
}

然後在啓動類上添加 @EnableDubbo 註解表示開啓 Dubbo 服務

package edu.szu.producer;

import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EnableDubbo
public class ProducerApplication {

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

}

最後修改一下配置文件,其實配置文件的註釋已經非常詳細了,所以在這裏就不過多介紹每個配置的具體含義了。

server.port=8080
#提供方應用信息,用於計算依賴關係
dubbo.application.name=producer
#註冊中心地址
dubbo.registry.address=127.0.0.1:2181
#使用zookeeper作爲註冊中心
dubbo.registry.protocol=zookeeper
#使用dubbo協議
dubbo.protocol.name=dubbo
#使用dubbo協議在20880端口暴露服務
dubbo.protocol.port=20880

consumer 模塊的實現

首先引入相關的依賴 dubbo-spring-boot-starter 以及 api 模塊,pom 文件如下:

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>edu.szu</groupId>
    <artifactId>consumer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>consumer</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </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-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- 引入api模塊 -->
        <dependency>
            <groupId>edu.szu</groupId>
            <artifactId>api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <!-- 引入dubbo環境 -->
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>0.2.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

然後我們定義相關的,在消費者中實現的接口

package edu.szu.consumer.service;

public interface ChangeService {
    String change(String name);
}

然後提供接口的一個實現,在這裏我們調用遠程服務 nameService,需要注意的是我們在調用的遠程服務接口上需要加上一個 @Reference 註解。

package edu.szu.consumer.serviceImpl;

import com.alibaba.dubbo.config.annotation.Reference;
import edu.szu.api.service.NameService;
import edu.szu.consumer.service.ChangeService;
import org.springframework.stereotype.Component;

@Component
public class ChangeServiceImpl implements ChangeService {

    @Reference
    NameService nameService;

    @Override
    public String change(String name) {
        return nameService.updateName(name);
    }
}

然後我們簡單實現一下控制層

package edu.szu.consumer.controller;

import edu.szu.consumer.service.ChangeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ChangeController {

    @Autowired
    private ChangeService changeService;

    @RequestMapping("/change/{name}")
    public String change(@PathVariable("name") String name) {
        return changeService.change(name);
    }

}

然後在啓動類上添加 @EnableDubbo 註解表示開啓 Dubbo 服務

package edu.szu.consumer;

import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EnableDubbo
public class ConsumerApplication {

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

}

最後修改一下配置文件

server.port=8081
#提供方應用信息,用於計算依賴關係
dubbo.application.name=consumer
#註冊中心地址
dubbo.registry.address=127.0.0.1:2181
#使用zookeeper作爲註冊中心
dubbo.registry.protocol=zookeeper

測試

我們打開 Dubbo 的註冊中心 zookeeper,然後分別啓動 producer 和 consumer,在瀏覽器上輸入 http://localhost:8081/change/HelloDubbo ,發現顯示如下:
在這裏插入圖片描述
說明了消費者確實成功遠程調用了提供者提供的服務。

然後我們再啓動 dubbo-admin,其顯示如下:
在這裏插入圖片描述
dubbo-admin 已成功監控到我們的提供者與消費者,同時表示我們的 Dubbo 與 Spring Boot 整合成功。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章