使用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)對(duì),分布式服務(wù)架構(gòu)以及流動(dòng)計(jì)算架構(gòu)勢(shì)在必行,Dubbo是一個(gè)分布式服務(wù)框架,在這種情況下誕生的。現(xiàn)在核心業(yè)務(wù)抽取出來,作為獨(dú)立的服務(wù),使前端應(yīng)用能更快速和穩(wěn)定的響應(yīng)。
Dubbo是什么
Dubbo是Alibaba開源的分布式服務(wù)框架,它最大的特點(diǎn)是按照分層的方式來架構(gòu),使用這種方式可以使各個(gè)層之間解耦合(或者最大限度地松耦合)。從服務(wù)模型的角度來看,Dubbo采用的是一種非常簡(jiǎn)單的模型,要么是提供方提供服務(wù),要么是消費(fèi)方消費(fèi)服務(wù),所以基于這一點(diǎn)可以抽象出服務(wù)提供方(Provider)和服務(wù)消費(fèi)方(Consumer)兩個(gè)角色。關(guān)于注冊(cè)中心、協(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)鍵競(jìng)爭(zhēng)資源等。
當(dāng)服務(wù)越來越多時(shí),服務(wù)的URL地址信息就會(huì)爆炸式增長(zhǎng),配置管理變得非常困難,F(xiàn)5硬件負(fù)載均衡器的單點(diǎn)壓力也越來越大。
當(dāng)進(jìn)一步發(fā)展,服務(wù)間依賴關(guān)系變得錯(cuò)蹤復(fù)雜,甚至分不清哪個(gè)應(yīng)用要在哪個(gè)應(yīng)用之前啟動(dòng),架構(gòu)師都不能完整的描述應(yīng)用的架構(gòu)關(guān)系。
接著,服務(wù)的調(diào)用量越來越大,服務(wù)的容量問題就暴露出來,這個(gè)服務(wù)需要多少機(jī)器支撐?什么時(shí)候該加機(jī)器?等等……
在遇到這些問題時(shí),都可以用Dubbo來解決。
本次和大家分享的是dubbo框架應(yīng)用的初略配置和zookeeper注冊(cè)中心的使用;說到注冊(cè)中心現(xiàn)在我使用過的只有兩種:zookeeper和Eureka,zk我結(jié)合dubbo來使用,而Eureka結(jié)合springcloud使用,因此后面將和大家分享一些關(guān)于微服務(wù)的一些篇章,希望對(duì)你有好的幫助。
安裝注冊(cè)中心zookeeper
dubbo框架之provider和consumer
dubbo-admin部署
安裝注冊(cè)中心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)建一個(gè)名稱為zoo.cfg的配置文件,文件內(nèi)容可以從zoo_sample.cfg拷貝或者把這個(gè)文件重命名都行,內(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ù)存儲(chǔ)文件夾 # the port at which the clients will connect clientPort=2081 #zookeeper對(duì)外的端口
這里就不修改參數(shù)信息了,采用默認(rèn);簡(jiǎn)單介紹下linux下怎么編輯文件內(nèi)容的常用的幾個(gè)命令:
vim zoo.cfg:查看文件內(nèi)容
insert:執(zhí)行插入命令
esc:取消命令,再接著按:q:退出,:wq:保存并退出
當(dāng)有了zoo.cfg后,我們只需要進(jìn)入她的bin目錄里面查找zkServer.sh文件,通過執(zhí)行: ./zkServer.sh start 命令啟動(dòng)zookeeper注冊(cè)中心,正常啟動(dòng)提示如:
通常情況是zookeeper作為注冊(cè)中心在單獨(dú)的一臺(tái)服務(wù)器上,而程序(這里指我本地)需要調(diào)用另外注冊(cè)中心需要檢查zookeeper開放的端口是否能通,我本地是window10因此可以不需要通過zookeeper客戶端去驗(yàn)證端口,只需要通過 telnet ip 2081 就能檢測(cè)出是否端口開放;
dubbo框架之provider和consumer
首先為了方便,我們需要定義一個(gè)統(tǒng)一的接口,該接口就是業(yè)務(wù)抽出來的公用接口,我們單獨(dú)對(duì)這種接口包裝成一個(gè)module,我這里是dubbo_api,我們?cè)谶@個(gè)module中定義如下的接口:
public interface UserService {
List<MoUser> getUsers();
}
然后,創(chuàng)建一個(gè)provider模塊,這個(gè)模塊去依賴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依賴,注冊(cè)中心用的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>
完成依賴后,剩下的就是對(duì)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注冊(cè)中心的服務(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ù)提供端就完成了,查看下啟動(dòng)日志:
服務(wù)提供者啟動(dòng)暫無異常,再來看調(diào)用方創(chuàng)建一個(gè)dubbo_consumer的moduel,同樣去引入dubbo_api公共接口的模塊依賴,然后創(chuàng)建一個(gè)UserController,并暴露一個(gè)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入口引入這個(gè)資源:
@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注冊(cè)中心暴露服務(wù)地址 --> <dubbo:registry protocol="zookeeper" address="192.168.168.168:2081" /> <!-- 用戶服務(wù)接口 --> <dubbo:reference id="userService" interface="service.UserService" /> </beans>
這個(gè)時(shí)候一個(gè)簡(jiǎn)單的服務(wù)提供者,服務(wù)調(diào)用者配置和編碼都完成了,3個(gè)module如下:
然后分別啟動(dòng)provider,consumer;再通過consumer暴露的controller接口請(qǐng)求接口,我這里的地址是 http://localhost:8082/users :
效果是Consumer通過注入的UserService接口依賴調(diào)用getUsers()拿到了Provider返回的結(jié)果,也表示此次dubbo框架的簡(jiǎn)單使用算成功了。
dubbo-admin部署
作為一個(gè)流行的rpc框架dubbo有這一個(gè)開源的監(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)目后,我們需要改的地方只有如下截圖配置(也可以對(duì)打包后的配置文件修改):
#zookeeper配置地址和端口 dubbo.registry.address=zookeeper://127.0.0.1:2081 #后臺(tái)登錄密碼 dubbo.admin.root.password=root dubbo.admin.guest.password=guest
執(zhí)行打包后,能得到名稱:dubbo-admin-2.0.0.war包,然后放在tomcat中,再通過瀏覽器瀏覽,賬號(hào)和密碼:都是root;登錄后能看到我們之前的啟動(dòng)的provider和consumer在里面,這就是dubbo-admin監(jiān)控注冊(cè)中心服務(wù)的界面,能夠直接對(duì)這些服務(wù)做點(diǎn)擊操作,其他的不多說自行嘗試吧?!?/p>
git地址: https://github.com/shenniubuxing3 nuget發(fā)布包:https://www.nuget.org/profiles/shenniubuxing3
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- 淺談Java(SpringBoot)基于zookeeper的分布式鎖實(shí)現(xiàn)
- SpringBoot中dubbo+zookeeper實(shí)現(xiàn)分布式開發(fā)的應(yīng)用詳解
- SpringBoot集成Curator實(shí)現(xiàn)Zookeeper基本操作的代碼示例
- SpringBoot系列教程之dubbo和Zookeeper集成方法
- SpringBoot整合Dubbo+Zookeeper實(shí)現(xiàn)RPC調(diào)用
- springboot應(yīng)用訪問zookeeper的流程
- SpringBoot整合Zookeeper詳細(xì)教程
- Java Spring Boot 集成Zookeeper
- SpringBoot讀取ZooKeeper(ZK)屬性的方法實(shí)現(xiàn)
相關(guān)文章
基于XML的MyBatis的環(huán)境搭建過程詳解(IDEA)
這篇文章主要介紹了基于XML的MyBatis的環(huán)境搭建過程詳解(IDEA),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
mybatis注解如何實(shí)現(xiàn)對(duì)象批量更改
這篇文章主要介紹了mybatis注解實(shí)現(xiàn)對(duì)象批量更改的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
SpringBoot的兩種啟動(dòng)方式原理解析(配置方案)
本文介紹了Spring?Boot中兩種啟動(dòng)方式,使用內(nèi)置Tomcat啟動(dòng)和使用外置Tomcat部署,在使用內(nèi)置Tomcat啟動(dòng)時(shí),可以通過IDEA的main函數(shù)啟動(dòng),也可以使用nohup命令在后臺(tái)運(yùn)行,這篇文章主要介紹了SpringBoot的兩種啟動(dòng)方式原理?,需要的朋友可以參考下2025-01-01
Spring?WebFlux怎么進(jìn)行異常處理源碼解析
這篇文章主要為大家介紹了Spring?WebFlux怎么進(jìn)行異常處理源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
java web FTPClient實(shí)現(xiàn)上傳文件到指定服務(wù)器
這篇文章主要為大家詳細(xì)介紹了java web FTPClient實(shí)現(xiàn)上傳文件到指定服務(wù)器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06
Windows下gradle的安裝與配置的超詳細(xì)教程
這篇文章主要介紹了Windows下gradle的安裝與配置,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
mybatis和mybatis-plus同時(shí)使用的坑
本文主要介紹了mybatis和mybatis-plus同時(shí)使用的坑,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05
RabbitMQ中的Connection和Channel信道詳解
這篇文章主要介紹了RabbitMQ中的Connection和Channel信道詳解,信道是建立在 Connection 之上的虛擬連接,RabbitMQ 處理的每條 AMQP 指令都是通過信道完成的,需要的朋友可以參考下2023-08-08

