【es】es 的 Setting和Environment

559 篇文章 547 订阅 ¥79.90 ¥99.00

在这里插入图片描述

1.概述

转载:[3]elasticsearch源码深入分析——Setting和Environment

2.Setting

Setting<T>类位于common/settings包下,封装了典型的环境设定,比如:value,parsing,scope。在ElasticSearch或者任何ElasticSearch插件中使用到的设定,都是用这个类型安全(通过提供Property的枚举类)且通用的设定类搭配AbstractScopedSettings类来设定工程参数的。一般封装完善的基础设施类工程都会提供类似于ElasticSearch中的Setting这种环境设定类型的完善封装类。

Setting继承于ToXContentToBytes,由于ToXContentToBytesToXContent的继承类,该实现支持将对象序列化为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有
    1. Dynamic:该setting是否是动态可更新
    2. Final:该setting是否是最终地,如果是最终的,那么该setting将不可更新。在index已经关闭的情况下,在index范围内设置该属性(Final)将会失败
    3. Filtered:该setting是否配置了过滤属性
    4. NodeScope:该setting的节点范围
    5. IndexScope:该setting的索引范围
    6. Deprecated:该setting是否是被声明遗弃
    7. isGroupSetting:该setting是否是一个setting集合
  1. Function<Settings, String> defaultValue:在使用get()方法获取setting的原始默认字符串时用到,一般会传入泛型T的一个默认值((s)->value)
  2. Setting<T> fallbackSetting:如果还没有定义变量setting,就用设置回退的setting。在调用Setting的get(Settings primary, Settings secondary) 方法时,如果primary不存在的话就会调用fallbackSetting的get方法
  3. Function<String, T> parser:与validator函数接口联合使用通过get()获取setting的值
  4. Validator<T> validator

Key是Setting中定义的接口,只有一个match方法。分别有以下四个实现类:

  1. SimpleKey
  2. GroupKey:match方法检查key必须以’.'结尾
  3. ListKey:match方法检查key必须以’.'结尾
  4. 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)",那么在调用settingsget方法时就会先调用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

一个允许使用XContentBuilderObject转换为XContent的接口。输出可能是也可能不是一个值对象。实现了ToXContentObject的对象输出有效值,不过值得一提的是,实现输出不可能或可能不需要startObjectendObject原型。

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)方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值