dubbo入門和springboot集成dubbo小例子


從零開始搭建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路徑不對

《完》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM