柚子快報(bào)邀請(qǐng)碼778899分享:Dubbo的學(xué)習(xí)筆記
柚子快報(bào)邀請(qǐng)碼778899分享:Dubbo的學(xué)習(xí)筆記
目錄
架構(gòu)
zookeeper的簡(jiǎn)單介紹
簡(jiǎn)單案例
Dubbo-admin的簡(jiǎn)單使用
Dubbo高級(jí)特性
序列化
地址緩存
超時(shí)與重試
多版本
負(fù)載均衡
集群容錯(cuò)
服務(wù)降級(jí)
Dubbo是阿里巴巴開源的一個(gè)高性能、輕量級(jí)RPC框架
架構(gòu)
provider:暴露服務(wù)的服務(wù)提供方container:服務(wù)運(yùn)行容器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)控中心
zookeeper的簡(jiǎn)單介紹
Dubbo建議使用Zookeeper作為服務(wù)注冊(cè)中心
Zookeeper安裝有兩個(gè)需要注意的地方,首先是需要修改conf目錄下的zoo_sample.cfg文件名,因?yàn)閆ookeeper的生效配置文件名叫zoo.cfg,其次,需要修改該文件中的數(shù)據(jù)存放路徑,最好和zookeeper安裝目錄同一路徑
zookeeper的啟動(dòng),去bin目錄下執(zhí)行如下命令
zkServer.sh start
查看zookeeper的狀態(tài)
./zkServer.sh status
創(chuàng)建一個(gè)簡(jiǎn)單MVC項(xiàng)目后續(xù)我們?cè)谠擁?xiàng)目上添加Dubbo
簡(jiǎn)單案例
一個(gè)Service模塊一個(gè)Web模塊,結(jié)構(gòu)如下
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/sayHello")
public String sayHello(){
return userService.sayHello();
}
}
@Service
public class UserServiceImpl implements UserService {
@Override
public String sayHello() {
return "hello dubbo";
}
}
啟動(dòng)服務(wù)查看運(yùn)行情況
接下來我們?cè)诖嘶A(chǔ)上加入Dubbo的使用
修改Service中的Service注解為dubbo中的注解,原先的Service注解是將UserService注冊(cè)到Spring中的IOC容器當(dāng)中,現(xiàn)在我們不需要由Spring管理,而是通過dubbo來遠(yuǎn)程調(diào)用,因此修改此處的Serivce注解
修改application.xml配置文件,添加dubbo的配置
補(bǔ)全Service的目錄結(jié)構(gòu)就可以啟動(dòng)dubbo-service模塊了
此時(shí)修改dubbo-web模塊,首先去掉pom文件中的dubbo-service模塊的引用,這時(shí)Controller中就會(huì)報(bào)錯(cuò),為了避免報(bào)錯(cuò),我們需要在本地創(chuàng)建一個(gè)對(duì)應(yīng)的UserSerivce接口來進(jìn)行注入,但由于不是Spring注入了,我們還需要修改注入注解為Dubbo的遠(yuǎn)程注入注解
@RestController
@RequestMapping("/user")
public class UserController {
/**
* 1.從注冊(cè)中心獲取userService的訪問url
* 2.進(jìn)行遠(yuǎn)程調(diào)用RPC
* 3.將結(jié)果封裝為一個(gè)代理對(duì)象,給變量賦值
* */
@Reference
private UserService userService;
@RequestMapping("/sayHello")
public String sayHello(){
return userService.sayHello();
}
}
這是我們需要在web模塊同樣添加一份dubbo的配置信息
修改完畢后,就可以啟動(dòng)web模塊了。在啟動(dòng)過程中會(huì)報(bào)一個(gè)錯(cuò)誤
這個(gè)錯(cuò)誤指的是端口占用,這是因?yàn)槲覀兪且慌_(tái)機(jī)器運(yùn)行了兩個(gè)dubbo服務(wù),在生產(chǎn)環(huán)境中不會(huì)出現(xiàn)這個(gè)錯(cuò)誤,但是這個(gè)錯(cuò)誤不會(huì)影響程序運(yùn)行。如果不希望出現(xiàn)該錯(cuò)誤信息,我們可以修改dubbo的配置文件,添加一個(gè)修改端口的參數(shù)即可
此時(shí)我們的項(xiàng)目結(jié)構(gòu)大致如下
我們實(shí)現(xiàn)兩個(gè)模塊調(diào)用時(shí),在web層創(chuàng)建了service層的接口,但是在開發(fā)時(shí)接口可能存在很多,方法也有很多,我們不一定保證在開發(fā)時(shí)保證不出錯(cuò),因此,我們存在一個(gè)更好的解決方案,那就是再創(chuàng)建一個(gè)公共模塊,web與service共同依賴該模塊,那么結(jié)構(gòu)就變成下面這張圖了
新創(chuàng)建一個(gè)接口模塊
我們將service與web模塊中的接口刪除,然后在pom文件中引入接口模塊,導(dǎo)入接口模塊中的接口即可。
Dubbo-admin的簡(jiǎn)單使用
dubbo-admin管理平臺(tái),是圖形化的服務(wù)管理頁面
從注冊(cè)中心中獲取到所有的提供者/消費(fèi)者進(jìn)行配置管理
路由規(guī)則、動(dòng)態(tài)配置、服務(wù)降級(jí)、訪問控制、權(quán)重調(diào)整、負(fù)載均衡等管理功能
下載完并解壓后根據(jù)下面步驟進(jìn)行即可
1、在dubbo-admin-server里面中找到application.properties修改zookeeper的地址
如果修改了需要在dubbo-admin-server目錄執(zhí)行mvn clean install -Dmaven.test.skip=true
2、在dubbo-admin-distribution中找到tager目錄下的jar包運(yùn)行完成后
3、在dubbo-admin-ui中執(zhí)行npm run dev
Dubbo高級(jí)特性
序列化
在開發(fā)時(shí),pojo模塊里面的實(shí)體類都要實(shí)現(xiàn)Serializable接口,目的是序列化,傳輸數(shù)據(jù)
地址緩存
注冊(cè)中心掛了的話,服務(wù)還是可以進(jìn)行正常訪問的。
原因:dubbo服務(wù)消費(fèi)者在第一次調(diào)用時(shí),會(huì)將服務(wù)提供方地址緩存到本地,以后再調(diào)用則不會(huì)訪問注冊(cè)中心。當(dāng)服務(wù)提供地址發(fā)生改變時(shí),注冊(cè)中心會(huì)通知服務(wù)消費(fèi)者。
超時(shí)與重試
服務(wù)消費(fèi)者在調(diào)用服務(wù)提供者的時(shí)候發(fā)生了阻塞、等待的情形,這個(gè)時(shí)候,服務(wù)消費(fèi)者會(huì)一直等待下去。在某個(gè)峰值時(shí)刻,大量請(qǐng)求都在同時(shí)請(qǐng)求服務(wù)消費(fèi)者,會(huì)造成線程的大量堆積,勢(shì)必會(huì)造成雪崩,Dubbo利用超時(shí)機(jī)制來解決這個(gè)問題,設(shè)置一個(gè)超時(shí)時(shí)間,在這個(gè)時(shí)間段內(nèi),無法完成服務(wù)訪問則自動(dòng)斷開連接。
設(shè)置連接超時(shí)timeout(默認(rèn)為1000ms)可以在服務(wù)生產(chǎn)方與服務(wù)消費(fèi)方兩個(gè)地方設(shè)置,兩個(gè)地方都設(shè)置timeout的話,服務(wù)消費(fèi)者處的設(shè)置優(yōu)先生效(但不推薦),一般只在服務(wù)生產(chǎn)者者里設(shè)置超時(shí)時(shí)間,因?yàn)橹挥蟹?wù)生產(chǎn)者處知道自己的服務(wù)壓力是否過大。
連接超時(shí)的話,會(huì)進(jìn)行重試操作retries,默認(rèn)是重試兩次,一共發(fā)起三次請(qǐng)求
多版本
當(dāng)我們需要讓服務(wù)消費(fèi)者從版本2處獲取服務(wù)時(shí),dubbo會(huì)讓一部分用戶先使用新功能,用戶反饋沒問題之后再將所有的用戶遷移到新的服務(wù)提供方,這稱之為灰度發(fā)布。dubbo中使用version屬性來設(shè)置和調(diào)用同一個(gè)接口的不同版本。
@Service(version = "1.0") //將這個(gè)類提供的方法對(duì)外發(fā)布,將訪問的地址ip,端口,路徑注冊(cè)到注冊(cè)中心
public class UserServiceImpl implements UserService {
@Override
public String sayHello() {
return "hello dubbo";
}
@Override
public User findUserById(int id) {
User user = new User(1, "zhangsan");
return user;
}
}
@RestController
@RequestMapping("/user")
public class UserController {
/**
* 1.從注冊(cè)中心獲取userService的訪問url
* 2.進(jìn)行遠(yuǎn)程調(diào)用RPC
* 3.將結(jié)果封裝為一個(gè)代理對(duì)象,給變量賦值
* */
@Reference(version = "1.0")
private UserService userService;
@RequestMapping("/sayHello")
public String sayHello(){
return userService.sayHello();
}
@RequestMapping("/findById")
public User findByUser(int id){
return userService.findUserById(id);
}
}
負(fù)載均衡
負(fù)載均衡的四種策略:
Random:根據(jù)權(quán)重比例隨機(jī)分配(這個(gè)是默認(rèn))RoundRobin:按權(quán)重輪詢(1、2、3按著順序來)LeastActive:最少活躍調(diào)用數(shù),相同時(shí)隨機(jī)ConsistentHash:一致性Hash,相同參數(shù)的請(qǐng)求總是發(fā)到統(tǒng)一提供者。
集群容錯(cuò)
集群容錯(cuò)模式:
Failover Cluster:即上面的超時(shí)重試。失敗重試一般用于讀操作,寫操作可能會(huì)出現(xiàn)多次寫入重復(fù)Failfast Cluster:快速失敗,只發(fā)起一次調(diào)用,通常用于寫的操作Failsafe Cluster:失敗安全,出現(xiàn)異常時(shí),直接忽略,返回一個(gè)空結(jié)果Failback Cluster:失敗自動(dòng)恢復(fù),后臺(tái)記錄失敗請(qǐng)求,定時(shí)重發(fā)Forking Cluster:并行調(diào)用多個(gè)服務(wù)器,只要一個(gè)成功即返回。Broadcast Cluster:廣播調(diào)用所有的提供者,逐個(gè)調(diào)用,任意一臺(tái)報(bào)錯(cuò)則報(bào)錯(cuò)
服務(wù)降級(jí)
服務(wù)降級(jí):(服務(wù)器在掛掉的邊緣時(shí),釋放一些不重要的服務(wù)來維持核心服務(wù)的使用)
mock=force:return null :表示消費(fèi)方對(duì)該服務(wù)的方法調(diào)用都直接返回null值,不發(fā)起遠(yuǎn)程調(diào)用。用來屏蔽不重要服務(wù)不可用時(shí)對(duì)調(diào)用方的影響mock=fail:return null :表示消費(fèi)方對(duì)服務(wù)的方法調(diào)用在失敗后,在返回null值,不拋異常。用來容忍不重要服務(wù)不穩(wěn)定時(shí)對(duì)調(diào)用方的影響
柚子快報(bào)邀請(qǐng)碼778899分享:Dubbo的學(xué)習(xí)筆記
參考鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。