使用dubbo+zookeeper+spring boot構(gòu)建服務(wù)的方法詳解
前言
互聯(lián)網(wǎng)的發(fā)展,網(wǎng)站應(yīng)用的規(guī)模不斷擴(kuò)大,常規(guī)的垂直應(yīng)用架構(gòu)已無法應(yīng)對,分布式服務(wù)架構(gòu)以及流動計算架構(gòu)勢在必行,Dubbo是一個分布式服務(wù)框架,在這種情況下誕生的?,F(xiàn)在核心業(yè)務(wù)抽取出來,作為獨(dú)立的服務(wù),使前端應(yīng)用能更快速和穩(wěn)定的響應(yīng)。
Dubbo是什么
Dubbo是Alibaba開源的分布式服務(wù)框架,它最大的特點(diǎn)是按照分層的方式來架構(gòu),使用這種方式可以使各個層之間解耦合(或者最大限度地松耦合)。從服務(wù)模型的角度來看,Dubbo采用的是一種非常簡單的模型,要么是提供方提供服務(wù),要么是消費(fèi)方消費(fèi)服務(wù),所以基于這一點(diǎn)可以抽象出服務(wù)提供方(Provider)和服務(wù)消費(fèi)方(Consumer)兩個角色。關(guān)于注冊中心、協(xié)議支持、服務(wù)監(jiān)控等內(nèi)容
Dubbo能做什么
當(dāng)網(wǎng)站變大后,不可避免的需要拆分應(yīng)用進(jìn)行服務(wù)化(微服務(wù)),以提高開發(fā)效率,調(diào)優(yōu)性能,節(jié)省關(guān)鍵競爭資源等。
當(dāng)服務(wù)越來越多時,服務(wù)的URL地址信息就會爆炸式增長,配置管理變得非常困難,F(xiàn)5硬件負(fù)載均衡器的單點(diǎn)壓力也越來越大。
當(dāng)進(jìn)一步發(fā)展,服務(wù)間依賴關(guān)系變得錯蹤復(fù)雜,甚至分不清哪個應(yīng)用要在哪個應(yīng)用之前啟動,架構(gòu)師都不能完整的描述應(yīng)用的架構(gòu)關(guān)系。
接著,服務(wù)的調(diào)用量越來越大,服務(wù)的容量問題就暴露出來,這個服務(wù)需要多少機(jī)器支撐?什么時候該加機(jī)器?等等……
在遇到這些問題時,都可以用Dubbo來解決。
本次和大家分享的是dubbo框架應(yīng)用的初略配置和zookeeper注冊中心的使用;說到注冊中心現(xiàn)在我使用過的只有兩種:zookeeper和Eureka,zk我結(jié)合dubbo來使用,而Eureka結(jié)合springcloud使用,因此后面將和大家分享一些關(guān)于微服務(wù)的一些篇章,希望對你有好的幫助。
安裝注冊中心zookeeper
dubbo框架之provider和consumer
dubbo-admin部署
安裝注冊中心zookeeper
首先,我們需要在網(wǎng)上搜索下zookeeper下載地址,我這里是linux系統(tǒng),所以下載了zookeeper-3.3.6.tar.gz包,通過 tar -zxvf zookeeper-3.3.6.tar.gz 解壓出來,需要注意的是一般的包里面配置文件都是默認(rèn)的sample版本,zookeeper默認(rèn)配置文件名只zoo.cfg,為了不每次指定文件名來運(yùn)行,因此需要我們自己在conf目錄下創(chuàng)建一個名稱為zoo.cfg的配置文件,文件內(nèi)容可以從zoo_sample.cfg拷貝或者把這個文件重命名都行,內(nèi)容如下 vim zoo.cfg :
# The number of milliseconds of each tick tickTime=2000 #心跳頻率 # The number of ticks that the initial # synchronization phase can take initLimit=10 #限制連接 # The number of ticks that can pass between # sending a request and getting an acknowledgement syncLimit=5 # the directory where the snapshot is stored. dataDir=/tmp/zookeeper #數(shù)據(jù)存儲文件夾 # the port at which the clients will connect clientPort=2081 #zookeeper對外的端口
這里就不修改參數(shù)信息了,采用默認(rèn);簡單介紹下linux下怎么編輯文件內(nèi)容的常用的幾個命令:
vim zoo.cfg:查看文件內(nèi)容
insert:執(zhí)行插入命令
esc:取消命令,再接著按:q:退出,:wq:保存并退出
當(dāng)有了zoo.cfg后,我們只需要進(jìn)入她的bin目錄里面查找zkServer.sh文件,通過執(zhí)行: ./zkServer.sh start 命令啟動zookeeper注冊中心,正常啟動提示如:
通常情況是zookeeper作為注冊中心在單獨(dú)的一臺服務(wù)器上,而程序(這里指我本地)需要調(diào)用另外注冊中心需要檢查zookeeper開放的端口是否能通,我本地是window10因此可以不需要通過zookeeper客戶端去驗(yàn)證端口,只需要通過 telnet ip 2081 就能檢測出是否端口開放;
dubbo框架之provider和consumer
首先為了方便,我們需要定義一個統(tǒng)一的接口,該接口就是業(yè)務(wù)抽出來的公用接口,我們單獨(dú)對這種接口包裝成一個module,我這里是dubbo_api,我們在這個module中定義如下的接口:
public interface UserService { List<MoUser> getUsers(); }
然后,創(chuàng)建一個provider模塊,這個模塊去依賴dubbo_api模塊,并且實(shí)現(xiàn)UserService接口,代碼如:
public class UserServiceImpl implements UserService { @Value("${server.port}") private int port; /** * @return */ @Override public List<MoUser> getUsers() { List<MoUser> list = new ArrayList<>(); for (int i = 0; i < 5; i++) { MoUser user = new MoUser(); user.setUserName("shenniu" + i); user.setUserPwd("端口:" + port); list.add(user); } return list; } }
作為服務(wù)提供者,要使用dubbo框架就需要先引入dubbo,然后再做一些配置,首先我們需要在dubbo_provider模塊通過maven引入dubbo依賴,注冊中心用的zookeeper所以也需要通過maven引入相應(yīng)的依賴:
<dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.8</version> </dependency> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.3</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.3</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.example</groupId> <artifactId>dubbo_api</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
完成依賴后,剩下的就是對dubbo的provider的配置了,創(chuàng)建resources/dubbo-conf/server.xml的配置文件,文件內(nèi)容:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- 提供者名稱 --> <dubbo:application name="demo-provider" /> <!-- zookeeper注冊中心的服務(wù)地址 --> <dubbo:registry protocol="zookeeper" address="192.168.168.168:2081" /> <!-- 用dubbo協(xié)議在20880端口暴露服務(wù),協(xié)議通信端口 --> <dubbo:protocol name="dubbo" port="20880" /> <!-- 用戶服務(wù)接口 --> <dubbo:service interface="service.UserService" ref="userService" /> <!-- 用戶服務(wù)接口實(shí)現(xiàn) --> <bean id="userService" class="com.example.demo.service.UserServiceImpl"/> </beans>
在DubboProviderApplication入口增加資源導(dǎo)入 @ImportResource("classpath:dubbo-conf/*.xml") ,到這里我們的服務(wù)提供端就完成了,查看下啟動日志:
服務(wù)提供者啟動暫無異常,再來看調(diào)用方創(chuàng)建一個dubbo_consumer的moduel,同樣去引入dubbo_api公共接口的模塊依賴,然后創(chuàng)建一個UserController,并暴露一個get的user接口:
@RestController public class UserController { @Autowired private UserService userService; @GetMapping("/users") public List<MoUser> getUsers(){ return userService.getUsers(); } }
這里的UserService是公共接口的注入;編碼完成后剩下的就是consumer端引入dubbo和zookeeper依賴了:
<dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.8</version> </dependency> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.3</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.3</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring</artifactId> </exclusion> </exclusions> </dependency>
我們同樣創(chuàng)建名稱resources/dubbo-conf/client.xml的配置文件,并在application入口引入這個資源:
@ImportResource("classpath:dubbo-conf/*.xml") @SpringBootApplication public class DubboConsumerApplication { public static void main(String[] args) { SpringApplication.run(DubboConsumerApplication.class, args); } }
client.xml的配置內(nèi)容如:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- 服務(wù)名 --> <dubbo:application name="demo-consumer" /> <!-- zookeeper注冊中心暴露服務(wù)地址 --> <dubbo:registry protocol="zookeeper" address="192.168.168.168:2081" /> <!-- 用戶服務(wù)接口 --> <dubbo:reference id="userService" interface="service.UserService" /> </beans>
這個時候一個簡單的服務(wù)提供者,服務(wù)調(diào)用者配置和編碼都完成了,3個module如下:
然后分別啟動provider,consumer;再通過consumer暴露的controller接口請求接口,我這里的地址是 http://localhost:8082/users :
效果是Consumer通過注入的UserService接口依賴調(diào)用getUsers()拿到了Provider返回的結(jié)果,也表示此次dubbo框架的簡單使用算成功了。
dubbo-admin部署
作為一個流行的rpc框架dubbo有這一個開源的監(jiān)控工具dubbo-admin,不得不說現(xiàn)在網(wǎng)上現(xiàn)成的dubbo-admin.war包要么現(xiàn)在下來不能用要么就是下載需要csdn積分,版本多種多樣有點(diǎn)坑啊,果斷去git拉源碼自己打包,git地址: https://github.com/apache/incubator-dubbo-ops ,拉下來后我們只需要關(guān)注dubbo-admin工程,其他的暫可忽略;打開項(xiàng)目后,我們需要改的地方只有如下截圖配置(也可以對打包后的配置文件修改):
#zookeeper配置地址和端口 dubbo.registry.address=zookeeper://127.0.0.1:2081 #后臺登錄密碼 dubbo.admin.root.password=root dubbo.admin.guest.password=guest
執(zhí)行打包后,能得到名稱:dubbo-admin-2.0.0.war包,然后放在tomcat中,再通過瀏覽器瀏覽,賬號和密碼:都是root;登錄后能看到我們之前的啟動的provider和consumer在里面,這就是dubbo-admin監(jiān)控注冊中心服務(wù)的界面,能夠直接對這些服務(wù)做點(diǎn)擊操作,其他的不多說自行嘗試吧?!?/p>
git地址: https://github.com/shenniubuxing3 nuget發(fā)布包:https://www.nuget.org/profiles/shenniubuxing3
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
使用@Transactional 設(shè)置嵌套事務(wù)不回滾
這篇文章主要介紹了使用@Transactional 設(shè)置嵌套事務(wù)不回滾問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07Java多線程之定時器Timer的實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Java多線程中定時器Timer類的使用以及模擬實(shí)現(xiàn),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-10-10若依 MyBatis改為MyBatis-Plus的實(shí)現(xiàn)步驟
本文主要介紹了若依 MyBatis改為MyBatis-Plus的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-08-08使用springboot整合websocket實(shí)現(xiàn)群聊教程
websocket怎么說呢,就是服務(wù)器可以主動向客戶端發(fā)起對話,下面就是springboot整合websocket實(shí)現(xiàn)群聊的操作代碼,一起來看一下get新技能吧2021-08-08Java9新特性Stream流API優(yōu)化與增強(qiáng)
這篇文章主要為大家介紹了Java9新特性Stream流API優(yōu)化與增強(qiáng)的用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進(jìn)步,早日升職加薪2022-03-03Springboot內(nèi)置的工具類之CollectionUtils示例講解
這篇文章主要介紹了Springboot內(nèi)置的工具類之CollectionUtils,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-12-12spring MVC cors跨域?qū)崿F(xiàn)源碼解析
本文主要介紹了spring MVC cors跨域?qū)崿F(xiàn)源碼解析。具有很好的參考價值,下面跟著小編一起來看下吧2017-02-02java 日期各種格式之間的相互轉(zhuǎn)換實(shí)例代碼
這篇文章主要介紹了java 日期各種格式之間的相互轉(zhuǎn)換實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-02-02