• 从零开始实现简单 RPC 框架 3:配置总线 URL


    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 统一配置模型存在的意义。

    讲解的 RPC 框架叫 ccx-rpc,代码已经开源。
    Github:https://github.com/chenchuxin/ccx-rpc
    Gitee:https://gitee.com/imccx/ccx-rpc

  • 作者:小新是也
  • 链接:http://www.cnblogs.com/chenchuxin
  • 来源:博客园
  • 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    win10安装nodejs,修改全局依赖位置和环境变量配置
    JavaScript判断两个对象内容是否相等
    JS判断是否是数组
    Js判断值是否是NaN
    typeof方法重写(区分数组对象)
    JS实现图片懒加载
    输入url到展示页面过程发生了什么?
    html如何在服务端跑起来
    nuxt怎么打包
    如果scss引用了字体图标文件该怎么打包
  • 原文地址:https://www.cnblogs.com/chenchuxin/p/15171029.html
  • Copyright © 2020-2023  润新知