请问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,但总感觉不对劲,还是说每次调用前都先初始化一次(读取配置文件中各自的配置项),但不会有线程安全的问题吗?
你把全局配置和局部配置混在一起了,RPC肯定是有多个服务提供商,这些服务的IP端口,序列化可以不一样,所以你得有个Meta数据,保存每个服务接口的元信息,大概如下
1.接口IP和端口的集合
2.接口地址
3.接口版本
4.超时时间
5.序列化方式
6.反序列化方式
7.是否重试
8.重试次数
9.负载均衡算法
上面是基于细粒度的,如果在一个项目中,有些配置可能是公共的,比如
1.超时时间
2.序列化方式
3.反序列化方式
4.是否重试
5.重试次数
6.负载均衡算法
一般都是局部优先级高于全局,你黑需要主动刷新、检测服务器存活健康状态等