1.概述
转载:[3]elasticsearch源码深入分析——Setting和Environment
2.Setting
Setting<T>
类位于common/settings
包下,封装了典型的环境设定,比如:value,parsing,scope
。在ElasticSearch或者任何ElasticSearch插件中使用到的设定,都是用这个类型安全(通过提供Property
的枚举类)且通用的设定类搭配AbstractScopedSettings
类来设定工程参数的。一般封装完善的基础设施类工程都会提供类似于ElasticSearch
中的Setting
这种环境设定类型的完善封装类。
Setting
继承于ToXContentToBytes
,由于ToXContentToBytes
是ToXContent
的继承类,该实现支持将对象序列化为BytesReference
,所以该类是支持序列化的。该类的继承关系如图所示:
Setting在ElasticSearch中是如何使用的呢?由于该类提供了简单直接的参数设定,先如下图这样定义一个类型为Boolean的Setting实例,类似于:
public static final Setting<Boolean>;
MY_BOOLEAN = Setting.boolSetting("my.bool.setting", true, SettingsProperty.NodeScope);
然后通过SECURITY_FILTER_BAD_DEFAULTS_SETTING.get(settings)
得到给定参数settings
中的my.bool.setting
值。当然setting
里面提供的逻辑也是很复杂。
Setting中的方法如下所示:
Setting中最关键的构造方法是:
private Setting(Key key, @Nullable Setting<T> fallbackSetting,
Function<Settings, String> defaultValue,
Function<String, T> parser,
Validator<T> validator,
Property... properties)
分别在Setting的实例中注入了以下变量:
- Key:setting的key,如果是GroupSetting则代表group的前缀
EnumSet<Property>
:包含的Property有Dynamic
:该setting是否是动态可更新Final
:该setting是否是最终地,如果是最终的,那么该setting将不可更新。在index已经关闭的情况下,在index范围内设置该属性(Final)将会失败Filtered
:该setting是否配置了过滤属性NodeScope
:该setting的节点范围IndexScope
:该setting的索引范围Deprecated
:该setting是否是被声明遗弃isGroupSetting
:该setting是否是一个setting集合
Function<Settings, String> defaultValue
:在使用get()
方法获取setting
的原始默认字符串时用到,一般会传入泛型T的一个默认值((s)->value)
Setting<T> fallbackSetting:
如果还没有定义变量setting
,就用设置回退的setting。在调用Setting的get(Settings primary, Settings
secondary) 方法时,如果primary不存在的话就会调用fallbackSetting的get方法Function<String, T> parser
:与validator函数接口联合使用通过get()
获取setting的值Validator<T> validator
Key是Setting中定义的接口,只有一个match方法。分别有以下四个实现类:
SimpleKey
GroupKey:match
方法检查key必须以’.'结尾ListKey:match
方法检查key必须以’.'结尾AffixKey
:允许静态前缀和后缀。这是用于为不同账户设置动态名称空间。
Setting中定了一个函数接口Validator<T>
,主要事来验证setting
的,定义的validate
方法被Setting
实例的值和Map(Setting)
实例所调用。如下图:
3.Settings
通过一个简单的构造方法或Settigns
的内部静态类Builder的builder
方法来产生Settings
实例。
通过Settings.Builder
来得到Builder
的实例,通过Builder 的put和set
方法来装配Builder
,最后只要调用Builder 的builder()
方法就能得到Settings
的实例。如下图:
Settings中的FilteredMap
做了函数接口封装设计,在继承AbstractMap
的基础上,定义了函数借口Predicate<String> filter
,如此的话形参filter
传入参数 "(k) -> k.startsWith(prefix)"
,那么在调用settings
的get
方法时就会先调用filter.test(key)
来判断key是不是符合startWith(prefix)
,从而达到了过滤的效果。
申明:
private static final class FilteredMap extends AbstractMap<String, String>
构造方法:
FilteredMap(Map<String, String> delegate, Predicate<String> filter, String prefix)
下图是Setting和Settings的继承关系图,可见Setting和Setting之间并无直接关系:
4.ToXContent
一个允许使用XContentBuilder
从Object
转换为XContent
的接口。输出可能是也可能不是一个值对象。实现了ToXContentObject
的对象输出有效值,不过值得一提的是,实现输出不可能或可能不需要startObject
和endObject
原型。
ToXContent
接口中定义了空类型参数,Map类型参数,委托类型参数
,在ElasticSearch输出各种内容的时候用到。
5.Environment
在上一篇中提到了在启动过程中作为重要参数传递的Environment
实例,包含了很多类似于path.home,path.data,path.logs,path.repo,path.shared_data,pidfile
的参数设定,如下所示:
在Environment的构造参数Environment(final Settings settings, final Path configPath)
中,依次检查构造了上述提到的参数。
Environment的源码比较简单,简单就是一些参数的封装,提供了若干参数获得的方法,如下图:
6.另外关于XContent相关类
在common
下的xcontent
模块(Xcontent接口,CborXContent类,JsonXContent类,SmileXContent类,YamlXContent类)
,是ElasticSearch
响应cat API
请求时,指定响应返回数据格式(cbor,json,smile,yaml)
用到的模块,在设置http
请求的x-content
内容时使用到。
在代码中也可以看到,在rest包的AbstractRestChannel
有调用到XContentBuilder(XContent xContent, OutputStream os, Set<String> includes, Set<String> excludes)
方法。