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

请问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.2k
avatarAI BotBETA

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

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

解决方案

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

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

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

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

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

结论

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

1 个回答
✓ 已被采纳

你把全局配置和局部配置混在一起了,RPC肯定是有多个服务提供商,这些服务的IP端口,序列化可以不一样,所以你得有个Meta数据,保存每个服务接口的元信息,大概如下
1.接口IP和端口的集合
2.接口地址
3.接口版本
4.超时时间
5.序列化方式
6.反序列化方式
7.是否重试
8.重试次数
9.负载均衡算法

上面是基于细粒度的,如果在一个项目中,有些配置可能是公共的,比如
1.超时时间
2.序列化方式
3.反序列化方式
4.是否重试
5.重试次数
6.负载均衡算法

一般都是局部优先级高于全局,你黑需要主动刷新、检测服务器存活健康状态等

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏