当前位置: 首页 > 知识库问答 >
问题:

java - 第一次接触RPC,请问RPC框架的配置唯一的,还是不同接口服务有自己的配置?

魏毅
2024-09-23

请问RPC框架的配置唯一的,还是不同接口服务有自己的配置?
最近跟着学做一个RPC,它的配置类和初始化是这样的
entity:

@Data
public class RpcConfig {

    /**
     * 名称
     */
    private String name ;

    /**
     * 版本号
     */
    private String version;

    /**
     * 服务器主机名
     */
    private String serverHost;

    /**
     * 服务器端口号
     */
    private Integer serverPort;

    /**
     * 序列化器
     */
    private String serializer;

    /**
     * 注册中心配置
     */
    private RegistryConfig registryConfig = new RegistryConfig();
}

初始化

@Slf4j
public class RpcApplication {

    private static volatile RpcConfig rpcConfig;

    /**
     * 框架初始化,支持传入自定义配置
     *
     * @param newRpcConfig
     */
    public static void init(RpcConfig newRpcConfig) {
        rpcConfig = newRpcConfig;
        log.info("rpc init, config = {}", newRpcConfig.toString());
        // 注册中心初始化
        RegistryConfig registryConfig = rpcConfig.getRegistryConfig();
        Registry registry = RegistryFactory.getInstance(registryConfig.getRegistry());
        registry.init(registryConfig);
        log.info("registry init, config = {}", registryConfig);
        // 创建并注册 Shutdown Hook,JVM 退出时执行操作
        Runtime.getRuntime().addShutdownHook(new Thread(registry::destroy));
    }

    /**
     * 初始化
     */
    public static void init() {
        RpcConfig newRpcConfig;
        try {
            //读取配置文件
            newRpcConfig = ConfigUtils.loadConfig(RpcConfig.class, RpcConstant.DEFAULT_CONFIG_PREFIX);
        } catch (Exception e) {
            // 配置加载失败,使用默认值
            newRpcConfig = new RpcConfig();
        }
        init(newRpcConfig);
    }


    /**
     * 获取配置
     *
     * @return
     */
    public static RpcConfig getRpcConfig() {
        if (rpcConfig == null) {
            synchronized (RpcApplication.class) {
                if (rpcConfig == null) {
                    init();
                }
            }
        }
        return rpcConfig;
    }
}

这样的话这个RpcConfig就是单例的,那消费者远程调用肯定不止一个接口服务吧,这怎么实现调用不同端口的接口服务呢,我是想用Map存储不同服务的RpcConfig,但总感觉不对劲,还是说每次调用前都先初始化一次(读取配置文件中各自的配置项),但不会有线程安全的问题吗?

共有1个答案

傅越
2024-09-23

在RPC(远程过程调用)框架中,配置是否唯一或每个接口服务是否拥有自己的配置,这取决于RPC框架的设计以及具体的应用场景。

从你提供的代码示例来看,RpcConfig 类被设计为一个全局配置类,用于存储RPC框架的一些基本配置信息,如服务器地址、端口、序列化方式以及注册中心配置等。这种设计通常意味着RPC框架可能采用一个统一的配置来管理多个服务之间的通信,但这并不意味着它不能支持不同接口服务使用不同的配置。

解决方案

  1. 全局配置与局部配置结合

    • 全局配置(如RpcConfig)可以包含一些共通的配置信息,如序列化方式、注册中心信息等。
    • 对于需要不同配置的服务,可以在服务注册或调用时,额外指定或覆盖这些配置。例如,在注册服务时,可以指定服务的端口号或特定的序列化方式。
  2. 使用Map存储不同服务的配置

    • 正如你所提到的,可以使用一个Map来存储不同服务的配置。每个服务可以有自己独立的配置对象,这些对象可以继承自RpcConfig,或者包含RpcConfig作为它们的成员之一。
    • 在服务注册或调用时,根据服务标识(如服务名)从Map中检索相应的配置。
  3. 动态配置加载

    • RPC框架可以支持动态配置加载,即服务在运行时可以根据需要加载或更新配置。这可以通过监听配置中心的变化来实现,当配置发生变化时,RPC框架可以自动更新其内部配置,并通知相关服务进行更新。
  4. 线程安全问题

    • 如果你选择在每个调用前都读取配置文件来初始化配置,那么需要确保配置读取和初始化过程是线程安全的。这可以通过同步代码块、锁或其他并发控制机制来实现。
    • 另外,由于配置通常不会频繁更改,因此更常见的做法是在应用启动时加载配置,并将其存储在全局变量或缓存中,以便后续使用。这样可以避免在每次调用时都进行昂贵的I/O操作。

结论

在你的场景中,如果不同接口服务需要不同的配置(如不同的端口号),你可以考虑使用Map来存储这些配置,或者在设计服务注册和调用机制时允许动态指定或覆盖配置。同时,需要注意线程安全和配置更新的问题。

 类似资料:
  • 本文向大家介绍第一次接触Bootstrap框架,包括了第一次接触Bootstrap框架的使用技巧和注意事项,需要的朋友参考一下 关于Bootstrap,话不多说,直接进入主题: 安装 可以通过bootstrap官方网站下载安装 可以通过Bower安装(关于bower一种包管理器,本文不做详解) bower install bootstrap 可以通过npm安装(关于npm可以阅读) npm ins

  • 面试题 如何自己设计一个类似 Dubbo 的 RPC 框架? 面试官心理分析 说实话,就这问题,其实就跟问你如何自己设计一个 MQ 一样的道理,就考两个: 你有没有对某个 rpc 框架原理有非常深入的理解。 你能不能从整体上来思考一下,如何设计一个 rpc 框架,考考你的系统设计能力。 面试题剖析 其实问到你这问题,你起码不能认怂,因为是知识的扫盲,那我不可能给你深入讲解什么 kafka 源码剖析

  • 随着分布式技术和微服务思想流行,技术公司逐步将服务拆分为独立运行的小模块,提高系统整体的健壮性,加快特性的演进速度。微服务通过定义完善的接口进行交互,解耦系统、敏捷迭代、方便服务治理。RPC是目前微服务最广泛的通信方式。然而,众多团队各自研发具备服务治理功能的RPC通信框架,一方面增加开发成本,消耗人力重复造轮子;另一方面不同序列化协议的RPC服务,无法互相通信,影响可用性。因此,通用的RPC通信

  • 对服务开发者, MTransport 屏蔽了底层网络通信细节,从而更专注于业务自身逻辑实现。支持不同语言版本的代码实现, 保持通信协议的一致性,支持服务注册、服务发现、异步通信、负载均衡等丰富的服务治理功能。

  • Flex提供RPC服务以向客户端提供服务器端数据。 Flex为服务器端数据提供了相当大的控制。 使用Flex RPC服务,我们可以定义要在服务器端执行的用户操作。 Flex RPC Sservices可以与任何服务器端技术集成。 其中一个Flex RPC服务提供内置支持,可以通过线路传输压缩二进制数据,速度非常快。 Flex提供以下三种类型的RPC服务 S.No RPC服务和描述 1 HttpSe

  • 问题内容: 是否有直接从Java代码直接调用GWT RPC服务端点的简便方法?我的意思是真正的Java代码,而不是编译成JavaScript的Java代码。 我问是因为我们想针对GWT RPC接口运行性能基准测试/压力测试。我想用Java编写测试工具,并在JVM中运行它(与在浏览器中运行的javascript相反)。 我认为必须有一种方法可以执行此操作,因为我认为GWT托管模式需要这种功能。但是,