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: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