Github 地址:https://github.com/Snailclimb/springboot-integration-examples ,歡迎各位 Star。
目錄:
使用 SpringBoot+Dubbo 搭建一個(gè)簡(jiǎn)單分布式服務(wù)
實(shí)戰(zhàn)之前,先來(lái)看幾個(gè)重要的概念
什么是分布式?
什么是 Duboo?
Dubbo 架構(gòu)
什么是 RPC?
為什么要用 Dubbo?
開(kāi)始實(shí)戰(zhàn) 1 :zookeeper 環(huán)境安裝搭建
1. 下載
2. 解壓
3. 進(jìn)入zookeeper目錄,創(chuàng)建data文件夾。
4. 進(jìn)入/zookeeper/conf目錄下,復(fù)制zoo_sample.cfg,命名為zoo.cfg
5. 修改配置文件
6. 啟動(dòng)測(cè)試
開(kāi)始實(shí)戰(zhàn) 2 :實(shí)現(xiàn)服務(wù)接口 dubbo-interface
1. dubbo-interface 項(xiàng)目創(chuàng)建
2. 創(chuàng)建接口類(lèi)
3. 將項(xiàng)目打成 jar 包供其他項(xiàng)目使用
開(kāi)始實(shí)戰(zhàn) 3 :實(shí)現(xiàn)服務(wù)提供者 dubbo-provider
1. dubbo-provider 項(xiàng)目創(chuàng)建
2. pom 文件引入相關(guān)依賴
3. 在 application.properties 配置文件中配置 dubbo 相關(guān)信息
4. 實(shí)現(xiàn)接口
5. 服務(wù)提供者啟動(dòng)類(lèi)編寫(xiě)
開(kāi)始實(shí)戰(zhàn) 4 :實(shí)現(xiàn)服務(wù)消費(fèi)者 dubbo-consumer
4. 編寫(xiě)一個(gè)簡(jiǎn)單 Controller 調(diào)用遠(yuǎn)程服務(wù)
5. 服務(wù)消費(fèi)者啟動(dòng)類(lèi)編寫(xiě)
6. 測(cè)試效果
使用 SpringBoot+Dubbo 搭建一個(gè)簡(jiǎn)單分布式服務(wù) 實(shí)戰(zhàn)之前,先來(lái)看幾個(gè)重要的概念開(kāi)始實(shí)戰(zhàn)之前,我們先來(lái)簡(jiǎn)單的了解一下這樣幾個(gè)概念:Dubbo、RPC、分布式、由于本文的目的是帶大家使用SpringBoot+Dubbo 搭建一個(gè)簡(jiǎn)單的分布式服務(wù),所以這些概念我只會(huì)簡(jiǎn)單給大家普及一下,不會(huì)做深入探究。
什么是分布式?分布式或者說(shuō) SOA 分布式重要的就是面向服務(wù),說(shuō)簡(jiǎn)單的分布式就是我們把整個(gè)系統(tǒng)拆分成不同的服務(wù)然后將這些服務(wù)放在不同的服務(wù)器上減輕單體服務(wù)的壓力提高并發(fā)量和性能。比如電商系統(tǒng)可以簡(jiǎn)單地拆分成訂單系統(tǒng)、商品系統(tǒng)、登錄系統(tǒng)等等。
我們可以使用 Dubbo作為分布式系統(tǒng)的橋梁,那么什么是 Dubbo 呢?
什么是 Duboo?Apache Dubbo (incubating) |?d?b??| 是一款高性能、輕量級(jí)的開(kāi)源Java RPC 框架,它提供了三大核心能力:面向接口的遠(yuǎn)程方法調(diào)用,智能容錯(cuò)和負(fù)載均衡,以及服務(wù)自動(dòng)注冊(cè)和發(fā)現(xiàn)。簡(jiǎn)單來(lái)說(shuō) Dubbo 是一個(gè)分布式服務(wù)框架,致力于提供高性能和透明化的RPC遠(yuǎn)程服務(wù)調(diào)用方案,以及SOA服務(wù)治理方案。
Dubbo 目前已經(jīng)有接近 23k 的 Star ,Dubbo的Github 地址:https://github.com/apache/inc...。另外,在開(kāi)源中國(guó)舉行的2018年度最受歡迎中國(guó)開(kāi)源軟件這個(gè)活動(dòng)的評(píng)選中,Dubbo 更是憑借其超高人氣僅次于 vue.js 和 ECharts 獲得第三名的好成績(jī)。
Dubbo 是由阿里開(kāi)源,后來(lái)加入了 Apache 。正式由于 Dubbo 的出現(xiàn),才使得越來(lái)越多的公司開(kāi)始使用以及接受分布式架構(gòu)。
下面我們簡(jiǎn)單地來(lái)看一下 Dubbo 的架構(gòu),加深對(duì) Dubbo 的理解。
Dubbo 架構(gòu)下面我們?cè)賮?lái)看看 Dubbo 的架構(gòu),我們后面會(huì)使用 zookeeper 作為注冊(cè)中心,這也是 Dubbo 官方推薦的一種方式。
上述節(jié)點(diǎn)簡(jiǎn)單說(shuō)明:
Provider 暴露服務(wù)的服務(wù)提供方
Consumer 調(diào)用遠(yuǎn)程服務(wù)的服務(wù)消費(fèi)方
Registry 服務(wù)注冊(cè)與發(fā)現(xiàn)的注冊(cè)中心
Monitor 統(tǒng)計(jì)服務(wù)的調(diào)用次數(shù)和調(diào)用時(shí)間的監(jiān)控中心
Container 服務(wù)運(yùn)行容器
調(diào)用關(guān)系說(shuō)明:
服務(wù)容器負(fù)責(zé)啟動(dòng),加載,運(yùn)行服務(wù)提供者。
服務(wù)提供者在啟動(dòng)時(shí),向注冊(cè)中心注冊(cè)自己提供的服務(wù)。
服務(wù)消費(fèi)者在啟動(dòng)時(shí),向注冊(cè)中心訂閱自己所需的服務(wù)。
注冊(cè)中心返回服務(wù)提供者地址列表給消費(fèi)者,如果有變更,注冊(cè)中心將基于長(zhǎng)連接推送變更數(shù)據(jù)給消費(fèi)者。
服務(wù)消費(fèi)者,從提供者地址列表中,基于軟負(fù)載均衡算法,選一臺(tái)提供者進(jìn)行調(diào)用,如果調(diào)用失敗,再選另一臺(tái)調(diào)用。
服務(wù)消費(fèi)者和提供者,在內(nèi)存中累計(jì)調(diào)用次數(shù)和調(diào)用時(shí)間,定時(shí)每分鐘發(fā)送一次統(tǒng)計(jì)數(shù)據(jù)到監(jiān)控中心。
我們?cè)谥v Dubbo 的時(shí)候提到了 Dubbo 實(shí)際上是一款 RPC 框架,那么RPC 究竟是什么呢?相信看了下面我對(duì) RPC 的介紹你就明白了!
什么是 RPC?RPC(Remote Procedure Call)—遠(yuǎn)程過(guò)程調(diào)用,它是一種通過(guò)網(wǎng)絡(luò)從遠(yuǎn)程計(jì)算機(jī)程序上請(qǐng)求服務(wù),而不需要了解底層網(wǎng)絡(luò)技術(shù)的協(xié)議。比如兩個(gè)不同的服務(wù)A,B部署在兩臺(tái)不同的機(jī)器上,那么服務(wù) A 如果想要調(diào)用服務(wù) B 中的某個(gè)方法該怎么辦呢?使用 HTTP請(qǐng)求 當(dāng)然可以,但是可能會(huì)比較慢而且一些優(yōu)化做的并不好。 RPC 的出現(xiàn)就是為了解決這個(gè)問(wèn)題。
為什么要用 Dubbo?如果你要開(kāi)發(fā)分布式程序,你也可以直接基于 HTTP 接口進(jìn)行通信,但是為什么要用 Dubbo呢?
我覺(jué)得主要可以從 Dubbo 提供的下面四點(diǎn)特性來(lái)說(shuō)為什么要用 Dubbo:
負(fù)載均衡——同一個(gè)服務(wù)部署在不同的機(jī)器時(shí)該調(diào)用那一臺(tái)機(jī)器上的服務(wù)
服務(wù)調(diào)用鏈路生成——服務(wù)之間互相是如何調(diào)用的
服務(wù)訪問(wèn)壓力以及時(shí)長(zhǎng)統(tǒng)計(jì)——當(dāng)前系統(tǒng)的壓力主要在哪里,如何來(lái)擴(kuò)容和優(yōu)化
服務(wù)降級(jí)——某個(gè)服務(wù)掛掉之后調(diào)用備用服務(wù)
開(kāi)始實(shí)戰(zhàn) 1 :zookeeper 環(huán)境安裝搭建我使用的是 CentOS 7.4 阿里云服務(wù)器,注意:如果你也同樣阿里云服務(wù)器必須配置一個(gè)安全組,不然你的應(yīng)用程序會(huì)無(wú)法訪問(wèn)你的 zookeeper 服務(wù)器,這一點(diǎn)我在后面也提到了。
1. 下載通過(guò) http://mirror.bit.edu.cn/apache/zookeeper/ 這個(gè)鏈接下載,然后上傳到Linux上。(可以說(shuō)那個(gè) Xhell 附帶的文件傳輸功能)
或者直接在Linux中使用 wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.12/zookeeper-3.4.12.tar.gz 命令下載(版本號(hào) 3.4.12 是我寫(xiě)這篇文章的時(shí)候最新的穩(wěn)定版本,各位可以根據(jù)實(shí)際情況修改)
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. 進(jìn)入zookeeper目錄,創(chuàng)建data文件夾。
mkdir data
進(jìn)入 data 文件夾 然后執(zhí)行pwd命令,復(fù)制所得的當(dāng)前目錄位置(就是我用紅色圈出來(lái)的文字)
4. 進(jìn)入/zookeeper/conf目錄下,復(fù)制zoo_sample.cfg,命名為zoo.cfgcp zoo_sample.cfg zoo.cfg5. 修改配置文件
使用 vim zoo.cfg 命令修改配置文件
vim 文件------>進(jìn)入文件----->命令模式------>按i進(jìn)入編輯模式----->編輯文件 ------->按Esc進(jìn)入底行模式----->輸入:wq/q! (輸入wq代表寫(xiě)入內(nèi)容并退出,即保存;輸入q!代表強(qiáng)制退出不保存。)
修改配置文件中的 data 屬性:
dataDir=/usr/local/zookeeper/data6. 啟動(dòng)測(cè)試
進(jìn)入 /zookeeper/bin 目錄然后執(zhí)行下面的命令
./zkServer.sh start
執(zhí)行 ./zkServer.sh status 查看當(dāng)前 zookeeper 狀態(tài)。
或者運(yùn)行 netstat -lntup 命令查看網(wǎng)絡(luò)狀態(tài),可以看到 zookeeper 的端口號(hào) 2181 已經(jīng)被占用
注意沒(méi)有關(guān)閉防火墻可能出現(xiàn)的問(wèn)題?。。?/p>
如果你使用的阿里云服務(wù)器注意配置相關(guān)安全組:
進(jìn)入本實(shí)例安全組頁(yè)面
選擇配置規(guī)則
選擇添加安全組規(guī)則,然后按照下圖配置
在開(kāi)始實(shí)戰(zhàn)之前提個(gè)建議:盡量新建一個(gè)文件夾,然后后面將接口項(xiàng)目、服務(wù)提供者以及服務(wù)消費(fèi)者都放在這個(gè)文件夾。
主要分為下面幾步:
創(chuàng)建 Maven 項(xiàng)目;
創(chuàng)建接口類(lèi)
將項(xiàng)目打成 jar 包供其他項(xiàng)目使用
項(xiàng)目結(jié)構(gòu):
dubbo-interface 后面被打成 jar 包,它的作用只是提供接口。
1. dubbo-interface 項(xiàng)目創(chuàng)建File->New->Module... ,然后選擇 Maven類(lèi)型的項(xiàng)目,其他的按照提示一步一步走就好。
2. 創(chuàng)建接口類(lèi)package top.snailclimb.service; public interface HelloService { public String sayHello(String name); }3. 將項(xiàng)目打成 jar 包供其他項(xiàng)目使用
點(diǎn)擊右邊的 Maven Projects 然后選擇 install ,這樣 jar 寶就打好了。
主要分為下面幾步:
創(chuàng)建 springboot 項(xiàng)目;
加入 dubbo 、zookeeper以及接口的相關(guān)依賴 jar 包;
在 application.properties 配置文件中配置 dubbo 相關(guān)信息;
實(shí)現(xiàn)接口類(lèi);
服務(wù)提供者啟動(dòng)類(lèi)編寫(xiě)
項(xiàng)目結(jié)構(gòu):
1. dubbo-provider 項(xiàng)目創(chuàng)建創(chuàng)建一個(gè) SpringBoot 項(xiàng)目,注意勾選上 web 模塊。不會(huì)創(chuàng)建的話,可以查看下面這篇文章:,可以說(shuō)很詳細(xì)了。
https://blog.csdn.net/qq_34337272/article/details/79563606
2. pom 文件引入相關(guān)依賴需要引入 dubbo 、zookeeper以及接口的相關(guān)依賴 jar 包。注意將本項(xiàng)目和 dubbo-interface 項(xiàng)目的 dependency 依賴的 groupId 和 artifactId 改成自己的。dubbo 整合spring boot 的 jar 包在這里找dubbo-spring-boot-starter。zookeeper 的 jar包在 Maven 倉(cāng)庫(kù) 搜索 zkclient 即可找到。
3. 在 application.properties 配置文件中配置 dubbo 相關(guān)信息top.snailclimb dubbo-interface 1.0-SNAPSHOT com.alibaba.spring.boot dubbo-spring-boot-starter 2.0.0 com.101tec zkclient 0.10
配置很簡(jiǎn)單,這主要得益于 springboot 整合 dubbo 專(zhuān)屬的@EnableDubboConfiguration 注解提供的 Dubbo 自動(dòng)配置。
# 配置端口 server.port=8333 spring.dubbo.application.name=dubbo-provider spring.dubbo.application.registry=zookeeper://ip地址:21814. 實(shí)現(xiàn)接口
注意: @Service 注解使用的時(shí) 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. 服務(wù)提供者啟動(dòng)類(lèi)編寫(xiě)
注意:不要忘記加上 @EnableDubboConfiguration 注解開(kāi)啟Dubbo 的自動(dòng)配置。
package top.snailclimb; import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication // 開(kāi)啟dubbo的自動(dòng)配置 @EnableDubboConfiguration public class DubboProviderApplication { public static void main(String[] args) { SpringApplication.run(DubboProviderApplication.class, args); } }開(kāi)始實(shí)戰(zhàn) 4 :實(shí)現(xiàn)服務(wù)消費(fèi)者 dubbo-consumer
主要分為下面幾步:
創(chuàng)建 springboot 項(xiàng)目;
加入 dubbo 、zookeeper以及接口的相關(guān)依賴 jar 包;
在 application.properties 配置文件中配置 dubbo 相關(guān)信息;
編寫(xiě)測(cè)試類(lèi);
服務(wù)消費(fèi)者啟動(dòng)類(lèi)編寫(xiě)
測(cè)試效果
項(xiàng)目結(jié)構(gòu):
第1,2,3 步和服務(wù)提供者的一樣,這里直接從第 4 步開(kāi)始。
4. 編寫(xiě)一個(gè)簡(jiǎn)單 Controller 調(diào)用遠(yuǎn)程服務(wù)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. 服務(wù)消費(fèi)者啟動(dòng)類(lèi)編寫(xiě)
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. 測(cè)試效果
瀏覽器訪問(wèn) http://localhost:8330/hello 頁(yè)面返回 Hello world,控制臺(tái)輸出 Hello SnailClimb,和預(yù)期一直,使用SpringBoot+Dubbo 搭建第一個(gè)簡(jiǎn)單的分布式服務(wù)實(shí)驗(yàn)成功!
ThoughtWorks準(zhǔn)入職Java工程師。專(zhuān)注Java知識(shí)分享!開(kāi)源 Java 學(xué)習(xí)指南——JavaGuide(12k+ Star)的作者。公眾號(hào)多篇文章被各大技術(shù)社區(qū)轉(zhuǎn)載。公眾號(hào)后臺(tái)回復(fù)關(guān)鍵字“1”可以領(lǐng)取一份我精選的Java資源哦!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/72467.html
摘要:作為面試官,我是如何甄別應(yīng)聘者的包裝程度語(yǔ)言和等其他語(yǔ)言的對(duì)比分析和主從復(fù)制的原理詳解和持久化的原理是什么面試中經(jīng)常被問(wèn)到的持久化與恢復(fù)實(shí)現(xiàn)故障恢復(fù)自動(dòng)化詳解哨兵技術(shù)查漏補(bǔ)缺最易錯(cuò)過(guò)的技術(shù)要點(diǎn)大掃盲意外宕機(jī)不難解決,但你真的懂?dāng)?shù)據(jù)恢復(fù)嗎每秒 作為面試官,我是如何甄別應(yīng)聘者的包裝程度Go語(yǔ)言和Java、python等其他語(yǔ)言的對(duì)比分析 Redis和MySQL Redis:主從復(fù)制的原理詳...
摘要:作為面試官,我是如何甄別應(yīng)聘者的包裝程度語(yǔ)言和等其他語(yǔ)言的對(duì)比分析和主從復(fù)制的原理詳解和持久化的原理是什么面試中經(jīng)常被問(wèn)到的持久化與恢復(fù)實(shí)現(xiàn)故障恢復(fù)自動(dòng)化詳解哨兵技術(shù)查漏補(bǔ)缺最易錯(cuò)過(guò)的技術(shù)要點(diǎn)大掃盲意外宕機(jī)不難解決,但你真的懂?dāng)?shù)據(jù)恢復(fù)嗎每秒 作為面試官,我是如何甄別應(yīng)聘者的包裝程度Go語(yǔ)言和Java、python等其他語(yǔ)言的對(duì)比分析 Redis和MySQL Redis:主從復(fù)制的原理詳...
摘要:上面這三種均不造成重載,現(xiàn)在來(lái)說(shuō)明原因。結(jié)論對(duì)于引用返回,返回的對(duì)象必須是棧幀銷(xiāo)毀后還存在的。全局,靜態(tài),未銷(xiāo)毀的函數(shù)棧幀當(dāng)中的都是可以的指針與引用如圖兩者底層實(shí)現(xiàn)差不多,引用是用指針模擬的。不建議聲明和定義分離,分離會(huì)導(dǎo)致鏈接錯(cuò)誤。 ...
摘要:通過(guò)以上分析我們可以得出消息隊(duì)列具有很好的削峰作用的功能即通過(guò)異步處理,將短時(shí)間高并發(fā)產(chǎn)生的事務(wù)消息存儲(chǔ)在消息隊(duì)列中,從而削平高峰期的并發(fā)事務(wù)。 該文已加入開(kāi)源項(xiàng)目:JavaGuide(一份涵蓋大部分Java程序員所需要掌握的核心知識(shí)的文檔類(lèi)項(xiàng)目,Star 數(shù)接近 16k)。地址:https://github.com/Snailclimb... 本文內(nèi)容思維導(dǎo)圖:showImg(ht...
閱讀 3154·2021-11-23 09:51
閱讀 1034·2021-09-26 09:55
閱讀 4022·2021-09-22 14:58
閱讀 1584·2021-09-08 09:35
閱讀 1111·2021-08-26 14:16
閱讀 913·2019-08-23 18:17
閱讀 2116·2019-08-23 16:45
閱讀 727·2019-08-23 15:55