Spring Boot整合Dubbo2.x,解決其中遇到的坑

Dubbo瞭解

a high-performance, java based open source RPC framework.html

Dubbo官網 源碼 文檔java

快速知道用法

本地服務 Spring 配置

local.xml:git

<bean id=「xxxService」 class=「com.xxx.XxxServiceImpl」 />
<bean id=「xxxAction」 class=「com.xxx.XxxAction」>
    <property name=「xxxService」 ref=「xxxService」 />
</bean>

遠程服務 Spring 配置

在本地服務的基礎上,只需作簡單配置,便可完成遠程化:github

  • 將上面的 local.xml 配置拆分紅兩份,將服務定義部分放在服務提供方 remote-provider.xml,將服務引用部分放在服務消費方 remote-consumer.xml
  • 並在提供方增長暴露服務配置 <dubbo:service>,在消費方增長引用服務配置 <dubbo:reference>

remote-provider.xml:web

<!-- 和本地服務同樣實現遠程服務 -->
<bean id=「xxxService」 class=「com.xxx.XxxServiceImpl」 /> 
<!-- 增長暴露遠程服務配置 -->
<dubbo:service interface=「com.xxx.XxxService」 ref=「xxxService」 />

remote-consumer.xml:spring

<!-- 增長引用遠程服務配置 -->
<dubbo:reference id=「xxxService」 interface=「com.xxx.XxxService」 />
<!-- 和本地服務同樣使用遠程服務 -->
<bean id=「xxxAction」 class=「com.xxx.XxxAction」> 
    <property name=「xxxService」 ref=「xxxService」 />
</bean>

Spring Boot中使用Dubbo

阿里官方demoapache

dubbo-spring-boot-projectapi

Dubbo Spring Boot (v0.1.0) : https://github.com/dubbo/dubbo-spring-boot-project
Dubbo (v2.0.1) : https://github.com/alibaba/dubbo
Google group : http://groups.google.com/group/dubbo安全

下面就給出一個完整整合案例,適合入門級別

官方給出的一些案例:dubbo-spring-boot-samplesspringboot

項目模塊

1.配置服務提供者

將服務提供者註冊到註冊中心
1. 引入dubbo和zkclient組件依賴
2. 配置dubbo的掃描包和註冊中心的地址
3. 使用@Service發佈服務

  1. pom.xml文件中添加須要的依賴
<!-- springboot整合dubbo的start包 -->
        <dependency>
            <groupId>com.alibaba.spring.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.0.0</version>
        </dependency>
        <!-- zookeeper相關的包 -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.12</version>
        </dependency>
        <!-- 客戶端鏈接zookeeper所需的包 引入ZooKeeper客戶端工具 -->
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.9</version>
        </dependency>
  1. 公共接口,及其實現類

TicketService 接口

package com.gqz.ticket.service;

/** * @ClassName: TicketService * @author: ganquanzhong * @date: 2019/10/30 9:40 */
public interface TicketService {

    /** dubbo中的公共api * 獲取票 */
    public String getTicket(String name);
}

TicketServiceImpl實現類

package com.gqz.ticket.service;

import com.alibaba.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;

/** * @ClassName: TicketServiceImpl * @author: ganquanzhong * @date: 2019/10/30 9:43 */


@Component
@Service(version = "1.0.0")  //Dubbo的註解,將服務發佈出去
public class TicketServiceImpl implements TicketService {

    @Override
    public String getTicket(String name) {
        return name+"成功訂購《銀河補習班》電影票";
    }
}
  1. Spring Boot應用啓動類

ProviderTicketApplication

package com.gqz.ticket;

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

/** * 一、 將服務提供者註冊到註冊中心 * 1.引入dubbo和zkclient組件依賴 * 2.配置dubbo的掃描包和註冊中心的地址 * 3.使用@Service發佈服務 */

@EnableDubbo()
@DubboComponentScan()
@SpringBootApplication
public class ProviderTicketApplication {

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

}
  1. application.properties 配置
    主要配置PRC框架和註冊中心
#dubbo服務名稱
dubbo.application.name =provider-ticket
# Base packages to scan Dubbo Component: @org.apache.dubbo.config.annotation.Service
dubbo.scan.base-packages = com.gqz.ticket.service

# Dubbo Application
## The default value of dubbo.application.name is ${spring.application.name}
## dubbo.application.name=${spring.application.name}

# Dubbo Protocol
# 通信規則dubbo,hession...
dubbo.protocol.name=dubbo
#dubbo服務端口,咱們無需知道dubbo服務運行在哪一個端口,故也將其設爲隨機端口
dubbo.protocol.port=12345

## Dubbo Registry
#註冊中心地址, 若是搭建是集羣,因此用逗號分開 192.168.1.112:2181,192.168.1.112:2182,192.168.1.112:2183
dubbo.registry.protocol=zookeeper
dubbo.registry.address=192.168.1.112:2181

到這裏,服務提供者就配置完成了,能夠啓動應用將服務發佈到註冊中

2.配置服務調用者

調用註冊中的服務,完成本身的業務
1.引入依賴Dubbo和zkClient
2.配置dubbo的註冊中心地址
3.引用服務

  1. pom.xml文件中添加須要的依賴
<!-- springboot整合dubbo的start包 -->
        <dependency>
            <groupId>com.alibaba.spring.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.0.0</version>
        </dependency>
        <!-- zookeeper相關的包 -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.12</version>
        </dependency>
        <!-- 客戶端鏈接zookeeper所需的包 引入ZooKeeper客戶端工具 -->
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.9</version>
        </dependency>
  1. 公共接口(須要和服務提供者的路徑相同),自身的業務
    在這裏插入圖片描述

TicketService公共接口

package com.gqz.ticket.service;

/** * @ClassName: TicketService * @author: ganquanzhong * @date: 2019/10/30 9:40 */
public interface TicketService {

    /** dubbo中的公共api * 獲取票 */
    public String getTicket(String name);
}

UserService自身的業務,調用遠程ticketService服務

package com.gqz.user.service;

import com.alibaba.dubbo.config.annotation.Reference;
import com.gqz.ticket.service.TicketService;
import org.springframework.stereotype.Service;

/** * 調用遠程RPC Remote Procedure Call * 調用com.gqz.ticket.service.TicketService中的服務 * * @ClassName: UserService * @author: ganquanzhong * @date: 2019/10/30 9:48 */

@Service
public class UserService {

    /** * @Reference註解 經過 @Reference 注入TicketService * 是經過全類名引用 */
    @Reference(version = "1.0.0", url = "dubbo://127.0.0.1:12345")
    TicketService ticketService;

    //調用遠程接口的服務
    public void orderTicket(String name){
        System.out.println(ticketService.getTicket(name));
    }

}
  1. properties配置
# 配置Dubbo
#dubbo服務名稱
dubbo.application.name =consumer-user

#通信規則
dubbo.protocol.name=dubbo

#註冊中心地址
dubbo.registry.protocol=zookeeper
dubbo.registry.address=192.168.1.112:2181
  1. 測試Test

ConsumerUserApplicationTests測試

package com.gqz.user;

import com.gqz.user.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class ConsumerUserApplicationTests {

    @Autowired
    UserService userService;

    @Test
    void testRPC() {
        System.out.println("調用RPC provider中的訂票業務");
        userService.orderTicket("甘全中-陳蓉");
    }

}

運行成功!!
success

issue&空指針

在這裏插入圖片描述
服務者必須運行,提供服務

其中常常遇到空指針異常,不能調用遠程的服務主要是Dubbo配置、註解、版本等問題。嚴格參照官方的demo,不一樣版本可能出現一些架構方面的變動。

Dubbo Spring Boot 工程

Dubbo Apache Dubbo™ 是一款高性能Java RPC框架。
Spring Boot 應用場景的開發。同時也整合了 Spring Boot 特性:

Apache Dubbo |ˈdʌbəʊ| 是一款高性能、輕量級的開源Java RPC框架,它提供了三大核心能力:面向接口的遠程方法調用,智能容錯和負載均衡,以及服務自動註冊和發現。

English README

已發行版本

您能夠爲您的工程引入最新 dubbo-spring-boot-starter 的發佈,增長如下依賴到工程的 pom.xml 文件中:

<properties>
    <spring-boot.version>2.1.1.RELEASE</spring-boot.version>
    <dubbo.version>2.7.3</dubbo.version>
</properties>
    
<dependencyManagement>
    <dependencies>
        <!-- Spring Boot -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${spring-boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

        <!-- Apache Dubbo -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-dependencies-bom</artifactId>
            <version>${dubbo.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>${dubbo.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>javax.servlet</groupId>
                    <artifactId>servlet-api</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <!-- Dubbo Spring Boot Starter -->
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-spring-boot-starter</artifactId>
        <version>2.7.3</version>
    </dependency>
    
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo</artifactId>
    </dependency>
</dependencies>

若是您的工程遇到了依賴問題, 請嘗試添加以下 Maven 參考到工程的 pom.xml 文件中:

<repositories>
    <repository>
        <id>apache.snapshots.https</id>
        <name>Apache Development Snapshot Repository</name>
        <url>https://repository.apache.org/content/repositories/snapshots</url>
        <releases>
            <enabled>false</enabled>
        </releases>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </repository>
</repositories>

歷史版本

若是您如今使用的Dubbo版本低於2.7.0,請使用以下對應版本的Dubbo Spring Boot:

Dubbo Spring Boot Dubbo Spring Boot
0.2.1.RELEASE 2.6.5+ 2.x
0.1.2.RELEASE 2.6.5+ 1.x

源代碼構建

若是您須要嘗試最新 dubbo-spring-boot-project 的特性,您可將當前工程手動 Maven install 到本地 Maven 倉庫:

  1. Maven install 當前工程

Maven install = mvn install

快速開始

若是您對 Dubbo 不是很是瞭解,耽誤您幾分鐘訪問 http://dubbo.apache.org/ 。瞭解後,若是您指望更深刻的探討,能夠移步用戶手冊

一般狀況 , Dubbo 應用有兩種使用場景 , 其一爲 Dubbo 服務提供方 , 另一個是 Dubbo 服務消費方,固然也容許二者混合,下面咱們一塊兒快速開始!

首先,咱們假設存在一個 Dubbo RPC API ,由服務提供方爲服務消費方暴露接口 :

public interface DemoService {

    String sayHello(String name);

}

實現 Dubbo 服務提供方

  1. 實現 DemoService 接口

    @Service(version = "1.0.0")
    public class DefaultDemoService implements DemoService {
    
        /** * The default value of ${dubbo.application.name} is ${spring.application.name} */
        @Value("${dubbo.application.name}")
        private String serviceName;
    
        public String sayHello(String name) {
            return String.format("[%s] : Hello, %s", serviceName, name);
        }
    }
  2. 編寫 Spring Boot 引導程序

    @EnableAutoConfiguration
    public class DubboProviderDemo {
    
        public static void main(String[] args) {
            SpringApplication.run(DubboProviderDemo.class,args);
        }
    }
  3. 配置 application.properties :

    # Spring boot application
    spring.application.name=dubbo-auto-configuration-provider-demo
    # Base packages to scan Dubbo Component: @org.apache.dubbo.config.annotation.Service
    dubbo.scan.base-packages=org.apache.dubbo.spring.boot.demo.provider.service
    
    # Dubbo Application
    ## The default value of dubbo.application.name is ${spring.application.name}
    ## dubbo.application.name=${spring.application.name}
    
    # Dubbo Protocol
    dubbo.protocol.name=dubbo
    dubbo.protocol.port=12345
    
    ## Dubbo Registry
    dubbo.registry.address=N/A

實現 Dubbo 服務消費方

  1. 經過 @Reference 注入 DemoService :

    @EnableAutoConfiguration
    public class DubboAutoConfigurationConsumerBootstrap {
    
        private final Logger logger = LoggerFactory.getLogger(getClass());
    
        @Reference(version = "1.0.0", url = "dubbo://127.0.0.1:12345")
        private DemoService demoService;
    
        public static void main(String[] args) {
            SpringApplication.run(DubboAutoConfigurationConsumerBootstrap.class).close();
        }
    
        @Bean
        public ApplicationRunner runner() {
            return args -> {
                logger.info(demoService.sayHello("mercyblitz"));
            };
        }
    }
  2. 配置 application.yml :

    spring:
      application:
        name: dubbo-auto-configure-consumer-sample

請確保 Dubbo 服務提供方服務可用, DubboProviderDemo 運行方可正常。

更多的實現細節,請參考 Dubbo 示例

社區交流

若是您在使用 Dubbo Spring Boot 中遇到任何問題或者有什麼建議? 咱們很是須要您的支持!

  • 若是您須要升級版本,請提早閱讀發佈公告,瞭解最新的特性和問題修復。
  • 若是您遇到任何問題 ,您能夠訂閱 Dubbo 用戶郵件列表
  • 問題反饋,您能夠在 issues 提出您遇到的使用問題。

模塊工程

Dubbo Spring Boot 採用多 Maven 模塊工程 , 模塊以下:

dubbo-spring-boot-parent

dubbo-spring-boot-parent 模塊主要管理 Dubbo Spring Boot 工程的 Maven 依賴

dubbo-spring-boot-autoconfigure

dubbo-spring-boot-autoconfigure 模塊提供 Spring Boot’s @EnableAutoConfiguration 的實現 - DubboAutoConfiguration
它簡化了 Dubbo 核心組件的裝配。

dubbo-spring-boot-actuator

dubbo-spring-boot-actuator 提供 Production-Ready 特性:

http://www.javashuo.com/tag/dubbo-spring-boot-starter

http://www.javashuo.com/tag/dubbo-spring-boot-starter 模塊爲標準的 Spring Boot Starter ,
當您將它引入到工程後,dubbo-spring-boot-autoconfigure 模塊會一同被間接依賴。

dubbo-spring-boot-samples

Dubbo Spring Boot 示例工程包括:

相關文章
相關標籤/搜索