超詳細,新手都能看懂!使用SpringBoot+Dubbo搭建一個簡單的分散式服務
Github 地址:https://github.com/Snailclimb/springboot-integration-examples ,歡迎各位 Star。
目錄:
使用 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 官方推薦的一種方式。
上述節點簡單說明:
- Provider 暴露服務的服務提供方
- Consumer 呼叫遠端服務的服務消費方
- Registry 服務註冊與發現的註冊中心
- Monitor 統計服務的呼叫次數和呼叫時間的監控中心
- Container 服務執行容器
呼叫關係說明:
-
服務容器負責啟動,載入,執行服務提供者。
- 服務提供者在啟動時,向註冊中心註冊自己提供的服務。
- 服務消費者在啟動時,向註冊中心訂閱自己所需的服務。
- 註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連線推送變更資料給消費者。
- 服務消費者,從提供者地址列表中,基於軟負載均衡演算法,選一臺提供者進行呼叫,如果呼叫失敗,再選另一臺呼叫。
- 服務消費者和提供者,在記憶體中累計呼叫次數和呼叫時間,定時每分鐘傳送一次統計資料到監控中心。
我們在講 Dubbo 的時候提到了 Dubbo 實際上是一款 RPC 框架,那麼RPC 究竟是什麼呢?相信看了下面我對 RPC 的介紹你就明白了!
什麼是 RPC?
RPC(Remote Procedure Call)—遠端過程呼叫,它是一種通過網路從遠端計算機程式上請求服務,而不需要了解底層網路技術的協議。比如兩個不同的服務A,B部署在兩臺不同的機器上,那麼服務 A 如果想要呼叫服務 B 中的某個方法該怎麼辦呢?使用 HTTP請求 當然可以,但是可能會比較慢而且一些優化做的並不好。 RPC 的出現就是為了解決這個問題。
為什麼要用 Dubbo?
如果你要開發分散式程式,你也可以直接基於 HTTP 介面進行通訊,但是為什麼要用 Dubbo呢?
我覺得主要可以從 Dubbo 提供的下面四點特性來說為什麼要用 Dubbo:
- 負載均衡——同一個服務部署在不同的機器時該呼叫那一臺機器上的服務
- 服務呼叫鏈路生成——服務之間互相是如何呼叫的
- 服務訪問壓力以及時長統計——當前系統的壓力主要在哪裡,如何來擴容和優化
- 服務降級——某個服務掛掉之後呼叫備用服務
開始實戰 1 :zookeeper 環境安裝搭建
我使用的是 CentOS 7.4 阿里雲伺服器,注意:如果你也同樣阿里雲伺服器必須配置一個安全組,不然你的應用程式會無法訪問你的 zookeeper 伺服器,這一點我在後面也提到了。
1. 下載
通過 http://mirror.bit.edu.cn/apache/zookeeper/ 這個連結下載,然後上傳到Linux上。(可以說那個 Xhell 附帶的檔案傳輸功能)
或者直接在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
命令,複製所得的當前目錄位置(就是我用紅色圈出來的文字)
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 已經被佔用
注意沒有關閉防火牆可能出現的問題!!!
如果你使用的阿里雲伺服器注意配置相關安全組:
- 進入本例項安全組頁面
- 選擇配置規則
- 選擇新增安全組規則,然後按照下圖配置
在開始實戰之前提個建議:儘量新建一個資料夾,然後後面將介面專案、服務提供者以及服務消費者都放在這個資料夾。
開始實戰 2 :實現服務介面 dubbo-interface
主要分為下面幾步:
- 建立 Maven 專案;
- 建立介面類
- 將專案打成 jar 包供其他專案使用
專案結構:
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
主要分為下面幾步:
- 建立 springboot 專案;
- 加入 dubbo 、zookeeper以及介面的相關依賴 jar 包;
- 在 application.properties 配置檔案中配置 dubbo 相關資訊;
- 實現介面類;
- 服務提供者啟動類編寫
專案結構:
1. dubbo-provider 專案建立
建立一個 SpringBoot 專案,注意勾選上 web 模組。不會建立的話,可以檢視下面這篇文章:,可以說很詳細了。
https://blog.csdn.net/qq_34337272/article/details/79563606
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=8333
spring.dubbo.application.name=dubbo-provider
spring.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
@Service
public 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的自動配置
@EnableDubboConfiguration
public class DubboProviderApplication {
public static void main(String[] args) {
SpringApplication.run(DubboProviderApplication.class, args);
}
}
開始實戰 4 :實現服務消費者 dubbo-consumer
主要分為下面幾步:
- 建立 springboot 專案;
- 加入 dubbo 、zookeeper以及介面的相關依賴 jar 包;
- 在 application.properties 配置檔案中配置 dubbo 相關資訊;
- 編寫測試類;
- 服務消費者啟動類編寫
- 測試效果
專案結構:
第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;
@RestController
public 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
@EnableDubboConfiguration
public class DubboConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(DubboConsumerApplication.class, args);
}
}
6. 測試效果
瀏覽器訪問 http://localhost:8330/hello 頁面返回 Hello world,控制檯輸出 Hello SnailClimb,和預期一直,使用SpringBoot+Dubbo 搭建第一個簡單的分散式服務實驗成功!
相關文章
- 超詳細,新手都能看懂 !使用SpringBoot+Dubbo 搭建一個簡單的分散式服務Spring Boot分散式
- 使用SpringBoot+Dubbo搭建一個簡單的分散式服務Spring Boot分散式
- 搭建分散式事務元件 seata 的Server 端和Client 端詳解(小白都能看懂)分散式元件Serverclient
- 使用go效率工具一小時輕鬆搭建一個簡單可靠的訂單系統,使用dtm解決分散式事務超級簡單Go分散式
- 部署超簡單的 Golong 分散式 WebSocket 微服務Go分散式Web微服務
- 使用node啟動一個簡單的服務
- Feacar分散式事務框架簡單使用分散式框架
- 一文看懂分散式事務分散式
- [Rust]使用Rocket框架搭建簡單Web服務Rust框架Web
- Hadoop3.x完全分散式搭建(詳細)Hadoop分散式
- github的詳細使用,非常簡單!Github
- 一看就會!超簡單詳細 ChatGPT 註冊與使用攻略ChatGPT
- Redisson分散式鎖的簡單使用Redis分散式
- Zookeeper詳細使用解析!分散式架構中的協調服務框架最佳選型實踐分散式架構框架
- SmartSql使用教程(1)——初探,建立一個簡單的CURD介面服務SQL
- [分散式]--Dubbo分散式服務框架-服務治理分散式框架
- 【小白學PyTorch】1 搭建一個超簡單的網路PyTorch
- 從零道一搭建Turbo分散式服務框架實戰分散式框架
- 讓你10分鐘就能看懂Linux檔案許可權(超級詳細、超級簡單!!!)Linux
- Dapr實現一個簡單的基於.net分散式事務之Saga模式分散式模式
- 分散式協調服務☞zookeeper叢集搭建分散式
- Express簡單起一個本地服務介面Express
- Android Retrofit原始碼解析:都能看懂的Retrofit使用詳解Android原始碼
- Dapr實現分散式有狀態服務的細節分散式
- 超詳細Python正規表示式操作指南(re使用),一Python
- ZooKeeper學習筆記四:使用ZooKeeper實現一個簡單的分散式鎖筆記分散式
- 一個內建於專案的分散式快取服務分散式快取
- Nodejs快速搭建簡單的HTTP伺服器詳細教程。NodeJSHTTP伺服器
- 如何快速搭建一個 “簡單模式” 的微服務架構模式微服務架構
- 超詳細 | 使用Nexus搭建私服 (帶程式碼演示)
- 分散式事務最終一致性的簡單案例分散式
- Golang快速實現一個簡單RPC服務GolangRPC
- 用 Go 編寫一個簡單的 WebSocket 推送服務GoWeb
- 一文看懂Java集合(詳細)Java
- vue3保證你看懂watch和watchEffect的詳細詳細使用Vue
- 用Java寫一個分散式快取——RESP服務端Java分散式快取服務端
- 人人都能看懂系列:《分散式系統改造方案——之資料篇》分散式
- 一個簡單的基於 Redis 的分散式任務排程器 —— Java 語言實現Redis分散式Java