dubbo入門和springboot整合dubbo小例子

會當臨絕頂forever發表於2019-05-11

從零開始搭建springboot-dubbo的例子

Dubbo 是一個分散式服務框架,致力於提供高效能和透明化的 RPC 遠端服務呼叫方案,以及 SOA 服務治理方案

一、 Dubbo的簡單介紹

1. 網站架構的發展歷程

網站架構隨著業務的發展,邏輯越來越複雜,資料量越來越大,互動越來越多.......

網站架構的發展歷程

  • 單一應用架構(OORM)

當網站流量很小時,將所有的功能部署到一起,以減少部署節點和成本。此時,只需要使用簡化增刪改查的工作量,採用資料訪問框架(ORM)。

  • 垂直應用架構 (MVC)

當訪問量逐漸增大,單一應用帶來的加速度越來越小。此時,將應用拆分成互不相干的幾個應用,所以採用MVC框架。

  • 分散式服務架構 (RPC)

當垂直應用越來越多,應用之互動不可避免,將核心業務抽取出來,作為獨立的服務,逐漸形成穩定的服務中心,使前端應用能更快速地響應多變的市場需求。此時,用於提高業務複用及整合的服務框架(RPC)是關鍵。

  • 流動計算框架 (SQA)

當服務越來越多,容量的評估,小服務資源的浪費等問題逐漸顯現,此時需增加一個排程中心基於訪問壓力實時管理叢集容量,提高叢集利用率。此時,用於提高機器利用率的 資源排程和治理中心(SOA) 是關鍵。

2. dubbo核心工作原理

dubbo核心工作原理

節點 角色說明
Provider 暴露服務的服務提供方
Registry 服務的註冊與發現的註冊中心,如zookeper(推薦)、multicast、redis、simple
Consumer 呼叫遠端服務的服務消費方
Monitor 統計服務的呼叫次數和呼叫時間的監控中心
Container 服務執行容器

呼叫流程

  • 伺服器負責啟動,載入,執行服務提供者。

  • 服務提供者在啟動時,向註冊中心註冊自己所提供的服務

  • 服務消費者在啟動時,向註冊中心訂閱自己所需的服務

  • 註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於TCP長連線推送變更資料給消費者

  • 服務消費者從提供的服務列表中,基於軟負載均衡演算法,選一臺提供者進行呼叫,如果失敗,則選擇另一臺呼叫

  • 服務消費者和提供者,在記憶體中累計呼叫次數和呼叫時間,定時每分鐘傳送一次統計資料到檢測中心

3. dubbo特點

  1. Dubbo 支援 RPC 呼叫,服務之間的呼叫效能會很好,效率很高

  2. 支援多種序列化協議,如 Hessian(預設)、HTTP、WebService

  3. 對比springcloud

dubbo和SpringCloud對比

二、 springboot-Dubbo搭建

想要使用Dubbo的話,按照前面的原理圖,我們主要使用它的服務遠端呼叫功能,也就是兩個專案之間相互通訊,即RPC

直接上圖,先大致看看專案結構:

dubbo示例專案結構

dubbo-provider是所謂的服務提供者,springboot專案

dubbo-consumer是服務消費者,springboot專案

dubbo-api是服務提供者的介面API,最普通的maven專案

這裡可以會想起dubbo工作原理的圖:

  • 0 dubbo-provider先在容器裡初始化啟動
  • 1 dubbo-provider去註冊中心去註冊服務,註冊中心使用zookeeper
  • 2 dubbo-consumer去註冊中心發現需要的服務
  • 3 註冊中心返回dubbo-provider的服務
  • 4 dubbo-consumer直接去呼叫dubbo-provider

1. 專案依賴

dubbo的jar包依賴(spring-boot)

<!-- dubbo依賴 -->
<dependency>
    <groupId>com.alibaba.spring.boot</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>2.0.0</version>
</dependency>

註冊中心zookeeper的jar包依賴

<!-- 引入zookeeper的依賴 -->
<dependency>
    <groupId>com.101tec</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.10</version>
</dependency>

2. 服務提供者

服務提供者dubbo-provider提供HelloService.sayHello()介面

package com.dubbo.provider.service;

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

//@Service是dubbo裡的註解,作用是暴露服務,不要選擇spring的@Service
@Service
@Component
public class HelloServiceImpl implements HelloService {

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

還要在springboot的啟動類上加一個開啟Dubbo的註解

package com.dubbo.provider;

import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

//開啟dubbo的自動配置
@EnableDubboConfiguration
@SpringBootApplication
public class DubboProviderApplication {

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

}

3. 服務消費者

dubbo-consumer遠端呼叫dubbo-consumer提供的服務HelloService.sayHello()介面

package com.dubbo.consumer.controller;

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

@RestController
public class HelloController {

    @Reference//dubbo註解,可以仔細瞭解下這個註解
    private HelloService helloService;

    @RequestMapping(value = "/hello")
    public String hello() {
        String hello = helloService.sayHello("world");
        System.out.println(helloService.sayHello("BJQ"));
        return hello;
    }

}

同上,這個也需要讓Dubbo開啟自動配置

package com.dubbo.consumer;

import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

//就是這裡,對,沒錯 ->_->
@EnableDubboConfiguration
@SpringBootApplication
public class DubboConsumerApplication {

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

}

4. 專案啟動流程和結構

1. 啟動祖冊中心:

專案啟動需要去官網下載zookeper註冊中心,解壓,配置一下zoo.cfg配置檔案,然後啟動zkServer.cmd(以下是我的簡單配置)

tickTime=2000
initLimit=10
syncLimit=5
dataDir=F:\\zookeeper-3.4.14\\temp\\zookeeper
dataLogDir=F:\\zookeeper-3.4.14\\temp\\zookeeper-logs
clientPort=2181

2. 啟動服務提供方dubbo-provider

如下圖,說明dubbo-provider啟動,並且已經連上註冊中心

提供者啟動

3. 啟動服務消費方dubbo-consumer

效果跟上面差不多

4. 服務呼叫結果

自己去試試,皮一下,,哈哈 QWQ

三、專案地址

springboot-dubbo-demo

注意點和問題

dubbo直連,這個可以在測試的過程中使用

dubbo的高校序列化協議可以選的,預設是hessian

dubbo是基於TCP協議去做的,所以很快。

在啟動zookeeper時,會有視窗一閃而過的情況,有可能時jdk環境變數有空格,還有可能是zk的dataDir路徑不對

《完》

相關文章