每日一句
使人疲惫的不是远方的高山,而是鞋里的一粒沙子
IClientConfig介绍
配置对于一个库一个服务一个软件甚至是一个系统是多么重要不言而喻。我们在引入一个组件的时候往往就是在和这个组件的配置不停的打着交道。本文所讲的IClientConfig就是Ribbon最基础的配置模块,也是和我们打交道最多的。
但是我们要知道的是IClientConfig底层对配置的处理是依赖archaius这个组件的,你可以简单理解为:**IClientConfig内部对配置的存储刷新都是archaius来操作的 相当于archaius是IClientConfig的一个代理。**这里对archaius不是太熟悉的朋友建议先去大致了解一下archaius。
简单使用
我们这系列的文章有一个特点就是说怎么用 然后再去了解那些细节东西。
下面看一个demo:
#我们在config.properties文件中加了如下的配置
coredy.ribbon.ConnectTimeout=7000
IClientConfig coredy1 = DefaultClientConfigImpl.getClientConfigWithDefaultValues("coredy1");
IClientConfig coredy = DefaultClientConfigImpl.getClientConfigWithDefaultValues("coredy");
System.out.println(coredy.get(IClientConfigKey.Keys.ConnectTimeout));
System.out.println(coredy1.get(IClientConfigKey.Keys.ConnectTimeout));
上述的小demo两个输出语句分别输出了7000和2000。按照我们输出的结果 大概能得出这样一个结论:当前ClientName的ConnectTimeout 那么就去取对应配置 如果没有就去取默认值
我们再来看一下ribbon配置的格式:<clientName>.ribbon.<configKey>
- clientName就是我们上例中的"coredy"
- ribbon固定标识
- configKey 配置的名字 Ribbon常用的配置名字都定义在CommonClientConfigKey中,大家在记不起具体的配置名字的时候一定要记得过去复制。千万别凭感觉去写,因为有些配置很变态 例如 listOfServers 别人都是首字母大写 它是小写!估计作者在定义这个变量的时候应该是没休息好,所以复制! 复制! 复制!
- 默认配置在ribbon中都以default开头
继承关系
这个继承关系很简单有且仅有一个实现DefaultClientConfigImpl,它管理着Ribbon的常用配置。
主要方法
IClientConfig接口主要方法如下:
/**这个clientName就是我们上面说的<clientName>.ribbon.<configKey>
* 第一部分
*/
public String getClientName();
/**这个就是中间那个ribbon 所以ribbon就是默认的namespace
*所以这个值我们也是可以修改的 但是一般不会更改 没有太大的意义
**/
public String getNameSpace();
/**
* 根据给定的客户端/负载均衡器 的名字加载属性
* 会先加载默认的配置
* @param clientName
*/
public void loadProperties(String clientName);
/**
* 加载默认的配置 放进全局的配置里面。和clientName无关。公共的配置
*/
public void loadDefaultValues();
/**返回属性配置的集合
*/
public Map<String, Object> getProperties();
//以下三个方法全部过期了 不建议使用
@Deprecated
public void setProperty(IClientConfigKey key, Object value);
@Deprecated
public Object getProperty(IClientConfigKey key);
@Deprecated
public Object getProperty(IClientConfigKey key, Object defaultVal);
//判断是否包含某一个key的配置
public boolean containsProperty(IClientConfigKey key);
//解析一个配置的虚拟地址
public String resolveDeploymentContextbasedVipAddresses();
//上面三个过期的方法被以下5个方法取代
public int getPropertyAsInteger(IClientConfigKey key, int defaultValue);
public String getPropertyAsString(IClientConfigKey key, String defaultValue);
public boolean getPropertyAsBoolean(IClientConfigKey key, boolean defaultValue);
public <T> T get(IClientConfigKey<T> key);
public <T> T get(IClientConfigKey<T> key, T defaultValue);
除了以上的接口定义的方法 在DefaultClientConfigImpl中几个静态方法笔者认为也是非常重要的,我自己就经常使用到。
//获取一个空配置
public static DefaultClientConfigImpl getEmptyConfig() {
return new DefaultClientConfigImpl();
}
//根据clientName返回配置 包括默认配置 细心的小伙伴会发现我们上例中就是使用的这个方法
//构建一个IClientConfig的
public static DefaultClientConfigImpl getClientConfigWithDefaultValues(String clientName) {
return getClientConfigWithDefaultValues(clientName, DEFAULT_PROPERTY_NAME_SPACE);
}
//返回所有默认配置
public static DefaultClientConfigImpl getClientConfigWithDefaultValues() {
return getClientConfigWithDefaultValues("default", DEFAULT_PROPERTY_NAME_SPACE);
}
//这个就是自定义namespace了,你的namespace可以不是ribbon。当然了这肯定也不是唯一的地方
public static DefaultClientConfigImpl getClientConfigWithDefaultValues(String clientName, String nameSpace) {
DefaultClientConfigImpl config = new DefaultClientConfigImpl(nameSpace);
config.loadProperties(clientName);
return config;
}
好了 主要的方法 我们就介绍到这 都挺简单的方法。下面我们看一下如何创建一个IClientConfig
创建方式
- 使用DefaultClientConfigImpl扩展方法
IClientConfig emptyConfig = DefaultClientConfigImpl.getEmptyConfig();
IClientConfig userConfig = DefaultClientConfigImpl.getClientConfigWithDefaultValues("user");
- 使用IClientConfig的Builder对象来创建
IClientConfig clientConfig = IClientConfig.Builder.newBuilder().build();
IClientConfig defaultVluesConfig = IClientConfig.Builder.newBuilder().withDefaultValues().build();
- 当然我们最直接的方式也不能少
IClientConfig clientConfig = new DefaultClientConfigImpl();
以上几种方式我是建议使用第一种。通过DefaultClientConfigImpl提供的静态方法 比较方便。
结束语
我们ribbon的IConfig的基础介绍就到这里。我们总结一下以下几点
- 了解IClientConfig的方法
- 熟悉IClientConfig的创建方式 推荐DefaultClientConfigImpl 静态方法创建方式
- 了解ribbon的配置格式