從零開始實現簡單 RPC 框架 3:配置匯流排 URL

小新是也發表於2021-08-22

URL 的定義

URL 對於大部分程式猿來說都是很熟悉的,其全稱是 Uniform Resource Locator (統一資源定位器)。它是網際網路的統一資源定位標誌,也就是指網路地址。

一個標準的 URL 格式可以包含如下的幾個部分:

protocol://username:password@host:port/path?key1=value1&key2=value2
  • protocol:協議,例如 http 協議
  • username/password:使用者名稱/密碼
  • host/port:主機/埠
  • path:請求路徑
  • parameters:引數鍵值對

為什麼使用 URL

ccx-rpc 中,URL 可以理解為配置匯流排。所有擴充套件點引數都包含 URL 引數,URL 作為上下文資訊貫穿整個擴充套件點設計體系。
在沒有 URL 之前,引數傳遞有時候是字串型別,有時候是 Map 型別,又有時候是物件:

doSomething(String param1, String param2);
doSomething2(Map<String,String> params);
doSomething3(Parameters params);

使用 URL 一致性模型:

doSomething(URL url);
doSomething2(URL url);
doSomething3(URL url);

使用 URL 統一配置模型的好處:

  • 形成程式碼規範,多作者編寫和讀者都能以同一種標準編寫/閱讀程式碼,提供效率。
  • 可擴充套件性強,URL 相當於引數的集合(key1=value1&key2=value2),當我們在擴充套件程式碼時,可以將新的引數追加到 URL 中,不需要改變出入參。

ccx-rpc 中的應用

1. SPI 適配擴充套件

SPI 的適配方法,使用 @Adaptive 註解標註,同時引數必須包含 URL。在生成擴充套件類的時候,載入器會從 URL 中提取 @Adaptive 註解配置的引數對應的值。

以註冊中心擴充套件類工廠為例:

@SPI
public interface RegistryFactory {

    /**
     * 獲取註冊中心
     *
     * @param url 註冊中心的配置,例如註冊中心的地址。會自動根據協議獲取註冊中心例項
     * @return 如果協議型別跟註冊中心匹配上了,返回對應的配置中心例項
     */
    @Adaptive("protocol")
    Registry getRegistry(URL url);
}

public static void main(String[] args) {
    // 獲取適配擴充套件
    RegistryFactory zkRegistryFactory = ExtensionLoader.getLoader(RegistryFactory.class).getAdaptiveExtension();
    URL url = URLParser.toURL("zk://localhost:2181");
    // 適配擴充套件自動從 ur 中解析出副檔名,然後返回對應的擴充套件類
    Registry registry = zkRegistryFactory.getRegistry(url);
}

URL 是 zk://localhost:2181SPI Adaptive 會自動從 URL 中獲取協議型別 zk,然後從 Registry 的實現類中找到對應的 ZkRegistry

2. 暴露服務

服務提供方想註冊中心註冊服務的時候,是通過 URL 註冊。其格式大致如下:

zk://192.168.10.11:1234/com.ccx.rpc.core.test.registry.ZkRegistryTest?methods=test1

註冊中心介面中的註冊方法:

public interface Registry {

    /**
     * 向註冊中心註冊服務
     *
     * @param url 註冊者的資訊
     */
    void register(URL url);
}

zk 拿到 URL 之後,從中解析出介面 com.ccx.rpc.core.test.registry.ZkRegistryTest,為其建立一個節點,下面再放提供者的資訊。

3. 引用服務

服務引用方,從註冊中心拿到的服務資訊就是提供方註冊的資訊。

zk://192.168.10.11:1234/com.ccx.rpc.core.test.registry.ZkRegistryTest?methods=test1

然後引用方從 URL 中解析出服務的地址:192.168.10.11:1234,接著就可以通過地址直連服務提供方了。

public interface Registry {
    /**
     * 查詢註冊的服務
     *
     * @param condition 查詢條件
     * @return 符合查詢條件的所有註冊者
     */
    List<URL> lookup(URL condition);
}

總結

URL 在 ccx-rpc 中發揮了配置匯流排的作用,其應用也不僅僅只是上面提到的。
統一配置模型類似於契約,在開發中,溝通是一件很麻煩的事情,統一模型可以省去很多溝通成本,這就是 URL 統一配置模型存在的意義。

相關文章