目录
介绍
架构
源码架构图
核心模块
关键内容
RestFul矩阵参数
总结及思考
edda源码树及描述
介绍
Edda是一项Netflix开发的用于云资源追踪的开源服务,可通过AWS API轮询您的AWS资源并记录结果。它使您可以快速搜索资源,并显示资源随着时间的变化。
架构
Edda是一个Scala应用程序,可以在单个实例上运行,也可以扩展到负载均衡器后面运行的许多实例,以实现高可用性。Edda当前支持的数据存储是MongoDB,它也具有足够的通用性,可以与Edda服务一起在单个实例上运行,也可以扩展为包含大型复制集。当作为集群运行时,Edda将自动选择一个领导者,然后执行所有AWS轮询(默认情况下每60秒一次)并保留数据。其他辅助服务器将刷新其内存记录(默认情况下每30秒刷新一次)并处理REST请求。
源码架构图
![](https://i-blog.csdnimg.cn/blog_migrate/0262e2e68cca1ee211e6830acc7adaf4.png)
核心模块
Crawler:使用SDK轮询AWS资源信息,具体包括实例信息、负载均衡、告警、镜像等等合计15种资源信息。
BeanMapper:将AWS Bean 映射成Scala对象
Record:核心伴生对象,主要是维护了从AWS取到的数据信息及相关时间等等记录,内部的stime用来判断是否更新本地内存中的资源信息
Collection:核心集合,内部维护了一个Map作为缓存信息,这个Map存放的就是可提供查询的信息,供Restful接口资源调用;同时它作为leader时是 SDK 轮询的发起者,作为worker时是内存的同步者
Observable:观察者对象,被Crawler所集成,即触发观察者们(SDK)的资源轮询
Queryable:作为一个可被条件查询的集合对象,Collection内部的Map存放的Value就是一个Queryable,它提供了对Record的查询
Datastore:各项持久化数据,包括了从内存到mongo持久化的Record数据、DynamoDB和S3上存储的持久化活动记录等等
Resource:提供自定义条件的RestFul资源查询,即向外服务的接口
Elector:领导选举父类,包括了edda集群中leader的选举,DynamoDB、MongoDB相关选举(与edda数据同步相关)
关键内容
1.edda自行选择leader,只有leader才会去调用AWS 的 SDK获取资源信息,其他worker主要是进行信息同步和提供RestFul接口查询
2.数据发生变更时才会更新本地Record
3.CollectionRefresher控制爬虫刷新频率,即调用aws频率;同时,从数据源同步数据到本地内存
RestFul矩阵参数
使用矩阵参数可以找到特定的资源,而使用字段选择器则可以仅提取您感兴趣的数据元素
在edda里,总计12个矩阵参数(_all、_since......等等,都是自行实现的),这些参数用来做资源的筛选条件,它使用 Field Selectors 来控制资源的返回信息
例如:
# set the base url
export ASGS="http://localhost:8080/edda/api/v2/aws/autoScalingGroups/edda-v123"
# filter the results to the specified fields
curl "$ASGS;_pp:(autoScalingGroupName,instances:(instanceId,lifecycleState))"
#获取到的数据
{
"autoScalingGroupName" : "edda-v123",
"instances" : [
{
"instanceId" : "i-0123456789",
"lifecycleState" : "InService"
},
{
"instanceId" : "i-012345678a",
"lifecycleState" : "InService"
},
{
"instanceId" : "i-012345678b",
"lifecycleState" : "InService"
}
]
} |
总结及思考
- 取到的云资源memory是先存储到本地jvm,是否可借鉴
- 它并未解决云平台限流问题,只是通过配置控制了自己调用SDK的频率(edda.properties配置为2分钟)
- edda主要提供的是查询功能,它自己能集群化,此时自行做领导选举,领导通过SDK调用云平台,非领导做信息同步,然后向外提供restFul接口
- edda源码里大部分代码都是在协调领导选举和保持数据一致性
- 我们的注册中心可以采用类似轮询SDK方式获取云资源信息
- 限流问题根本似乎无法解决,只能通过降低频率的方式,如果被限流了我们提供本地旧数据是否可行?
- 注册中心是否可能集群化去满足查询需求,是否考虑效仿edda一样准备领导选举,只让单个服务调用云SDK(预留)
- 感觉矩阵参数可读性比较差,需要自行编写矩阵参数拿数据,操作难度大,用起来很麻烦
edda源码树及描述
└── main
├── resources
│ ├── edda.properties edda相关配置信息
│ ├── elasticsearch
│ └── log4j.properties
├── scala
│ └── com
│ └── netflix
│ └── edda
│ ├── aws
│ │ ├── AwsClient.scala 提供对AWS服务客户端对象的访问
│ │ ├── AwsCollections.scala aws收集器对象工厂,提供获取aws上各种信息的抽象方法
│ │ ├── AwsCrawlers.scala 真实调用aws sdk的封装类,映射到本地bean类
│ │ ├── DynamoDBElector.scala 领导选举相关
│ │ ├── DynamoDB.scala aws DB服务器
│ │ └── S3CurrentDatastore.scala 管理S3桶数据
│ ├── basic
│ │ ├── BasicBeanMapper.scala javaBean转成scala对象
│ │ ├── BasicContext.scala 基础上下文
│ │ ├── BasicRecordMatcher.scala 对内存中的数据做高级查询匹配
│ │ └── BasicServer.scala 初始化基础服务,初始化集合,启动服务
│ ├── BeanMapper.scala bean映射的scala的特征(接口)
│ ├── CollectionManager.scala 操作本地内存的manager
│ ├── CollectionProcessor.scala 集合操作处理器
│ ├── CollectionRefresher.scala 集合数据刷新,调用处理器去刷新数据
│ ├── Collection.scala 集合数据对象,提供对集合内部数据的处理
│ ├── Crawler.scala 爬虫对象类,生成记录,触发观察者事件
│ ├── Datastore.scala 数据源特征(接口)
│ ├── elasticsearch
│ │ ├── ElasticSearchDatastore.scala els数据源查询相关,如果不是leader则从数据源查询数据,对内存数据刷新
│ │ └── ElasticSearchElector.scala 领导选举相关
│ ├── ElectorPoller.scala 领导选举轮询器
│ ├── Elector.scala 领导选举类
│ ├── ExecutionContexts.scala 线程池上下文
│ ├── FileElector.scala 文件领导选举,做测试用的领导选举类
│ ├── GroupCollection.scala 将组数据添加到集合
│ ├── MergedCollection.scala 合并而成的集合
│ ├── mongo
│ │ ├── MongoDatastore.scala mongoDb数据源增删改查
│ │ └── MongoElector.scala 领导选举相关
│ ├── Observable.scala 观察者抽象类
│ ├── Queryable.scala 查询者抽象类
│ ├── RecordMatcher.scala 数据匹配特征,提供一个数据过滤方法
│ ├── Record.scala 伴生数据对象
│ ├── RequestId.scala 请求id封装类,相当于一个主键,操作时带着走
│ ├── resources
│ │ └── CollectionResource.scala 提供restFulApi查询
│ ├── StateMachine.scala 通过requestId观察对象状态
│ ├── Utils.scala 工具类,包括从文件获取参数值等等
│ └── web
│ └── FieldSelectorParser.scala selector,提供对restFul请求返回值做过滤 |
官网地址:https://netflix.github.io/edda/
RestFul地址:https://netflix.github.io/edda/rest-api/
Field Selectors 文档地址:https://developer.linkedin.com/docs/v1/people/field-selectors