天天看點

從零開始實作簡單 RPC 架構 3:配置總線 URL

URL 的定義

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

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

protocol://username:[email protected]: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:2181

SPI 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 統一配置模型存在的意義。

講解的 RPC 架構叫

ccx-rpc

,代碼已經開源。

Github:https://github.com/chenchuxin/ccx-rpc

Gitee:https://gitee.com/imccx/ccx-rpc