柚子快報(bào)邀請(qǐng)碼778899分享:Dubbo
柚子快報(bào)邀請(qǐng)碼778899分享:Dubbo
1、基本簡(jiǎn)介
????????Dubbo是阿里巴巴開源的基于 Java 的高性能 RPC分布式服務(wù)框架,致力于提供高性能和透明化 的RPC遠(yuǎn)程服務(wù)調(diào)用方案,以及SOA服務(wù)治理方案。 Spring Cloud Alibaba微服務(wù)開發(fā)框架集成 了Dubbo,可實(shí)現(xiàn)微服務(wù)對(duì)外暴露Dubbo協(xié)議的接口,Dubbo協(xié)議相比RESTful協(xié)議速度更快
RPC:
RPC
是遠(yuǎn)程過程(Remote Procedure Call)的縮寫形式,調(diào)用RPC遠(yuǎn)程方法就像調(diào)用本地
方法?樣,Dubbo之前阿里研發(fā),中間停止維護(hù)2年,最后開啟維護(hù)并捐獻(xiàn)給Apache
以上是 Dubbo 的工作原理圖,從抽象架構(gòu)上分為兩層:服務(wù)治理抽象控制面?和 Dubbo 數(shù)據(jù)面
服務(wù)治理控制面。服務(wù)治理控制面不是特指如注冊(cè)中心類的單個(gè)具體組件,而是對(duì) Dubbo 治 理體系的抽象表達(dá)??刂泼姘瑓f(xié)調(diào)服務(wù)發(fā)現(xiàn)的注冊(cè)中心、流量管控策略、Dubbo Admin 控 制臺(tái)等,如果采用了 Service Mesh 架構(gòu)則還包含 Istio 等服務(wù)網(wǎng)格控制面。 Dubbo 數(shù)據(jù)面數(shù)據(jù)面代表集群部署的所有 Dubbo 進(jìn)程,進(jìn)程之間通過 RPC 協(xié)議實(shí)現(xiàn)數(shù)據(jù)交 換,Dubbo 定義了微服務(wù)應(yīng)用開發(fā)與調(diào)用規(guī)范并負(fù)責(zé)完成數(shù)據(jù)傳輸?shù)木幗獯a工作。
服務(wù)消費(fèi)者 (Dubbo Consumer),發(fā)起業(yè)務(wù)調(diào)用或 RPC 通信的 Dubbo 進(jìn)程
服務(wù)提供者 (Dubbo Provider),接收業(yè)務(wù)調(diào)用或 RPC 通信的 Dubbo 進(jìn)程
2、Dubbo架構(gòu)圖
這是最重要的,理解Dubbo的架構(gòu)圖是理解Dubbo的第一步,我從Dubbo官網(wǎng)手冊(cè)上截了一下Dubbo架構(gòu)圖:
在接下來(lái)的講解之前,說明一個(gè)概念:所謂SOA也好,分布式服務(wù)框架也好,不是服務(wù)消費(fèi)者從中間件(一般都是Zookeeper)上去拿數(shù)據(jù),而是服務(wù)消費(fèi)者從中間件上拿到可用的服務(wù)生產(chǎn)者的集群地址,再?gòu)募旱刂分羞x出一個(gè)進(jìn)行直連。
接下來(lái)認(rèn)識(shí)一下圖中的結(jié)點(diǎn):
Provider:暴露服務(wù)的服務(wù)提供方,或者直白點(diǎn)說就是服務(wù)生產(chǎn)者Consumer:調(diào)用遠(yuǎn)程服務(wù)的服務(wù)消費(fèi)方,也就是服務(wù)消費(fèi)者Registry:服務(wù)注冊(cè)與發(fā)現(xiàn)的注冊(cè)中心Monitor:統(tǒng)計(jì)服務(wù)的調(diào)用次數(shù)和調(diào)用時(shí)間的監(jiān)控中心Container:服務(wù)(生產(chǎn)者)運(yùn)行容器
圖中已經(jīng)有了調(diào)用步驟了,接著對(duì)步驟進(jìn)行說明:
0:服務(wù)容器負(fù)責(zé)啟動(dòng)、加載、運(yùn)行服務(wù)提供者(生產(chǎn)者)1:服務(wù)提供者(生產(chǎn)者)在啟動(dòng)時(shí),向注冊(cè)中心注冊(cè)自己提供的服務(wù)2:服務(wù)消費(fèi)者在啟動(dòng)時(shí),向注冊(cè)中心訂閱自己所需的服務(wù)3:注冊(cè)中心返回服務(wù)提供者地址列表給消費(fèi)者,如果有變更,注冊(cè)中細(xì)膩將基于長(zhǎng)連接推送變更數(shù)據(jù)給消費(fèi)者4:服務(wù)消費(fèi)者從服務(wù)生產(chǎn)者地址列表中,基于軟負(fù)載均衡算法,選擇一臺(tái)提供者(生產(chǎn)者)進(jìn)行調(diào)用,如果調(diào)用失敗,再選另一臺(tái)調(diào)用5:服務(wù)消費(fèi)者和提供者(生產(chǎn)者),在內(nèi)存中累計(jì)調(diào)用次數(shù)和調(diào)用時(shí)間,定時(shí)每分鐘發(fā)送一次統(tǒng)計(jì)數(shù)據(jù)到監(jiān)控中心
3、基礎(chǔ)實(shí)現(xiàn)
A.提供統(tǒng)一業(yè)務(wù)api
/**
實(shí)戰(zhàn)中,會(huì)將所有服務(wù)接?設(shè)計(jì)給?個(gè)叫做api的服務(wù),單獨(dú)維護(hù),此處就在common服務(wù)設(shè)置
*/
public interface IProductService {
Product findByPid(Integer pid);
}
B.編輯服務(wù)提供者product
添加依賴
添加dubbo配置
dubbo:
scan:
base-packages: com.apesource.service.impl # 開啟包掃描
protocols:
dubbo:
name: dubbo # 服務(wù)協(xié)議
port: -1 # 服務(wù)端? 使?隨機(jī)端?
registry:
address: spring-cloud://localhost # 注冊(cè)中?
編寫并暴露服務(wù)
//暴露服務(wù):注意這?使?的是dubbo提供的注解@Service,?不是Spring的
@Service
public class ProductServiceImpl implements ProductService {
@Autowired
private ProductDao productDao;
@Override
public Product findByPid(Integer pid) {
return productDao.findById(pid);
}
}
C.編輯服務(wù)消費(fèi)者
添加依賴
添加dubbo配置
dubbo:
registry:
address: spring-cloud://localhost # 注冊(cè)中?
cloud:
subscribed-services: service-product # 訂閱的提供者名稱
引用服務(wù)
@RestController
public class OrderController {
@Autowired
private OrderService orderService;
// 引用服務(wù)
@Reference
private IProductService productService;
@RequestMapping("/order/prod/{pid}")
public Order order(@PathVariable Integer pid) {
System.out.println("接收到 " + pid + " 號(hào)商品的下單請(qǐng)求, 接下來(lái)調(diào)用商品微服務(wù)查詢此商品信息");
// 調(diào)用商品微服務(wù), 查詢商品信息
Product product = productService.findByPid(pid);
System.out.println("查詢到 " + pid + " 號(hào)商品的信息, 內(nèi)容是: " + JSON.toJSONString(product));
// 下單(創(chuàng)建訂單)
Order order = new Order();
order.setUid(1);
order.setUsername("測(cè)試用戶");
order.setPid(pid);
order.setPname(product.getPname());
order.setPprice(product.getPprice());
order.setNumber(1);
orderService.createOrder(order);
System.out.println("創(chuàng)建訂單成功, 訂單信息為: " + JSON.toJSONString(order));
return order;
}
}
柚子快報(bào)邀請(qǐng)碼778899分享:Dubbo
相關(guān)閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。