从零开始实现简单 RPC 框架 3:配置总线 URL
2021-08-22 10:09
453 查看
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
相关文章推荐
- 从零开始实现简单 RPC 框架 1:RPC 框架的结构和设计
- 基于Netty的RPC简单框架实现(一):RPC客户端
- spring 框架中的依赖注入(IOC--设值注入)---使用xml简单配置文件---的具体实例的简单实现
- 基于Netty的RPC简单框架实现(五):功能测试与性能测试
- 简单的RPC框架实现-转载
- Zookeeper实现简单的分布式RPC框架
- 从零开始实现RPC框架 - RPC原理及实现
- Java实现简单的RPC框架
- 从零开始实现RPC框架 - RPC原理及实现
- 从零开始实现一个IDL+RPC框架
- Zookeeper实现简单的分布式RPC框架
- Java实现一个简单的RPC框架(一) 本地调用
- 【远程调用框架】如何实现一个简单的RPC框架(一)想法与设计
- Java实现简单的RPC框架
- Java实现简单的RPC框架
- 使用Akka实现一个简单的RPC框架(二)
- 从零开始实现一个简单的rest风格服务器 (1) —— typescript 开发环境配置
- php实现的一个简单json rpc框架实例
- Java实现简单的RPC框架
- 简单实现一个rpc框架