1. 程式人生 > >SpringBoot整合dubbo詳解(阿里官方dubbo-spring-boot-starter)

SpringBoot整合dubbo詳解(阿里官方dubbo-spring-boot-starter)

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

Dubbo 的RPC 呼叫流程主要涉及到4個模組:

1、Registry:服務註冊,我們一般會採取Zookeeper 作為我們的註冊中心

2、Provider:服務提供者(生產者),提供具體的服務實現

3、Consumer:消費者,從註冊中心中訂閱服務

4、Monitor:監控中心,RPC呼叫次數和呼叫時間監控

從上圖中我們可以看出RPC 服務呼叫的過程主要為:

1、生產者釋出服務到服務註冊中心

2、消費者在服務註冊中心中訂閱服務

3、消費者呼叫已註冊的服務

下面筆者給大家講解在IDEA環境下如何實現將SpringBoot與Dubbo整合。

專案結構如圖:

先來看common下的pom檔案:


<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.boot.dubbo</groupId>
  <artifactId>common</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>

  <name>common</name>
  <url>http://maven.apache.org</url>

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.4.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>

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

  <dependencies>
    <!--dubbo-springBoot依賴-->
    <dependency>
      <groupId>com.alibaba.spring.boot</groupId>
      <artifactId>dubbo-spring-boot-starter</artifactId>
      <version>1.0.1</version>
    </dependency>
    <!--zookeeper依賴-->
    <dependency>
      <groupId>org.apache.zookeeper</groupId>
      <artifactId>zookeeper</artifactId>
      <version>3.4.11</version>
    </dependency>
    <dependency>
      <groupId>com.101tec</groupId>
      <artifactId>zkclient</artifactId>
      <version>0.10</version>
    </dependency>
  </dependencies>
  <modules>
    <module>api</module>
    <module>provider</module>
    <module>consumer</module>
  </modules>
</project>

由上圖可以看出公共pom主要引入了: SpringBoot依賴,dubbo-springBoot依賴,zookeeper依賴,zkClient依賴等。

下面筆者將逐個講解各個模組:

一、 provider(服務提供者)

pom檔案如下:

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.boot.dubbo</groupId>
    <artifactId>common</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>provider</artifactId>
  <name>provider</name>
  <url>http://maven.apache.org</url>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
  </dependencies>
</project>

因為筆者將provider作為web形式啟動,所以僅需要引入spring-boot-starter-web即可。

專案結構:

src/main/resources/application.yml配置如下:

server:
  port: 8081
spring:
  dubbo:
    appname: provider
    registry: zookeeper://127.0.0.1:2181
    protocol: dubbo
    port: 20880

介面定義IBookService.java程式碼如下:

package com.boot.dubbo.service;

public interface IBookService {
    String sayHello();
}

介面實現BookServiceImpl.java程式碼如下:

package com.boot.dubbo.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.boot.dubbo.service.IBookService;

@Service
@org.springframework.stereotype.Service
public class BookServiceImpl implements IBookService {

    @Override
    public String sayHello() {
        return "Hello World";
    }

}

注意該類有兩個service註解,一個是alibaba的,一個是spring的,大家要注意區分。

Application.java程式碼如下:

package com.boot.dubbo;

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

import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;


@SpringBootApplication
@EnableDubboConfiguration
public class Application {
    public static void main( String[] args ){
        SpringApplication.run(Application.class, args);
    }
}

springBoot啟動加入了@EnableDubboConfiguration,表示啟動dubbo配置。

注意,在本地測試之前,必須先下載zookeeper在本地,然後啟動zookeeper,然後執行provider模組,使服務註冊到zookeeper!

二、consumer(服務消費者)

pom檔案如下:

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.boot.dubbo</groupId>
        <artifactId>common</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>consumer</artifactId>
    <name>consumer</name>
    <url>http://maven.apache.org</url>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
    </dependencies>
</project>

consumer沒有引入任何依賴,因為該模組只有介面定義,沒有實現。

結構如下:

三、api(測試介面)

pom檔案如下:

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.boot.dubbo</groupId>
        <artifactId>common</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>api</artifactId>
    <name>api</name>
    <url>http://maven.apache.org</url>
    <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>com.boot.dubbo</groupId>
            <artifactId>consumer</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>

api只需要引入consumer模組(只有介面定義,沒有實現,沒有application.yml)即可。

專案結構如下:

src/main/resources/application.yml配置如下:

spring:
  dubbo:
    appname: consumer
    registry: zookeeper://127.0.0.1:2181
    protocol: dubbo
    port: 20880

DubboController.java程式碼如下:

package com.boot.dubbo.api.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import com.alibaba.dubbo.config.annotation.Reference;
import com.boot.dubbo.service.IBookService;

@RestController
public class DubboController {

    @Reference
    IBookService bookService;

    @GetMapping("test")
    public String testDubbo() {
        return bookService.sayHello();
    }
}

在呼叫consumer模組定義的service的時候,必須要加入@Reference註解。

Application.java程式碼如下:

package com.boot.dubbo.api;

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

import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;

@SpringBootApplication
@EnableDubboConfiguration
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

@EnableDubboConfiguration表示啟動dubbo配置。

下面開始進行測試(必須先將本地zookeeper啟動):

1、首先將provider模組啟動:

2、啟動api:

3、訪問: http://localhost:8080/test

可以看到"Hello World",說明呼叫service成功!

掃一掃關注筆者的公眾號,每天都有乾貨分享,你還在等什麼