Dubbo
高性能、輕量級的 Java RPC 框架
RPC: Remote Procedure Call 遠程過程調用,簡單來說就是它允許一個計算機程序通過網絡請求調用另一個計算機上的程序,就像本地調用一樣。有非常多的協議和技術來都實現了RPC的過程,比如:HTTP REST風格,Java RMI規范、WebService SOAP協議、Hession等等。
Dubbo架構
節點角色說明:
?Provider:暴露服務的服務提供者 (就是你每個大功能類單獨一個模塊)
?Container:服務運行容器
?Consumer:調用遠程服務的服務消費者 (這里一般是web或者網關gateway)
?Registry:服務注冊與發現的注冊中心
?Monitor:統計服務的調用次數和調用時間的監控中心
調用流程:
- 服務容器負責啟動,加載,運行服務提供者。
- 服務提供者在啟動時,向注冊中心注冊自己提供的服務。(你可以在自己的注冊中心中,看到對應的配置)
- 服務消費者在啟動時,向注冊中心訂閱自己所需的服務。
- 注冊中心返回服務提供者地址列表給消費者,如果有變更,注冊中心將基于長連接推送變更數據給消費者。
- 服務消費者,從提供者地址列表中,基于軟負載均衡算法,選一臺提供者進行調用,如果調用失敗,再選另一臺調用。
- 服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。
Dubbo實用
你需要有服務提供者模塊和服務消費者模塊
1.首先需要一個可用的注冊中心 Zookeeper,Nacos,Redis 均可。(這里使用Nacos)
2.新建一個maven工程,添加如下依賴
<!-- registry dependency --><dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId><version>${nacos.version}</version></dependency><!-- dubbo dependency--><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>${dubbo.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency>
3.你需要給服務提供者模塊和服務消費者模塊提供對應的配置,這樣才能實現去注冊中心注冊和調用服務。對應著每個模塊來設置,不過記得注冊中心地址要填同一個;要不然怎么去找服務。
# 提供者
dubbo:application:name: providerprotocol:name: dubboport: -1# 注冊中心 registry:address: nacos://your.nacos.address:8848username: nacospassword: nacos
其實,可以這樣理解:
- 網關 = 服務消費者
- 其他的功能模塊 = 服務提供者
消費者調用提供者的服務,比如登錄功能:
網關(消費者)寫一個登錄接口,然后使用 @DubboReference 就可以實現遠程注入,即可像調用本地方法一樣調用遠程服務了。代替以前的@autowired
@DubboReference(interfaceClass = UserService.class)private UserService userService;
登錄模塊UserCenter(提供者)寫一個UserServiceImpl類,來進行登陸的邏輯代碼編寫。實現類可以通過@DubboService(interfaceClass = UserService.class) :使用@DubboService 注解,Dubbo會將對應的服務注冊到spring, 在spring啟動后調用對應的服務導出方法,將服務注冊到注冊中心, 這樣Consumer端才能發現我們發布的服務并調用。其實也就等同于以前的@Service
@DubboService(interfaceClass = UserService.class)
public class UserServiceImpl implements UserService {
}
? 而因為會有很多個功能模塊,這樣子大家可能也注意到了一個問題。就是需要在兩個模塊都寫一個service接口類,這樣子的話,以后假如進行功能的添加或者修改啥的,兩邊都需要進行更改;很多時候不一定能統一,畢竟以后出去工作可能是一個團隊一個模塊。所以這個時候,我們可以添加一個公共的模塊,專門用來存放服務接口的。
這里通過Maven導入即可:在消費者和提供者的POM中都導入公共模塊;這樣就可以解決這個問題了。
與之類似的還有一個是Java對象的傳輸,定義一個公共的對象模塊;然后讓提供者和消費者都去導入其模塊即可。當然這個可以利用到Maven的傳遞性;你讓公共服務模塊導入公共對象模塊,這樣就可以無縫銜接了。不過對象的傳輸需要多注意一點,對象需要實現序列化接口 implements Serializable。dubbo 內部已經將序列化和反序列化的過程內部封裝了。
這樣的模塊還有很多,工具模塊也是;這些看你怎么搭建底層了。
這里提醒一下:
記得啟動模塊的時候,先啟動提供者(提供者無先后順序要求),最后在啟動消費者。畢竟服務提供者在啟動時,要向注冊中心注冊自己提供的服務。服務消費者在啟動時,向注冊中心訂閱自己所需的服務。然后是會有緩存機制的,就是它會將提供者的服務緩存在消費者的本地;所以你也可以不用每次都運行提供者。但是代碼改動時,就需要啟動,再次進行注冊。