Dubbo之高級(jí)特性
Dubbo
- 注意
當(dāng)啟動(dòng)服務(wù)時(shí),該服務(wù)會(huì)占用本機(jī)一個(gè)端口號(hào),故在一臺(tái)電腦啟動(dòng)多個(gè)服務(wù)時(shí)需要在配置文件中更占用本機(jī)的端口號(hào)
<!--服務(wù)占用本機(jī)的端口-當(dāng)本機(jī)啟動(dòng)多個(gè)服務(wù)時(shí)須保持不同-->
<dubbo:protocol port=""/>
<!--dubbo的配置-->
<!--1.配置項(xiàng)目的名稱,唯一-->
<dubbo:application name="dubbo-service"/>
<!--2.配置注冊(cè)中心的地址-->
<dubbo:registry address="zookeeper://192.168.23.129:2181" timeout="250000"/>
<!--3.配置dubbo包掃描,注解注冊(cè)服務(wù)-->
<!-- <dubbo:annotation package="com.yh1.impl" />-->
<!--3.2xml配置方式注冊(cè)服務(wù),類上不需要注解-->
<dubbo:service interface="com.yh.ours.UserService" ref="demoService"/>
<bean id="demoService" class="com.yh1.impl.UserServiceImpl"/>
序列化
查詢出數(shù)據(jù)后返回給消費(fèi)者時(shí)所執(zhí)行的便是序列化
- 作用:用于不同機(jī)器間傳輸對(duì)象的轉(zhuǎn)換,將對(duì)象序列化為 流數(shù)據(jù)進(jìn)行傳輸
- 被序列化的對(duì)象類必須實(shí)現(xiàn)序列化接口Serializable
- 接受到流數(shù)據(jù)后,反序列化為java對(duì)象
- 序列化和反序列化兩者皆需要用到對(duì)象類,故定義在一個(gè)獨(dú)立模塊中,讓兩者依賴它—>類似于公共接口模塊
- 即domain/pojo實(shí)體類皆需要實(shí)現(xiàn)接口Serializable且放在獨(dú)立模塊來作為資源被依賴
<groupId>org.yh</groupId>
<artifactId>debbo-interface</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!--被依賴資源-->
<dependency>
<groupId>org.yh</groupId>
<artifactId>dubbo-pojo</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>

序列化和反序列化操作dubbo已經(jīng)封裝好,只需讓pojo類實(shí)現(xiàn)接口即可
eg:
//必須實(shí)現(xiàn)Serializable
//一個(gè)實(shí)體類用于 模仿序列化和反序列化操作
public class User implements Serializable {
int id;
String name;
public User() {
}
public User(int id, String name) {
this.id = id;
this.name = name;
}
//省略get和set方法
Cotroller代碼
@RequestMapping("/find.do")
public User find(int id){
return userService.findById(id);
}

地址緩存
問:注冊(cè)中心掛了,服務(wù)是否可以正常訪問?
答:可以,當(dāng)?shù)谝淮卧L問后,會(huì)將服務(wù)地址緩存至本地
但是當(dāng)服務(wù)的地址變了以后就不行了,需要重新訪問注冊(cè)中心獲取
超時(shí)和重試
超時(shí)
問:消費(fèi)者創(chuàng)建線程調(diào)用提供者服務(wù),如果調(diào)用失敗或者提供者查詢時(shí)間過長或掛了,則消費(fèi)者將一直等待
- 可以在服務(wù)者方法中使用線程沉睡來模擬上述情況
@Service
public class UserServiceImpl implements UserService {
@Override
public User findById(int id) {
//此處讓服務(wù)睡5秒,用來演示超時(shí)操作
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
User user=new User(1,"jack");
return user;
}
}
解決:設(shè)置timeout屬性值來控制超時(shí)時(shí)間
- 在消費(fèi)方@reference注解中設(shè)置
- 在提供者@service注解中設(shè)置
- 在配置文件中配置
<!--2.配置注冊(cè)中心的地址-->
<dubbo:registry address="zookeeper://192.168.23.129:2181" timeout="250000"/>
- 建議配置在服務(wù)提供方@Service上
- 超時(shí)時(shí)消費(fèi)者報(bào)錯(cuò)如下
![在這里插入圖片描述]()
重試
問題:出現(xiàn)了網(wǎng)絡(luò)抖動(dòng)網(wǎng)突然斷了一下,斷了3s超時(shí)時(shí)間設(shè)置是1s,則這一次請(qǐng)求就會(huì)失敗,則會(huì)重新發(fā)送請(qǐng)求,一共發(fā)送3次
解決1:通過retries屬性類設(shè)置重試次數(shù)。默認(rèn)為2
多版本
灰度發(fā)布:新功能時(shí),讓一部分用戶使用新版本,穩(wěn)定后讓全部用戶使用新的版本。

使用:使用version屬性來設(shè)置和調(diào)用同一個(gè)接口的不同版本
eg:公共接口模塊中的UserService接口在服務(wù)提供者中有倆實(shí)現(xiàn)類UserServiceImpl1和UserServiceImpl2
在服務(wù)提供者的UserServiceImpl1@Service(version=“v1.0”)中設(shè)置version和UserServiceImpl2@Service(version=“v2.0”)
在消費(fèi)者的@Reference(version=“v1.0 or v2.0”)中設(shè)置version來選擇使用哪個(gè)版本
注:此處檢驗(yàn)失敗,原因未知
負(fù)載均衡
適用于集群環(huán)境,相同的服務(wù)部署在多臺(tái)機(jī)器上
模擬步驟:
1.在服務(wù)提供者的@Service注解中添加weight屬性,配置權(quán)重(可在服務(wù)內(nèi)打印一句話來區(qū)別不同的服務(wù))
2.啟動(dòng)該服務(wù)tomcat7:run
3.更改三個(gè)端口號(hào)后繼續(xù)1,2,3步驟,直至啟動(dòng)三個(gè)服務(wù)器為止,保持權(quán)重不同
4.在消費(fèi)者的@reference注解中配置loadbalance屬性(共有四個(gè)值下面有)
5.啟動(dòng)服務(wù),開始模擬
- 負(fù)載均衡策略(4種):來解決訪問哪個(gè)機(jī)器
可以更改同一個(gè)服務(wù)的tomcat,dubbo的qos,本機(jī)三個(gè)的端口來模擬同一服務(wù)部署在多臺(tái)機(jī)器
1.
<!--tomcat插件-->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>8000</port>
<path>/</path>
</configuration>
</plugin>
2.
<dubbo:protocol port="20881"/>
3.
<!--dubbo的配置-->
<!--1.配置項(xiàng)目的名稱,唯一-->
<dubbo:application name="dubbo-service">
<!--dubbo的pos服務(wù)一個(gè)服務(wù)會(huì)啟動(dòng)一次,故一臺(tái)機(jī)器時(shí)不同服務(wù)需要更改-->
<dubbo:parameter key="qos.port" value="33331"/>
</dubbo:application>
- 權(quán)重weight是服務(wù)提供者@Service注解的配置屬性
- Random按權(quán)重weight屬性隨機(jī)。按權(quán)重設(shè)置隨機(jī)概率
- RoundRobin按權(quán)重輪詢
- LeastActice最少活躍調(diào)用數(shù),相同則隨機(jī)–>使用機(jī)器中處理請(qǐng)求最快的的機(jī)器
- ConsisitentHash:一致性Hash,相同參數(shù)的請(qǐng)求總是發(fā)到同一提供者

- 在消費(fèi)者的@Reference注解中使用loadbalance屬性(該屬性值為loadbalance抽象類的四種實(shí)現(xiàn)類屬性即上的小寫)來設(shè)置采用上述哪種負(fù)載均衡策略
![在這里插入圖片描述]()
集群容錯(cuò)
問題: 消費(fèi)者調(diào)用集群中某一機(jī)器出錯(cuò)了,該如何處理?
- 集群容錯(cuò)模式:
- **Failover Cluster:**失敗重試。默認(rèn)值。當(dāng)出現(xiàn)失敗,重試其它服務(wù)器,默認(rèn)重試2次,使用retries配置。–一般用于讀操作
- **Failfast Cluster ??*快速失敗,發(fā)起-次調(diào)用,失敗立即報(bào)錯(cuò)。–通常用于寫操作。
- **Failsafe Cluster:**失敗安全,出現(xiàn)異常時(shí),直接忽略。返回一個(gè)空結(jié)果。–用于寫一些不重要的日志結(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ò)。–同步要求較高時(shí)使用,如同時(shí)更新三個(gè)機(jī)器上的數(shù)據(jù)
- 在消費(fèi)者的@Reference注解中使用cluster屬性(該屬性值為cluster抽象類的四種實(shí)現(xiàn)類屬性即上的小寫)來設(shè)置采用上述哪種集群容錯(cuò)策略
服務(wù)降級(jí)
場景描述:
- 當(dāng)服務(wù)器壓力劇增的情況下,根據(jù)實(shí)際業(yè)務(wù)情況及流量,對(duì)一些服務(wù)和頁面有策略的不處理或換種簡單的方式處理,從而釋放服務(wù)器資源以保證核心交易正常運(yùn)作或高效運(yùn)作
- 服務(wù)降級(jí)方式:
-
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)用方的影響
- 只需在消費(fèi)方配置
@Reference(mock =“ force :return null")
private UserService userService;



浙公網(wǎng)安備 33010602011771號(hào)