1. 程式人生 > >SpringBoot 整合Dubbo構建分散式服務

SpringBoot 整合Dubbo構建分散式服務

SpringBoot Dubbo 實踐 概述:

Dubbo是Alibaba開源的分散式服務框架,它最大的特點是按照分層的方式來架構,使用這種方式可以使各個層之間解耦合(或者最大限度地鬆耦合)。從服務模型的角度來看,Dubbo採用的是一種非常簡單的模型,要麼是提供方提供服務,要麼是消費方消費服務,所以基於這一點可以抽象出服務提供方(Provider)和服務消費方(Consumer)兩個角色。

專案構建

注:專案構建通過: http://start.spring.io/ 快速構建web 專案,
具體操作可以參考《SpringBoot使用SpringDataJPA完成資料查詢 -Demo》

在基礎環境確定好了之後,我們專案的目錄結構如下:

**上圖所示,我們專案主要分為了兩個模組,

    一部分是生產者:hdd-doorplate-dubbo-server ,

    一部分是消費者:hdd-doorplate-dubbo-client。

hdd

父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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.herbert.hdd</groupId>
    <artifactId>hdd</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <!-- 引入專案子模組 -->
    <modules>
        <module>hdd-doorplate-dubbo-server</module>
        <module>hdd-doorplate-dubbo-client</module>
    </modules>
</project>

配置檔案

   由於我們底層使用的是Spring-Boot 進行開發,那麼我們就應該善於利用Spring-Boot 給我們帶來的優勢,因此我們可以直接在Application.properties 檔案中配置Dubbo 服務:

server.port=6660
## Dubbo 服務提供者配置
spring.dubbo.application.name=provider
spring.dubbo.registry.address=zookeeper://127.0.0.1:2182
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880
spring.dubbo.scan=com.herbert.hdd.doorplate.dubbo

服務提供

  在服務提供主要包括兩部分,一個是暴露服務,一個是服務實現
  暴露服務:即我們平常開發中所使用的的介面,這裡我們建立一個 DoorplateServer 的介面,主要包括操作資訊的方法。

package com.herbret.hdd.doorplate.dubbo;

import java.util.List;

/**
 * Created by Herbert on 2018/11/7.
 *
 * 程式業務 Dubbo 服務層
 *
 */

public interface DoorplateServer {

    /**
     *  查詢資訊
     * @return
     */
    List<String> list();

}

服務實現:

服務實現,與我們平常的服務一樣,對介面進行實現,比較特別的是,我們這裡需要使用到Dubbo 的 @Service 註解

package com.herbert.hdd.doorplate.dubbo.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.herbert.hdd.doorplate.dubbo.DoorplateServer;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Herbert on 2018/11/7.
 */

// 註冊為 Dubbo 服務
@Service(version = "1.0.0")
public class DoorplateServerImpl implements DoorplateServer {
    @Override
    public List<String> list() {
        List<String> list = new ArrayList<String>();
        list.add("城市中心運動公園");
        return list;
    }
}

hdd-doorplate-dubbo-server

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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.herbert.hdd</groupId>
    <artifactId>hdd-doorplate-dubbo-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <name>hdd-doorplate-dubbo-server</name>
    <description>Doorplate project for Spring Boot</description>


    <!-- Spring Boot 啟動父依賴 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.1.RELEASE</version>
    </parent>

    <!-- 集中定義版本號 -->
    <properties>
        <dubbo-spring-boot>1.0.0</dubbo-spring-boot>
    </properties>

    <dependencies>

        <!-- Spring Boot Dubbo 依賴 -->
        <dependency>
            <groupId>io.dubbo.springboot</groupId>
            <artifactId>spring-boot-starter-dubbo</artifactId>
            <version>${dubbo-spring-boot}</version>
        </dependency>

        <!-- Spring Boot Web 依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- Spring Boot Test 依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- Junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>

</project>

hdd-doorplate-dubbo-client

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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.herbert.hdd</groupId>
    <artifactId>hdd-doorplate-dubbo-client</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <name>hdd-doorplate-dubbo-server</name>
    <description>Doorplate project for Spring Boot</description>


    <!-- Spring Boot 啟動父依賴 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.1.RELEASE</version>
    </parent>

    <!-- 集中定義版本號 -->
    <properties>
        <dubbo-spring-boot>1.0.0</dubbo-spring-boot>
    </properties>

    <dependencies>

        <!-- Spring Boot Dubbo 依賴 -->
        <dependency>
            <groupId>io.dubbo.springboot</groupId>
            <artifactId>spring-boot-starter-dubbo</artifactId>
            <version>${dubbo-spring-boot}</version>
        </dependency>

        <!-- Spring Boot Web 依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- Spring Boot Test 依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- Junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>

</project>

配置檔案

配置檔案與生產者稍有區別:

## 避免和 server 工程埠衝突
server.port=6661

## Dubbo 服務消費者配置
spring.dubbo.application.name=consumer
spring.dubbo.registry.address=zookeeper://127.0.0.1:2182
spring.dubbo.scan=com.herbert.hdd.doorplate.dubbo

服務實現

在這裡,如果我們需要呼叫註冊服務中的相關服務,則需要實現相關的介面。

package com.herbert.hdd.doorplate.dubbo;

import java.util.List;

/**
 * Created by Herbert on 2018/11/7.
 */
public interface DoorplateServer {

    List<String> list();
}

服務呼叫

我們需要實現一個RESTful 介面,提供給使用者呼叫:

package com.herbert.hdd.doorplate.dubbo.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.herbert.hdd.doorplate.dubbo.DoorplateServer;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;


/**
 * Created by Herbert on 2018/11/7.
 */
@RestController
@RequestMapping("/user")
public class DoorpalteController {

    @Reference(version = "1.0.0")
    DoorplateServer doorplateServer;

    @RequestMapping("/list")
    public List<String> list(){
        List<String> list =doorplateServer.list();
        System.out.println(list.toString());
        return list;
    }
}

另外,我們還可以在需要使用到生產者中的方法,則需要建立一個介面,然後再呼叫時,使用 @Reference 註解進行引用也可以直接引用

測試

我們啟動hdd-doorplate-dubbo-server 來註冊服務,前提是已經啟動ZooKeeper註冊中心

啟動hdd-doorplate-dubbo-server

package com.herbert.hdd;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

// Spring Boot 應用的標識

@SpringBootApplication
public class HddDoorplateDubboProviderApplication {

    public static void main(String[] args) {
        // 程式啟動入口
        // 啟動嵌入式的 Tomcat 並初始化 Spring 環境及其各 Spring 元件
        SpringApplication.run(HddDoorplateDubboProviderApplication.class, args);
    }
}

啟動完成

啟動hdd-doorplate-dubbo-client

package com.herbert.hdd;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class HddDoorplateDubboClientApplication {

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

啟動完成

 

介面訪問

http://127.0.0.1:6661/user/list

返回值

["城市中心運動公園"]

歡迎關注公眾號