1.透明化的遠(yuǎn)程方法調(diào)用,就像調(diào)用本地方法一樣調(diào)用遠(yuǎn)程方法,只需簡單配置,沒有任何API侵入。
2.軟負(fù)載均衡及容錯機(jī)制,可在內(nèi)網(wǎng)替代F5等硬件負(fù)載均衡器,降低成本,減少單點。
3.服務(wù)自動注冊與發(fā)現(xiàn),不再需要寫死服務(wù)提供方地址,注冊中心基于接口名查詢服務(wù)提供者的IP地址,并且能夠平滑添加或刪除服務(wù)提供者。
節(jié)點 | 角色說明 |
---|---|
Provider | 暴露服務(wù)的服務(wù)提供方 |
Consumer | 調(diào)用遠(yuǎn)程服務(wù)的服務(wù)消費方 |
Registry | 服務(wù)注冊與發(fā)現(xiàn)的注冊中心 |
Monitor | 統(tǒng)計服務(wù)的調(diào)用次數(shù)和調(diào)用時間的監(jiān)控中心 |
Container | 服務(wù)運行容器 |
dubbo默認(rèn)服務(wù)間調(diào)用使用的是同步方式調(diào)用
? 協(xié)議是兩個網(wǎng)絡(luò)實體進(jìn)行通信的基礎(chǔ),數(shù)據(jù)在網(wǎng)絡(luò)上從一個實體傳輸?shù)搅硪粋€實體,以字節(jié)流的形式傳遞到對端。在這個字節(jié)流的世界里,如果沒有協(xié)議,就無法將這個一維的字節(jié)流重塑成為二維或者多維的數(shù)據(jù)結(jié)構(gòu)以及領(lǐng)域?qū)ο?
序列化方式將對象數(shù)據(jù)進(jìn)行轉(zhuǎn)換
Dubbo對于數(shù)據(jù)之間傳輸?shù)男蛄谢仓С侄喾N形式:
JDk方式序列化
hessian方式序列化 (dubbo 默認(rèn))
Json方式序列化
協(xié)議名稱 |
---|
dubbo協(xié)議(默認(rèn)) |
rest協(xié)議 |
HTTP協(xié)議 |
Hessian協(xié)議 |
Redis協(xié)議 |
Thrift協(xié)議 |
gRpc協(xié)議 |
memcached協(xié)議 |
RMI協(xié)議 |
WebService協(xié)議 |
? Dubbo 缺省協(xié)議采用單一長連接和 NIO 異步通訊,適合于小數(shù)據(jù)量大并發(fā)的服務(wù)調(diào)用,以及服務(wù)消費者機(jī)器數(shù)遠(yuǎn)大于服務(wù)提供者機(jī)器數(shù)的情況。反之,Dubbo 缺省協(xié)議不適合傳送大數(shù)據(jù)量的服務(wù),比如傳文件,傳視頻等,除非請求量很低。
特性:
缺省協(xié)議,使用基于 mina1.1.7
和 hessian3.2.1
的 tbremoting 交互。
約束:
Serializable
接口List
,Map
,Number
,Date
,Calendar
等接口,只能用 JDK 自帶的實現(xiàn),因為 hessian 會做特殊處理,自定義實現(xiàn)類中的屬性值都會丟失。? 對于服務(wù)提供方,它需要發(fā)布服務(wù),而且由于應(yīng)用系統(tǒng)的復(fù)雜性,服務(wù)的數(shù)量、類型也不斷膨脹,對于服務(wù)消費方,它最關(guān)心如何獲取到它所需要的服務(wù),而面對復(fù)雜的應(yīng)用系統(tǒng),需要管理大量的服務(wù)調(diào)用。而且,對于服務(wù)提供方和服務(wù)消費方來說,他們還有可能兼具這兩種角色,即既需要提供服務(wù),有需要消費服務(wù)。
通過將服務(wù)統(tǒng)一管理起來,可以有效地優(yōu)化內(nèi)部應(yīng)用對服務(wù)發(fā)布/使用的流程和管理。服務(wù)注冊中心可以通過特定協(xié)議來完成服務(wù)對外的統(tǒng)一.
在dubbo2.7版本中支持5種注冊中心
注冊中心名稱 |
---|
Nacos注冊中心(新dubbo之后) alibaba cloud 的 官方 注冊和配置中心 eureka(可用性) |
Zookeeper注冊中心(推薦) 分布式一致性協(xié)調(diào)服務(wù)器系統(tǒng) (一致性) |
Multicast 注冊中心 |
Redis 注冊中心 |
Simple 注冊中心 |
? Zookeeper 是 Apache Hadoop 的子項目,是一個樹型的目錄服務(wù),支持變更推送,適合作為 Dubbo 服務(wù)的注冊中心,工業(yè)強(qiáng)度較高,可用于生產(chǎn)環(huán)境,并推薦使用
2. Dubbo服務(wù)治理 Dubbo啟動檢查? Dubbo 缺省會在啟動時檢查依賴的服務(wù)是否可用,不可用時會拋出異常,阻止 Spring 初始化完成,以便上線時,能及早發(fā)現(xiàn)問題,默認(rèn)check="true"
。
可以通過check="false"
關(guān)閉檢查,比如,測試時,有些服務(wù)不關(guān)心,或者出現(xiàn)了循環(huán)依賴
,必須有一方先啟動。
另外,如果你的 Spring 容器是懶加載的,或者通過 API 編程延遲引用服務(wù),請關(guān)閉 check,否則服務(wù)臨時不可用時,會拋出異常,拿到 null 引用,如果check="false"
,總是會返回引用,當(dāng)服務(wù)恢復(fù)時,能自動連上。
? 在微服務(wù)應(yīng)用中都是多實例部署,也就是說同一份代碼部署多臺機(jī)器或容器中,這樣做的好處是提高服務(wù)處理能力。同時由于集群部署,所以整個集群也有容錯的能力。當(dāng)我們在調(diào)用集群中一個實例時出錯,我們可以重試另外一個實例這樣大大提高了應(yīng)用的可靠性。假設(shè)系統(tǒng)沒有容錯處理能力那么即使有集群的部署在調(diào)用應(yīng)用失敗情況下不能重試其他實例,這樣可靠性大大降低,并極大的浪費系統(tǒng)資源.
在Dubbo中有6種容錯模式分別是:
Failover Cluster
失敗自動切換:當(dāng)我們在調(diào)用Dubbo服務(wù)時出現(xiàn)失敗,容錯策略會重試其它服務(wù)器 。
使用場景:對于一些必達(dá)性要求高的服務(wù)調(diào)用,但是服務(wù)提供方要求做冪等處理 。
Failfast Cluster
快速失敗:只發(fā)起一次調(diào)用,如果調(diào)用Dubbo服務(wù)失敗立即報錯。
使用場景:通常用于非冪等性的寫操作,比如新增記錄。
Failsafe Cluster
失敗安全:當(dāng)調(diào)用Dubbo服務(wù)出現(xiàn)異常時,直接忽略。
使用場景:通常用于運行數(shù)據(jù)丟失常見,例如:日志記錄等操作。
Failback Cluster
失敗自動恢復(fù):當(dāng)調(diào)用Dubbo服務(wù)失敗,后臺記錄失敗請求并定時重發(fā)。
使用場景:通常用于必達(dá)通知場景,例如:消息通知操作。
Forking Cluster
集群并行:并行調(diào)用多個Dubbo服務(wù),只要其中有一個成功即返回。
使用場景:通常用于從多個源獲取相同數(shù)據(jù),以獲取最快的響應(yīng)速度,例如:同時從多個備庫查詢數(shù)據(jù)。
Broadcast Cluster
集群廣播:循環(huán)調(diào)用所有Dubbo服務(wù)提供者,任意一臺報錯則報錯。
使用場景:通用用于向多個實例通知消息,例如:更新集群中所有應(yīng)用緩存或日志。
5. Zookeeper安裝 1.安裝1.在local下創(chuàng)建zookeeper文件夾
2.上傳zookeeper文件到創(chuàng)建的文件夾
3.使用 tar -xzvf解壓zookeeper
4.進(jìn)入zookeeper的conf文件夾,復(fù)制zoo_sample.cfg為zoo.cfg,因為啟動時默認(rèn)會去找這個文件名
5.在解壓后的目錄中創(chuàng)建data文件夾
6.設(shè)置zoo.cfg文件,設(shè)置dataDir為創(chuàng)建的data文件夾路徑
7.進(jìn)入bin目錄,使用./zkServer.sh start啟動zookeeper服務(wù)
2.集群搭建修改各個linux下的zoo.cfg配置文件,向文件中添加
server.1=192.168.25.100:2888:3888
server.2=192.168.25.101:2888:3888
server.3=192.168.25.102:2888:3888
其中1,2,3為各集群節(jié)點的id,需要在data目錄下創(chuàng)建myid文件并設(shè)置文件里面內(nèi)容為各個節(jié)點的id。
6. Spring整合Dubbo 6.1 Provider生產(chǎn)者1.pom依賴
com.alibaba dubbo 2.6.0 com.caucho hessian 4.0.38 org.apache.zookeeper zookeeper 3.4.6 com.github.sgroschupf zkclient 0.1
2.spring整合dubbo配置文件
服務(wù)接口暴露注冊時,可采用dubbo的**@Service**注解進(jìn)行服務(wù)接口注冊
6.2 Consumer消費者1.pom依賴
org.example dubbo-provider 1.0-SNAPSHOT com.alibaba * com.alibaba dubbo 2.6.0 com.caucho hessian 4.0.38 org.apache.zookeeper zookeeper 3.4.6 com.github.sgroschupf zkclient 0.1
2.spring整合dubbo消費端配置文件
7. SpringBoot整合Dubbo
7.1 Provider生產(chǎn)者1.pom依賴
4.0.0 org.example springboot-dubbo-provider 1.0-SNAPSHOT org.springframework.boot spring-boot-starter-parent 2.1.8.RELEASE org.springframework.boot spring-boot-starter-web com.alibaba.boot dubbo-spring-boot-starter 0.2.1.RELEASE com.alibaba dubbo 2.6.5 com.caucho hessian 4.0.38 org.apache.zookeeper zookeeper 3.4.6 com.github.sgroschupf zkclient 0.1 org.apache.curator curator-framework 4.1.0
2.yml核心配置文件
dubbo:
application:
name: dubbo_provider
protocol:
name: dubbo
port: 20880
registry:
address: zookeeper://192.168.25.100:2181
protocol: zookeeper
scan:
base-packages: com.li.service
spring:
application:
name: dubbo_provider
server:
port: 8084
3.服務(wù)暴露注冊
package com.li.service.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.li.pojo.Goods;
import com.li.service.GoodsService;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
@Service
@Component
public class GoodsServiceImpl implements GoodsService {@Override
public void save() {System.out.println("save方法被遠(yuǎn)程調(diào)用了");
}
@Override
public String get() {return "遠(yuǎn)程調(diào)用get方法";
}
@Override
public Goods findGoods() {Goods goods = new Goods(1,"小米2",new BigDecimal(2333));
return goods;
}
}
7.2 Consumer消費者1.pom依賴
4.0.0 org.example springboot-dubbo-consumer 1.0-SNAPSHOT org.springframework.boot spring-boot-starter-parent 2.1.8.RELEASE org.springframework.boot spring-boot-starter-web com.alibaba.boot dubbo-spring-boot-starter 0.2.1.RELEASE com.alibaba dubbo 2.6.5 com.caucho hessian 4.0.38 org.apache.zookeeper zookeeper 3.4.6 com.github.sgroschupf zkclient 0.1 org.apache.curator curator-framework 4.1.0
2.yml核心配置文件
dubbo:
application:
name: dubbo_consumer
protocol:
name: dubbo
port: 20881
registry:
address: zookeeper://192.168.25.100:2181
protocol: zookeeper
spring:
application:
name: dubbo_consumer
server:
port: 8083
3.服務(wù)消費
package com.li.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.li.service.GoodsService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
public class TestController {@Reference
private GoodsService goodsService;
@RequestMapping("/aaa")
public void test01(){String s = goodsService.get();
System.out.println(s);
}
}
8.Dubbo的Spi機(jī)制的過濾器擴(kuò)展應(yīng)用:系統(tǒng)參數(shù)的過濾器校驗
1.方法調(diào)用時添加對應(yīng)的接口驗證參數(shù)
@Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {if(servletContext!=null&&contextRefreshedEvent.getApplicationContext().getParent()==null){servletContext.setAttribute("root",servletContext.getContextPath());
//由于系統(tǒng)參數(shù)需要防止惡意調(diào)用修改,所以需要存一個令牌來進(jìn)行進(jìn)行驗證,當(dāng)調(diào)用放調(diào)用接口時,
// 通過dubbo過濾器來驗證是否正確,正確則調(diào)用,否則拋出異常
//獲取RPC上下文對象
RpcContext context = RpcContext.getContext();
context.setAttachment("systemConfigToken","dugasud78dt67q6d");
//獲取數(shù)據(jù)庫系統(tǒng)參數(shù)賦值給配置文件
ListconfigList = systemConfigService.findAllConfig();
for (ConfigVo config : configList) {PropertiesUtils.setProp(config.getConfigname(),config.getConfigvalue().toString());
}
}
}
2.被調(diào)用接口的接口攔截驗證
//dubbo過濾器,需要手動在xml中添加,不能使用@Component注解交給Spring,不生效,且不寫全包名
@Activate(group = "provider")
public class RequestAuthFilter implements Filter {@Override
public Result invoke(Invoker>invoker, Invocation invocation) throws RpcException {//獲取上下文對象,判斷傳過來的令牌是否正確
RpcContext context = RpcContext.getContext();
String tokenValue = context.getAttachment("systemConfigToken");
if(!"dugasud78dt67q6d".equals(tokenValue)){//不相等拋異常
throw new RpcException("非法調(diào)用請求");
}
//調(diào)用
return invoker.invoke(invocation);
}
}
3.驗證接口的配置
/META-INF/dubbo/com.alibaba.dubbo.rpc.Filter
requestAuthFilter=com.li.config.service.impl.RequestAuthFilter
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧