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/inc...。另外,在開源中國舉行的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.gz3. 進入zookeeper目錄,創建data文件夾。
mkdir data
進入 data 文件夾 然后執行pwd命令,復制所得的當前目錄位置(就是我用紅色圈出來的文字)
4. 進入/zookeeper/conf目錄下,復制zoo_sample.cfg,命名為zoo.cfgcp zoo_sample.cfg zoo.cfg5. 修改配置文件
使用 vim zoo.cfg 命令修改配置文件
vim 文件------>進入文件----->命令模式------>按i進入編輯模式----->編輯文件 ------->按Esc進入底行模式----->輸入:wq/q! (輸入wq代表寫入內容并退出,即保存;輸入q!代表強制退出不保存。)
修改配置文件中的 data 屬性:
dataDir=/usr/local/zookeeper/data6. 啟動測試
進入 /zookeeper/bin 目錄然后執行下面的命令
./zkServer.sh start
執行 ./zkServer.sh status 查看當前 zookeeper 狀態。
或者運行 netstat -lntup 命令查看網絡狀態,可以看到 zookeeper 的端口號 2181 已經被占用
注意沒有關閉防火墻可能出現的問題?。。?/p>
如果你使用的阿里云服務器注意配置相關安全組:
進入本實例安全組頁面
選擇配置規則
選擇添加安全組規則,然后按照下圖配置
在開始實戰之前提個建議:盡量新建一個文件夾,然后后面將接口項目、服務提供者以及服務消費者都放在這個文件夾。
主要分為下面幾步:
創建 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 寶就打好了。
主要分為下面幾步:
創建 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 即可找到。
3. 在 application.properties 配置文件中配置 dubbo 相關信息top.snailclimb dubbo-interface 1.0-SNAPSHOT com.alibaba.spring.boot dubbo-spring-boot-starter 2.0.0 com.101tec zkclient 0.10
配置很簡單,這主要得益于 springboot 整合 dubbo 專屬的@EnableDubboConfiguration 注解提供的 Dubbo 自動配置。
# 配置端口 server.port=8333 spring.dubbo.application.name=dubbo-provider spring.dubbo.application.registry=zookeeper://ip地址:21814. 實現接口
注意: @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 搭建第一個簡單的分布式服務實驗成功!
ThoughtWorks準入職Java工程師。專注Java知識分享!開源 Java 學習指南——JavaGuide(12k+ Star)的作者。公眾號多篇文章被各大技術社區轉載。公眾號后臺回復關鍵字“1”可以領取一份我精選的Java資源哦!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72467.html
摘要:作為面試官,我是如何甄別應聘者的包裝程度語言和等其他語言的對比分析和主從復制的原理詳解和持久化的原理是什么面試中經常被問到的持久化與恢復實現故障恢復自動化詳解哨兵技術查漏補缺最易錯過的技術要點大掃盲意外宕機不難解決,但你真的懂數據恢復嗎每秒 作為面試官,我是如何甄別應聘者的包裝程度Go語言和Java、python等其他語言的對比分析 Redis和MySQL Redis:主從復制的原理詳...
摘要:作為面試官,我是如何甄別應聘者的包裝程度語言和等其他語言的對比分析和主從復制的原理詳解和持久化的原理是什么面試中經常被問到的持久化與恢復實現故障恢復自動化詳解哨兵技術查漏補缺最易錯過的技術要點大掃盲意外宕機不難解決,但你真的懂數據恢復嗎每秒 作為面試官,我是如何甄別應聘者的包裝程度Go語言和Java、python等其他語言的對比分析 Redis和MySQL Redis:主從復制的原理詳...
摘要:上面這三種均不造成重載,現在來說明原因。結論對于引用返回,返回的對象必須是棧幀銷毀后還存在的。全局,靜態,未銷毀的函數棧幀當中的都是可以的指針與引用如圖兩者底層實現差不多,引用是用指針模擬的。不建議聲明和定義分離,分離會導致鏈接錯誤。 ...
摘要:通過以上分析我們可以得出消息隊列具有很好的削峰作用的功能即通過異步處理,將短時間高并發產生的事務消息存儲在消息隊列中,從而削平高峰期的并發事務。 該文已加入開源項目:JavaGuide(一份涵蓋大部分Java程序員所需要掌握的核心知識的文檔類項目,Star 數接近 16k)。地址:https://github.com/Snailclimb... 本文內容思維導圖:showImg(ht...
閱讀 2984·2021-11-23 09:51
閱讀 1010·2021-09-26 09:55
閱讀 3958·2021-09-22 14:58
閱讀 1483·2021-09-08 09:35
閱讀 1082·2021-08-26 14:16
閱讀 886·2019-08-23 18:17
閱讀 2067·2019-08-23 16:45
閱讀 704·2019-08-23 15:55