1. 程式人生 > >SpringBoot雜碎知識 (十三) Dubbo的整合

SpringBoot雜碎知識 (十三) Dubbo的整合

Dubbo是一款高效能、輕量級的開源Java RPC框架,它提供了三大核心能力:面向介面的遠端方法呼叫,智慧容錯和負載均衡,以及服務自動註冊和發現。,它最大的特點是按照分層的方式來架構,使用這種方式可以使各個層之間解耦合(或者最大限度地鬆耦合)。

在2月15日,大年三十,經過一系列緊張的投票,來自阿里巴巴的廣受社群歡迎的RPC開源框架Dubbo宣佈正式進入Apache孵化器。說起Dubbo框架,可能很多後端開發者都有所瞭解,它是國內比較早的、影響較大的開源專案,包括阿里巴巴、京東、噹噹網、去哪兒網、網易考拉、微店等電商平臺都有其成功應用案例。

Dubbo於2011年開源,之後就迅速成為了國內該類開源專案的佼佼者。可以想象,2011年時,優秀的、可在生產環境使用的RPC框架很少,Dubbo的出現迅速給人眼前一亮的感覺,而同時它又有阿里巴巴背書,所以也迅速收到了開發者的親睞。Dubbo 目前在 GitHub 上有超過 16000 個 star 和超過 12000 的 fork 數,絕對是國內影響力最大的開源專案之一。

但奇怪的是,在2014年10月30日釋出2.4.11版本後,Dubbo突然停止更新,當時社群一片譁然(其實是在2012年10月之後就基本停止了重要升級,改為階段性維護)。具體原因現在也不得而知,知乎上也有一些討論,包括團隊調整、內部主推HSF等。不過可以確認的是,在4年前,國內企業對於開源的重視程度都遠遠沒有今天高。

而在官方停止更新Dubbo之後,噹噹網(Dubbox)、網易考拉(Dubbok)都有維護自己單獨的分支,這也可以從另外一個側面證明Dubbo確實應用到了這些企業的重點業務,並且規模不小。

隨著阿里巴巴對於開源的逐步重視,2017年9月7日,Dubbo悄悄的在GitHub釋出了2.5.4版本。隨後,沒過多久,又迅速釋出了2.5.5、2.5.6、2.5.7等版本。在10月舉行的雲棲大會上,阿里宣佈Dubbo被列入集團重點維護開源專案,這也就意味著Dubbo起死回生,開始重新進入快車道。

這章主要介紹Dubbo是怎麼整合springboot的,Dubbo起死回生後,同樣官方也放出的對應boot的start

        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>0.2.0</version>
        </dependency>

最新版本呢是相容springboot 2.x 以上,其中還有0.1.0版本主要針對springboot1.5x的相容,整合包內預設提供了apcache的curator 來連線zookeeper,所以不用在引用連線zookeeper的包。

專案結構

這裡寫圖片描述

  • dubbo-api 是服務的介面
  • dubbo-provider 是服務的生產者 引用dubbo-api
  • dubbo-consumer 是服務的消費者 引用dubbo-api

服務介面

package com.maoxs.service;

public interface DemoService {
    String sayHello(String name);
}

定義一個DemoService的介面,並且寫一個sayHello的方法

生產者

首先呢看下yml

spring:
  application:
    name: springboot-service-provider
server:
  port: 9001
dubbo:
  protocol:
    port: 20880
    name: dubbo
  application:
    registry: zookeeper://127.0.0.1:6379  #如果想改用redis註冊中心呢把zookeeper改為redis即可
    name: dubbo-provider-demo
    id: dubbo-provider-demo
    qos-port: 1111
  scan:
    basePackages: com.maoxs.service.impl
demo:
  service:
    version: 1.0.0

如果想改用redis註冊中心呢把zookeeper改為redis即可。這裡的scan.basePackages來掃描dubbo的服務

package com.maoxs.service.impl;

import com.alibaba.dubbo.config.MethodConfig;
import com.alibaba.dubbo.config.annotation.Service;
import com.alibaba.dubbo.validation.MethodValidated;
import com.maoxs.service.DemoService;

@Service(version = "${demo.service.version}")
public class DefaultDemoService implements DemoService {
    public String sayHello(String name) {
        return "Hello, " + name + " (from Spring Boot)";
    }
}

這個呢是服務的具體實現,切記,這裡的@Service用的是dubbo的註解

然後呢是啟動類 由於生產者作用只是把服務註冊到註冊中心,所以可以把啟動類設定類非web應用

package com.maoxs;

import org.springframework.boot.WebApplicationType;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;

@SpringBootApplication
public class SpringbootDubboProviderApplication {

    public static void main(String[] args) {
          new SpringApplicationBuilder(SpringbootDubboProviderApplication.class)
                .web(WebApplicationType.NONE) // 非 Web 應用
                .run(args);
    }
}

消費者

在來看些消費者的程式碼

還是先看yml

spring:
  application:
    name: springcloud-service-consumer
server:
  port: 8001
dubbo:
  registry:
    address: zookeeper://127.0.0.1:2181
    #address: redis://127.0.0.1:6379
  application:
    name: service-consumer
  scan:
    basePackages: com.maoxs.controller
demo:
  service:
    version: 1.0.0

然後呢,我們這裡做一個controller來呼叫遠端的服務


package com.maoxs.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.maoxs.service.DemoService;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DemoConsumerController {

    @Reference(version = "${demo.service.version}")
    private DemoService demoService;

    @RequestMapping("/sayHello/{name}")
    public String sayHello(@PathVariable String name) {
        return demoService.sayHello(name);
    }
}

然後呢,我們啟動zookeeper 註冊中心,把服務註冊上去來看下效果 img

ok,我們看到呼叫成功了!!

相關連線:

個人部落格地址 : www.fulinlin.com

注:如果不對聯絡本寶寶及時改正~~