簡(jiǎn)介
Apache Dubbo是一款高性能的Java RPC框架.其前身是阿里巴巴公司開源的一個(gè)高性能,輕量級(jí)的開源Java RPC框架,可以和Spring框架無縫集成.
Dubbo 官網(wǎng)
RPC
RPC介紹
Remote Procedure Call 遠(yuǎn)程過程調(diào)用,是分布式架構(gòu)的核心,按響應(yīng)方式分以下兩種:
- 同步調(diào)用:客戶端調(diào)用服務(wù)方方法,等待直到服務(wù)方返回結(jié)果或者超時(shí),再繼續(xù)自己的操作
- 異步調(diào)用:客戶端把消息發(fā)送給中間件,不再等待服務(wù)端返回,直接繼續(xù)自己的操作
RPC是一種進(jìn)程間的通信方式,它允許應(yīng)用程序調(diào)用網(wǎng)絡(luò)上的另一個(gè)應(yīng)用程序中的方法,對(duì)于服務(wù)消費(fèi)者而言,無需了解遠(yuǎn)程調(diào)用的底層細(xì)節(jié),是透明的.
需要注意的是RPC并不是一個(gè)具體的技術(shù),而是指整個(gè)網(wǎng)絡(luò)遠(yuǎn)程調(diào)用過程
RPC是一個(gè)泛化的概念,嚴(yán)格來說一切遠(yuǎn)程過程調(diào)用手段都屬于RPC范疇,各種開發(fā)語言都有自己的RPC框架.JAVA中RPC框架比較多,廣發(fā)使用的有Dubbo,RMI,Spring Cloud,Hessian等.
RPC組件
簡(jiǎn)單來說一個(gè)RPC架構(gòu)里包含以下4個(gè)組件:
- 客戶端(Client):服務(wù)調(diào)用者
- 客戶端存根(Client Stub):存放服務(wù)端地址信息,將客戶端的請(qǐng)求參數(shù)打包成網(wǎng)絡(luò)消息,再通過網(wǎng)絡(luò)發(fā)送給服務(wù)方
- 服務(wù)端存根(Server Stub):接受客戶端發(fā)送過來的消息并解包,再調(diào)用本地服務(wù)
- 服務(wù)端(Server):服務(wù)提供者
RPC調(diào)用
- 客戶端調(diào)用以本地調(diào)用方式調(diào)用服務(wù)
- 客戶端存根接收到調(diào)用后負(fù)責(zé)將方法,參數(shù)等組裝成能夠進(jìn)行網(wǎng)絡(luò)傳輸?shù)南Ⅲw,在Java里就是序列化的過程
- 客戶端存根找到服務(wù)地址,并將消息通過網(wǎng)絡(luò)發(fā)送到服務(wù)端;
- 服務(wù)端存根收到消息后進(jìn)行解碼,在Java里就是反序列化的過程
- 服務(wù)端存根根據(jù)解碼結(jié)果調(diào)用本地服務(wù)
- 本地服務(wù)執(zhí)行處理邏輯
- 本地服務(wù)將結(jié)果返回給服務(wù)端存根
- 服務(wù)端存根將返回結(jié)果打包成消息,Java里的序列化
- 服務(wù)端存根將打包后的消息通過網(wǎng)絡(luò)發(fā)送至消費(fèi)方
- 客戶端存根接收到消息,并進(jìn)行解碼,Java里的反序列化
- 服務(wù)調(diào)用方得到最終結(jié)果
Dubbo
Dubbo架構(gòu)
Dubbo架構(gòu)圖(Dubbo官方提供)如下:
節(jié)點(diǎn)角色說明
節(jié)點(diǎn) | 角色說明 |
---|---|
Provider(服務(wù)提供者) | 暴露服務(wù)的服務(wù)提供方 |
Consumer(服務(wù)消費(fèi)者) | 調(diào)用遠(yuǎn)程服務(wù)的服務(wù)消費(fèi)方 |
Registry(服務(wù)注冊(cè)中心) | 服務(wù)注冊(cè)與發(fā)現(xiàn)的注冊(cè)中心 |
Monitor(服務(wù)監(jiān)控中心) | 統(tǒng)計(jì)服務(wù)的調(diào)用次數(shù)和調(diào)用時(shí)間的監(jiān)控中心 |
Container(服務(wù)容器) | 服務(wù)運(yùn)行容器 |
注意:
- 虛線都是異步訪問,實(shí)線都是同步訪問
- 藍(lán)色虛線:在啟動(dòng)時(shí)完成的功能
- 紅色虛線(實(shí)線)都是程序運(yùn)行過程中執(zhí)行的功能
調(diào)用關(guān)系說明
- 服務(wù)容器負(fù)責(zé)啟動(dòng),加載,運(yùn)行服務(wù)提供者
- 服務(wù)提供者在啟動(dòng)時(shí),向注冊(cè)中心注冊(cè)自己提供的服務(wù)
- 服務(wù)消費(fèi)者在啟動(dòng)時(shí),向注冊(cè)中心訂閱自己所需的服務(wù)
- 注冊(cè)中心返回服務(wù)提供者地址列表給消費(fèi)者,如果有變更,注冊(cè)中心將基于長(zhǎng)連接推送變更數(shù)據(jù)給消費(fèi)者
- 服務(wù)消費(fèi)者,從提供者地址列表中,基于軟負(fù)載均衡算法,選一臺(tái)提供者進(jìn)行調(diào)用,如果調(diào)用失敗,再選另一臺(tái)調(diào)用
- 服務(wù)消費(fèi)者和提供者,在內(nèi)存中累計(jì)調(diào)用次數(shù)和調(diào)用時(shí)間,定時(shí)每分鐘發(fā)送一次統(tǒng)計(jì)數(shù)據(jù)到監(jiān)控中心
Dubbo快速開發(fā)
代碼結(jié)構(gòu)過于復(fù)雜,這里只展示部分代碼,全部代碼地址 存入git.
服務(wù)消費(fèi)者
package com.fanqiechaodan.controller;
import com.fanqiechaodan.pojo.User;
import com.fanqiechaodan.service.UserService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
/**
* @author fanqiechaodan
* @Classname UserController
* @Description
*/
@RestController
public class UserController {
@Reference
UserService userService;
@GetMapping(value = "/get/{id}")
public User getUser(@PathVariable(value = "id")String id){
return userService.findById(id);
}
}
服務(wù)提供者文章來源:http://www.zghlxwxcb.cn/news/detail-411263.html
package com.fanqiechaodan.service.impl;
import com.fanqiechaodan.service.UserService;
import com.fanqiechaodan.pojo.User;
import org.apache.dubbo.config.annotation.Service;
/**
* @author fanqiechaodan
* @Classname UserServiceImpl
* @Description
*/
@Service
public class UserServiceImpl implements UserService {
@Override
public User findById(String id) {
User user = new User();
user.setId(id);
user.setName("番茄炒蛋");
return user;
}
}
測(cè)試:文章來源地址http://www.zghlxwxcb.cn/news/detail-411263.html
到了這里,關(guān)于深入淺出:理解 RPC 和 Dubbo 架構(gòu)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!