新手都能看懂!使用SpringBoot+Dubbo 搭建一個簡單的分布式服務

2020-09-05 JavaGuide

Github 地址:https://github.com/Snailclimb/springboot-integration-examples (複製到瀏覽器訪問) ,歡迎各位 Star。

目錄:

  • 使用 SpringBoot+Dubbo 搭建一個簡單分布式服務
  • 實戰之前,先來看幾個重要的概念
  • 什麼是分布式?
  • 什麼是 Duboo?
  • Dubbo 架構
  • 什麼是 RPC?
  • 為什麼要用 Dubbo?
  • 開始實戰 1 :zookeeper 環境安裝搭建
  • 1. 下載
  • 2. 解壓
  • 3. 進入zookeeper目錄,創建data文件夾。
  • 4. 進入/zookeeper/conf目錄下,複製zoo_sample.cfg,命名為zoo.cfg
  • 5. 修改配置文件
  • 6. 啟動測試
  • 開始實戰 2 :實現服務接口 dubbo-interface
  • 1. dubbo-interface 項目創建
  • 2. 創建接口類
  • 3. 將項目打成 jar 包供其他項目使用
  • 開始實戰 3 :實現服務提供者 dubbo-provider
  • 1. dubbo-provider 項目創建
  • 2. pom 文件引入相關依賴
  • 3. 在 application.properties 配置文件中配置 dubbo 相關信息
  • 4. 實現接口
  • 5. 服務提供者啟動類編寫
  • 開始實戰 4 :實現服務消費者 dubbo-consumer
  • 4. 編寫一個簡單 Controller 調用遠程服務
  • 5. 服務消費者啟動類編寫
  • 6. 測試效果

使用 SpringBoot+Dubbo 搭建一個簡單分布式服務

實戰之前,先來看幾個重要的概念

開始實戰之前,我們先來簡單的了解一下這樣幾個概念:Dubbo、RPC、分布式、由於本文的目的是帶大家使用SpringBoot+Dubbo 搭建一個簡單的分布式服務,所以這些概念我只會簡單給大家普及一下,不會做深入探究。

什麼是分布式?

分布式或者說 SOA 分布式重要的就是面向服務,說簡單的分布式就是我們把整個系統拆分成不同的服務然後將這些服務放在不同的伺服器上減輕單體服務的壓力提高並發量和性能。比如電商系統可以簡單地拆分成訂單系統、商品系統、登錄系統等等。

我們可以使用 Dubbo作為分布式系統的橋梁,那麼什麼是 Dubbo 呢?

什麼是 Duboo?

Apache Dubbo (incubating) |ˈdʌbəʊ| 是一款高性能、輕量級的開源Java RPC 框架,它提供了三大核心能力:面向接口的遠程方法調用,智能容錯和負載均衡,以及服務自動註冊和發現。簡單來說 Dubbo 是一個分布式服務框架,致力於提供高性能和透明化的RPC遠程服務調用方案,以及SOA服務治理方案。

Dubbo 目前已經有接近 23k 的 Star ,Dubbo的Github 地址:https://github.com/apache/incubator-dubbo。另外,在開源中國舉行的2018年度最受歡迎中國開源軟體這個活動的評選中,Dubbo 更是憑藉其超高人氣僅次於 vue.js 和 ECharts 獲得第三名的好成績。

Dubbo 是由阿里開源,後來加入了 Apache 。正式由於 Dubbo 的出現,才使得越來越多的公司開始使用以及接受分布式架構。

下面我們簡單地來看一下 Dubbo 的架構,加深對 Dubbo 的理解。

Dubbo 架構

下面我們再來看看 Dubbo 的架構,我們後面會使用 zookeeper 作為註冊中心,這也是 Dubbo 官方推薦的一種方式。

Dubbo 架構

上述節點簡單說明:

  • Provider 暴露服務的服務提供方
  • Consumer 調用遠程服務的服務消費方
  • Registry 服務註冊與發現的註冊中心
  • Monitor 統計服務的調用次數和調用時間的監控中心
  • Container 服務運行容器

調用關係說明:

  1. 服務容器負責啟動,加載,運行服務提供者。
  2. 服務提供者在啟動時,向註冊中心註冊自己提供的服務。
  3. 服務消費者在啟動時,向註冊中心訂閱自己所需的服務。
  4. 註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連接推送變更數據給消費者。
  5. 服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,如果調用失敗,再選另一臺調用。
  6. 服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。

我們在講 Dubbo 的時候提到了 Dubbo 實際上是一款 RPC 框架,那麼RPC 究竟是什麼呢?相信看了下面我對 RPC 的介紹你就明白了!

什麼是 RPC?

RPC(Remote Procedure Call)—遠程過程調用,它是一種通過網絡從遠程電腦程式上請求服務,而不需要了解底層網絡技術的協議。比如兩個不同的服務A,B部署在兩臺不同的機器上,那麼服務 A 如果想要調用服務 B 中的某個方法該怎麼辦呢?使用 HTTP請求 當然可以,但是可能會比較慢而且一些優化做的並不好。 RPC 的出現就是為了解決這個問題。

為什麼要用 Dubbo?

如果你要開發分布式程序,你也可以直接基於 HTTP 接口進行通信,但是為什麼要用 Dubbo呢?

我覺得主要可以從 Dubbo 提供的下面四點特性來說為什麼要用 Dubbo:

  1. 負載均衡——同一個服務部署在不同的機器時該調用那一臺機器上的服務
  2. 服務調用鏈路生成——服務之間互相是如何調用的
  3. 服務訪問壓力以及時長統計——當前系統的壓力主要在哪裡,如何來擴容和優化
  4. 服務降級——某個服務掛掉之後調用備用服務

開始實戰 1 :zookeeper 環境安裝搭建

我使用的是 CentOS 7.4 阿里雲伺服器,注意:如果你也同樣阿里雲伺服器必須配置一個安全組,不然你的應用程式會無法訪問你的 zookeeper 伺服器,這一點我在後面也提到了。

1. 下載

通過 http://mirror.bit.edu.cn/apache/zookeeper/ 這個連結下載,然後上傳到Linux上。(可以說那個 Xhell 附帶的文件傳輸功能)

zookeeper下載

或者直接在Linux中使用 wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.12/zookeeper-3.4.12.tar.gz 命令下載(版本號 3.4.12 是我寫這篇文章的時候最新的穩定版本,各位可以根據實際情況修改)

2. 解壓

tar -zxvf zookeeper-3.4.12-alpha.tar.gz

解壓之後

解壓完畢之後修改一下解壓之後所得的文件夾名

mv zookeeper-3.4.12 zookeeper


刪除 zookeeper 安裝包

rm -rf zookeeper-3.4.12.tar.gz


3. 進入zookeeper目錄,創建data文件夾。

mkdir data


進入 data 文件夾 然後執行pwd命令,複製所得的當前目錄位置(就是我用紅色圈出來的文字)

進入 data 文件夾 然後執行pwd命令

4. 進入/zookeeper/conf目錄下,複製zoo_sample.cfg,命名為zoo.cfg

cp zoo_sample.cfg zoo.cfg


5. 修改配置文件

使用 vim zoo.cfg 命令修改配置文件

vim 文件------>進入文件----->命令模式------>按i進入編輯模式----->編輯文件 ------->按Esc進入底行模式----->輸入:wq/q! (輸入wq代表寫入內容並退出,即保存;輸入q!代表強制退出不保存。)

修改配置文件中的 data 屬性:

dataDir=/usr/local/zookeeper/data


6. 啟動測試

進入 /zookeeper/bin 目錄然後執行下面的命令

./zkServer.sh start


執行 ./zkServer.sh status 查看當前 zookeeper 狀態。

或者運行 netstat -lntup 命令查看網絡狀態,可以看到 zookeeper 的埠號 2181 已經被佔用

運行 netstat -lntup命令查看網絡狀態


注意沒有關閉防火牆可能出現的問題!!!

如果你使用的阿里雲伺服器注意配置相關安全組:

  1. 進入本實例安全組頁面

  1. 進入本實例安全組頁面
  2. 選擇配置規則

  1. 選擇配置規則
  2. 選擇添加安全組規則,然後按照下圖配置

  1. 選擇添加安全組規則,然後按照下圖配置

在開始實戰之前提個建議:儘量新建一個文件夾,然後後面將接口項目、服務提供者以及服務消費者都放在這個文件夾。

項目概覽

開始實戰 2 :實現服務接口 dubbo-interface

主要分為下面幾步:

  1. 創建 Maven 項目;
  2. 創建接口類
  3. 將項目打成 jar 包供其他項目使用

項目結構:

dubbo-provider 項目結構

dubbo-interface 後面被打成 jar 包,它的作用只是提供接口。

1. dubbo-interface 項目創建

File->New->Module… ,然後選擇 Maven類型的項目,其他的按照提示一步一步走就好。

第一步

第二步

2. 創建接口類

package top.snailclimb.service;public interface HelloService { public String sayHello(String name);}

3. 將項目打成 jar 包供其他項目使用

點擊右邊的 Maven Projects 然後選擇 install ,這樣 jar 寶就打好了。

開始實戰 3 :實現服務提供者 dubbo-provider

主要分為下面幾步:

  1. 創建 springboot 項目;
  2. 加入 dubbo 、zookeeper以及接口的相關依賴 jar 包;
  3. 在 application.properties 配置文件中配置 dubbo 相關信息;
  4. 實現接口類;
  5. 服務提供者啟動類編寫

項目結構:

dubbo-provider 項目結構

1. dubbo-provider 項目創建

創建一個 SpringBoot 項目,注意勾選上 web 模塊。不會創建的話,可以查看下面這篇文章:,可以說很詳細了。

https://blog.csdn.net/qq_34337272/article/details/79563606

注意勾選上 web 模塊

2. pom 文件引入相關依賴

需要引入 dubbo 、zookeeper以及接口的相關依賴 jar 包。注意將本項目和 dubbo-interface 項目的 dependency 依賴的 groupId 和 artifactId 改成自己的。dubbo 整合spring boot 的 jar 包在這裡找dubbo-spring-boot-starter。zookeeper 的 jar包在 Maven 倉庫 搜索 zkclient 即可找到。

 <dependency> <groupId>top.snailclimb</groupId> <artifactId>dubbo-interface</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!--引入dubbo的依賴--> <dependency> <groupId>com.alibaba.spring.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.0.0</version> </dependency> <!-- 引入zookeeper的依賴 --> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.10</version> </dependency>

3. 在 application.properties 配置文件中配置 dubbo 相關信息

配置很簡單,這主要得益於 springboot 整合 dubbo 專屬的@EnableDubboConfiguration註解提供的 Dubbo 自動配置。

# 配置埠server.port=8333spring.dubbo.application.name=dubbo-providerspring.dubbo.application.registry=zookeeper://ip地址:2181

4. 實現接口

注意: @Service 註解使用的時 Dubbo 提供的而不是 Spring 提供的。另外,加了Dubbo 提供的 @Service 註解之後還需要加入

package top.snailclimb.service.impl;import com.alibaba.dubbo.config.annotation.Service;import org.springframework.stereotype.Component;import top.snailclimb.service.HelloService;@Component@Servicepublic class HelloServiceImpl implements HelloService { @Override public String sayHello(String name) { return "Hello " + name; }}

5. 服務提供者啟動類編寫

注意:不要忘記加上 @EnableDubboConfiguration 註解開啟Dubbo 的自動配置。

package top.snailclimb;import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication// 開啟dubbo的自動配置@EnableDubboConfigurationpublic class DubboProviderApplication { public static void main(String[] args) { SpringApplication.run(DubboProviderApplication.class, args); }}

開始實戰 4 :實現服務消費者 dubbo-consumer

主要分為下面幾步:

  1. 創建 springboot 項目;
  2. 加入 dubbo 、zookeeper以及接口的相關依賴 jar 包;
  3. 在 application.properties 配置文件中配置 dubbo 相關信息;
  4. 編寫測試類;
  5. 服務消費者啟動類編寫
  6. 測試效果

項目結構:

dubbo-consumer 項目結構

第1,2,3 步和服務提供者的一樣,這裡直接從第 4 步開始。

4. 編寫一個簡單 Controller 調用遠程服務

package top.snailclimb.dubboconsumer;import com.alibaba.dubbo.config.annotation.Reference;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import top.snailclimb.service.HelloService;@RestControllerpublic class HelloController { @Reference private HelloService helloService; @RequestMapping("/hello") public String hello() { String hello = helloService.sayHello("world"); System.out.println(helloService.sayHello("SnailClimb")); return hello; }}

5. 服務消費者啟動類編寫

package top.snailclimb.dubboconsumer;import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication@EnableDubboConfigurationpublic class DubboConsumerApplication { public static void main(String[] args) { SpringApplication.run(DubboConsumerApplication.class, args); }}

6. 測試效果

瀏覽器訪問 http://localhost:8330/hello 頁面返回 Hello world,控制臺輸出 Hello SnailClimb,和預期一直,使用SpringBoot+Dubbo 搭建第一個簡單的分布式服務實驗成功!

相關焦點

  • 15-SpringBoot項目使用Dubbo搭建分布式系統3
    第三章 使用dubbo搭建分布式系統1、dubbo簡介高性能java RPC框架Apache Dubbo |ˈdʌbəʊ| 是一款高性能、輕量級的開源Java RPC框架,它提供了三大核心能力:面向接口的遠程方法調用,智能容錯和負載均衡,以及服務自動註冊和發現。
  • springboot整合dubbo+zookeeper(二)
    現在越來越多的公司開發項目中使用了springboot作為搭建服務的框架,而dubbo是一款國內使用較多的SOA架構開發的中間件,其主要由三個部分組成:生產者,消費者,註冊中心。註冊中心一般使用的是zookeeper。於是我們從頭來捋一捋如何搭建一個springboot+dubbo項目。
  • springboot整合dubbo+zookeeper(三)
    現在越來越多的公司開發項目中使用了springboot作為搭建服務的框架,而dubbo是一款國內使用較多的SOA架構開發的中間件,其主要由三個部分組成:生產者,消費者,註冊中心。註冊中心一般使用的是zookeeper。於是我們從頭來捋一捋如何搭建一個springboot+dubbo項目。
  • springboot整合dubbo+zookeeper(一)
    現在越來越多的公司開發項目中使用了springboot作為搭建服務的框架,而dubbo是一款國內使用較多的SOA架構開發的中間件,其主要由三個部分組成:生產者,消費者,註冊中心。註冊中心一般使用的是zookeeper。於是我們從頭來捋一捋如何搭建一個springboot+dubbo項目。
  • dubbo實戰之二:與SpringBoot集成
    實戰》系列的第二篇,一起來實戰SpringBoot(2.3.3.RELEASE版本)與dubbo的集成,這也是分布式服務的常用技術組合,本文由以下內容組成:本篇的實戰暫不使用註冊中心,而是服務提供方啟動時廣播自己的地址,再由消費方啟動時訂閱,並隨時遠程調用,調用邏輯如下圖所示:
  • Dubbo 分布式架構搭建教育 PC 站
    學員使用手機號註冊登錄後,可以選擇適合自己的課程,並觀看課程視頻,當然,有免費的課程,也有 VIP 專屬課程。Node.js 就是運行在服務端的 JavaScript 運行環境Axios - 對 Ajax 的封裝, 簡單來說就是 Ajax 技術實現了局部數據的刷新,AXIOS 實現了對 Ajax 的封裝
  • 15-SpringBoot項目使用Dubbo搭建分布式系統2
    第二節 Docker安裝zookeeper1、zookeeper簡介zookeeper是一個分布式的,開放源碼的分布式應用程式協調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase的重要組件。
  • Spring Cloud 和 Dubbo,到底用哪個好?
    雖然Dubbo 支持短連接大數據量的服務提供模式,但絕大多數情況下都是使用長連接小數據量的模式提供服務使用的。所以,對於類似於電商等同步調用場景多並且能支撐搭建Dubbo 這套比較複雜環境的成本的產品而言,Dubbo 確實是一個可以考慮的選擇。
  • 15-SpringBoot項目使用Dubbo搭建分布式系統1
    集群中每臺伺服器就叫做這個集群的一個「節點」,所有節點構成了一個集群。每個節點都提供相同的服務,那麼這樣系統的處理能力就相當於提升了好幾倍。但問題是用戶的請求究竟由哪個節點來處理呢?最好能夠讓此時此刻負載較小的節點來處理,這樣使得每個節點的壓力都比較平均。
  • SpringBoot中使用dubbo實現RPC調用
    Dubbo(來自於阿里巴巴)Dubbo是一個分布式服務框架,致力於提供高性能和透明化的PRC遠程調用服務調用方案。通過zookeeper設置達到註冊服務和心跳檢測,通過gateWay前置網關(Clound使用Zuul實現負載均衡將請求轉向Eureka伺服器)隔絕外部直接調用原子服務的風險SpringBoot中使用
  • 分布式-zookeeper+dubbo入門demo
    完成這個demo的搭建,先簡單說一下dubbo常識的概念1.什麼是SOA架構SOA 是Service-Oriented Architecture的首字母簡稱,它是一個面向服務的架構模式(俗稱:分布式;面服務的分布式)為什麼網際網路項目會採用SOA架構呢?
  • 小試牛刀,SpringBoot+Dubbo 的直連模式
    你項目中正在用dubbo 投票
  • 15-第三節 使用dubbo搭建分布式系統
    :面向接口的遠程方法調用,智能容錯和負載均衡,以及服務自動註冊和發現。3)、服務自動註冊與發現支持多種註冊中心服務,服務實例上下線實時感知。4)、高度可擴展能力遵循微內核+插件的設計原則,所有核心能力如Protocol、Transport、Serialization被設計為擴展點,平等對待內置實現和第三方實現。
  • dubbo實戰之三:使用Zookeeper註冊中心
    實戰》系列的第三篇,主要內容是使用Zookeeper作為註冊中心的實戰;前面兩篇的實戰都是使用了廣播模式,整個環境由服務提供者和服務消費者組成,這種簡單形態只是為了方便學習,實際上多數情況都會部署註冊中心,服務提供者在上面註冊,服務消費者再從註冊中心得到具體的服務信息;下面是個典型的提供者、消費者、註冊中心的典型架構圖:
  • Apache Dubbo分布式服務架構全鏈路追蹤
    在開發或線上運維基本上會遇到如下情況:A系統開發同學:我查了日誌,客戶端的請求過程一共用了X秒,請求是從幾點幾分幾秒發起的,另外一個服務耗時比較長 XXX你們查下服務端的日誌呢B系統開發人員:我這邊是幾點幾分幾秒收到的請求,我們系統一共花了X秒多一些,其中調用C系統花了將近秒,XXX你們查下服務端的日誌呢C系統開發人員
  • 輕量級的分布式日誌追蹤利器,十分鐘可接入,從此日誌追蹤無難事
    這時候很多童鞋會開始考慮上SkyWalking,Pinpoint等分布式追蹤系統來解決,基於OpenTracing規範,而且通常都是無侵入性的,並且有相對友好的管理界面來進行鏈路Span的查詢。但是搭建分布式追蹤系統,熟悉以及推廣到全公司的系統需要一定的時間周期,而且當中涉及到鏈路span節點的存儲成本問題,全量採集還是部分採集?
  • 輕量級分布式日誌追蹤利器,十分鐘即可接入,從此日誌追蹤無難事
    這時候很多童鞋會開始考慮上SkyWalking,Pinpoint等分布式追蹤系統來解決,基於OpenTracing規範,而且通常都是無侵入性的,並且有相對友好的管理界面來進行鏈路Span的查詢。但是搭建分布式追蹤系統,熟悉以及推廣到全公司的系統需要一定的時間周期,而且當中涉及到鏈路span節點的存儲成本問題,全量採集還是部分採集?
  • 01:springboot最快入門之三分鐘啟動springboot項目
    springboot專題預計60講左右,本篇作為開張第一篇帶你三分鐘快速入門!一、SpringBoot是什麼?Spring Boot英文中是「引導」的意思,是用來簡化Spring應用的搭建到開發的過程。可以這麼說。SpringBoot是一個服務於框架的框架,服務範圍是簡化配置文件。二、SpringBoot可以做什麼?
  • 微服務框架saf-3:saf-dubbo與demo的解析與體驗與容器化部署
    2.適用於雲原生(K8S)下的微服務體系搭建,為技術中臺提供底層支撐。3.解放業務,使業務方專注於業務邏輯本身:通過註解以搭積木方式引入各式資源,每個資源都是一行註解,極大提升業務方產出效率。(2).saf-dubbo與demo的簡單解析1.saf-dubbo特性1.1本地0配置特性saf框架的一個最大特點是是本地0配置,所有配置都在分布式配置中心。
  • 只要3步,這工具幫你輕鬆整合Springboot和Dubbo
    前言本文不是介紹在Spring-boot下使用duboo服務,而是介紹如何使用一個spring-boot和dubbo整合起來的小工具(jar包)。服務,相信使用中有很多「不爽」的地方。既然使用spring boot,那麼能用註解的地方絕不用xml配置,這才是spring-boot-style。開個玩笑,真正意思是,spring-boot適合一些簡單的、獨立的服務,一個大的系統是不適合使用spring-boot來開發。相反,spring-boot適合那些簡單服務的搭建。