Dubbo基礎理解

什麼是RPC

維基百科定義:

遠程過程調用(英語:Remote Procedure Call,縮寫爲 RPC)是一個計算機通信協議。該協議允許運行於一臺計算機的程序調用另一個地址空間(通常爲一個開放網絡的一臺計算機)的子程序,而程序員就像調用本地程序一樣,無需額外地爲這個交互作用編程(無需關注細節)。RPC是一種服務器-客戶端(Client/Server)模式,經典實現是一個通過發送請求-接受迴應進行信息交互的系統。如果涉及的軟件採用面向對象編程,那麼遠程過程調用亦可稱作遠程調用或遠程方法調用。

RPC協議:只是定義數據傳輸格式和傳輸方式,是一種應用層協議。
傳輸方式:有基於HTTP傳輸數據的RPC Over HTTP,也有基於TCP的RPC Over TCP等。
數據格式:雙方協商定義,一般包括以下幾點:
1、類名
2、方法名
3、參數類型(用來確定具體執行的方法,有方法重載)
4、參數值
RPC遠程調用






Dubbo框架

dubbo是一種高性能、輕量級的開源Java RPC框架(最新官網稱爲服務框架),支持多種協議,默認使用dubbo協議,也可以使用HTTP協議等。

  1. 使用dubbo協議時,傳輸方式使用Netty;
  2. 使用HTTP協議時,傳輸方式使用Tomcat;

基本使用

Dubbo實現主要包括:服務提供者(provide)、服務消費者(Comsumer)、註冊中心、監控中心組成
服務提供者
1、定義服務接口、提供接口實現類

// 接口(對外暴露的服務)
public interface DemoService {
   
   
    String sayHello(String name);
}
// 接口實現類
public class DemoServiceImpl implements DemoService {
   
   
    public String sayHello(String name) {
   
   
        return "Hello " + name;
    }
}

2、配置對外暴露服務(dubbo-demo-provide.xml,也可以使用註解的方式實現)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd 		http://dubbo.apache.org/schema/dubbo        http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
 
    <!-- 定義應用名, 管理臺中會用到-->
    <dubbo:application name="demo-provide"  />
 
    <!-- 使用zookeeper作爲註冊中心,暴露服務 -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181" />
 
    <!-- 使用dubbo協議(可使用多種協議如:HTTP、rest),暴露端口爲20880 server=Netty 指定傳輸方式-->
    <!-- 針對整個應用,也可以針對服務指定協議 -->
    <dubbo:protocol name="dubbo" port="20880" />
 
    <!-- 聲明需要暴露的服務接口 interface:接口名字(也是服務名字) ref:接口對應的實現類 -->
    <dubbo:service interface="org.apache.dubbo.demo.DemoService" ref="demoService" />
 
    <!-- 和本地bean一樣實現服務,一般bean不在這配置,使用註解注入spring容器 -->
    <bean id="demoService" class="org.apache.dubbo.demo.provider.DemoServiceImpl" />
</beans>

3、provide啓動類

@SpringBootApplication
public class ProviderApplication {
   
   
    public static void main(String[] args) {
   
   
        SpringApplication.run(ProviderApplication.class, args);
    }
}

服務消費者
1、消費者配置(dubbo-consumer.xml)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd        http://dubbo.apache.org/schema/dubbo        http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
 
    <!-- 消費者應用名-->
    <dubbo:application name="demo-consumer"  />
 
    <!-- 使用mzookeeper註冊中心發現暴露的服務地址 -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181" />
 
    <!-- 生成遠程服務代理,引入名字爲org.apache.dubbo.demo.DemoService的服務,對應到本地的名字爲demoService-->
    <!-- 在Spring容器中可以通過demoService拿到這個服務-->
    <dubbo:reference id="demoService" interface="org.apache.dubbo.demo.DemoService" />
</beans>

2、Consumer 啓動類

@SpringBootApplication
public class ConsumerApplication{
   
   
    public static void main(String[] args) throws Exception {
   
   
       SpringApplication.run(ConsumerApplication.class, args);
        DemoService demoService = (DemoService)context.getBean("demoService"); // 獲取遠程服務代理
        String hello = demoService.sayHello("world"); // 執行遠程方法
        System.out.println( hello ); // 顯示調用結果
    }
}

基本底層原理

基本原理

Dubbo流程(粗略思路)
1、服務提供者提供接口、接口實現類(通過版本號區分多個實現類),對外暴露服務,通過共享註冊中心註冊服務(一般用zookeeper/redis)。
爲什麼要使用共享註冊中心
由於服務消費者和服務提供者是分別啓動兩個JVM(兩個進程),所以需要使用共享註冊中心。註冊服務形式-服務名:List
2、啓動Tomcat容器或Netty服務器
需要HTTP/Netty客戶端,用來接收請求,需要HTTP/Netty服務端用來處理請求。
3、服務消費者讀取用戶配置(共享註冊中心註冊的服務)
服務路徑每次從共享註冊中心獲取,消耗網絡性能,所以先獲取存放至本地註冊中心緩存,數據保持同步。
數據保持同步:
4、定義數據傳輸類型(Invocation對象,序列化)
構造Invocation對象:指定參數列表、方法、參數、地址、接口
5、dubbo生成接口代理類放入spring容器,指定調用服務,發送請求
指定服務:考慮支持集羣,在代理類中,從註冊中心獲取到的服務路徑List有多個,使用負載均衡指定最終訪問的服務。
爲什麼使用zookeeper/Redis作爲共享註冊中心?
在集羣情況下會存在多個服務器,新增服務器註冊中心需要添加服務路徑,服務器掛了需要剔除服務路徑,集羣發生變化時zookeeper可以通過監聽機制(Redis利用消費訂閱機制)保證數據同步。
6、服務提供者接收處理請求














其他部分細節

  • 多版本實現:對於多個實現類,服務提供者通過版本號區分(拼在服務名後),Dubbo中實現類使用@Service(version = “callback”)標識。
  • 支持多個協議以及協議切換:可以使用工廠模式根據配置協議名使用指定協議。
  • 新增協議:使用SPI機制。
  • 集羣集羣變更:利用心跳機制監控集羣,zookeeper可通過臨時節點(Redis可通過過期時間節點)來實現心跳,這也是爲什麼註冊中心使用zookeeper/Redis而不使用MySQL等的原因之二。
  • 容錯:服務調用失敗可能是服務端調用失敗也有可能是網絡原因,Dubbo代理對象中捕獲異常,做相關的容錯處理。
  • Mock:服務未實現完,沒必要進行網絡請求,在發送之前可以做mock邏輯。

Dubbo功能及用法示例

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章