Istio技术与实践04:最佳实践之教你写一个完整的Mixer Adapter
Istio内置的部分适配器以及相应功能举例如下:
circonus:微服务监控分析平台。
cloudwatch:针对AWS云资源监控的工具。
fluentd:开源的日志采集工具。
prometheus:开源的时序数据库,非常适合用来存储监控指标数据。
statsd:采集汇总应用指标的工具。
stdio:使Istio能将日志和metrics输出到本地,结合内置的ES、Grafana就可以查看相应的日志或指标了。
现在我们将逐步向您介绍如何在Mixer中开发、测试和集成一个简单的适配器。该适配器可以支持Mixer附带的metric模板,并且对于每一个请求,在请求时将从Mixer接收的数据打印到文件中去。
完成本次实例的开发部署与编译运行总共只需要几步,大约需时30分钟。所以通过本实例,您只需要短短半个小时就可以掌握一个adpater适配器的开发运行过程,是不是很easy?那我们现在就开始吧!
因篇幅有限,只截取关键代码(后续代码模块皆为关键代码)如下所示,它定义了适配器Builder和Handler类型以及处理metric的业务逻辑接口。虽然还没有实现业务处理,但我们不妨通过下图先了解一下adapter的代码结构。
var _ metric.HandlerBuilder = &builder{}
var _ metric.Handler = &handler{}
func (b *builder) Build(ctx context.Context, env adapter.Env) (adapter.Handler, error) {
return &handler{}, nil
}
func (h *handler) HandleMetric(ctx context.Context, insts []*metric.Instance) error {
return nil
}
但是二者必不可少。Builder的功能类似于构造器,可以通过加载相关参数(比如从配置文件中直接读取)生成一个Handler,而Handler是配置好的Adapter的实例。后者可以参与处理metric业务。
如上所示现在我们有了一个适配器的基本框架,其中包含HandleMetric接口的空实现。HandlerMetric是适配器中处理业务逻辑的实现方法也是核心方法,在该方法中我们可以将收集到的metric进行数据处理然后上报出去,后台的程序接收到这些处理后的metric数据就可以进行相应数据监控和分析了。在后面的步骤中将添加此适配器的核心代码。
适配器配置
适配器要发挥特定的作用,必须要对其做相应的配置处理。由于在本次实践中我们只是将通过将从Mixer接收的数据打印到文件中来演示一下adapter的功能。因此适配器需要将文件的路径作为配置字段,在config目录下创建配置proto文件。
config.proto文件是一个专门用来配置适配器参数的文件,在该文件中我们可以设置testAdapter.go中需要用到的所有配置信息比如缓存大小、发生计时器大小等,但是一定要注意proto中每行代码都需要注释,后面的yaml文件也可以从该文件中读取参数。编写完成后,用go generate ./ …指令可以进行编译并生成相应go文件。现在让我们将config.proto文件生成相应的go文件。然后我们可以输入如下指令来编译调试proto文件。
go generate ./...
go build ./...
配置完proto文件,咱们还需要配置yaml文件。不同的adapter具有不同的attributes,yaml用模板的形式定义了attributes到adapter输入数据映射的schema,一个适配器可以支持多个模板。而Mixer的yaml配置可以看成是三种模型的模板集成到一个文件下,分别是Handler、Instance和Rule。
这三种模型分别具有什么样的功能呢?
Handler是配置好的Adpater的实例,它从yaml配置文件中取出adapter需要的配置数据。
Instance定义了attributes到adapter输入的映射。
Rule定义了一个特定的Instance何时调用一个特定的Handler。
三种模型通过yaml中的kind进行区分。要让适配器工作起来,我们必然需要配置yaml来将attributes映射到adapter里面。所以,让我们给Mixer编写一个简单的yaml配置,以便将数据发送到您的适配器。我们需要将实例,处理程序和规则配置传递给Mixer服务器。当然我们本次实践主要是为了进行一个adapter端到端的演示,所以一个完整的输出到文件中的metric应该还需要指定它的输出路径。
通过配置文件在对应的文件中打印实例和关联的类型信息,这需要在配置时存储metric标准类型信息并在请求时使用它。要添加此功能,需要在文件testAdapter.go中加入相应业务逻辑处理的代码。如下所示:
func (h *handler) HandleMetric(ctx context.Context, insts []*metric.Instance) error {
for _, inst := range insts {
if _, ok := h.metricTypes[inst.Name]; !ok {
h.env.Logger().Errorf("Cannot find type %s",inst.Name)
continue
}
h.f.WriteString(fmt.Sprintf(`HandleMetric invoke for :
Instance Name :'%s'
Instance Value : %v,
Type : %v`, inst.Name, *inst, *h.metricTypes[inst.Name]))
}
return nil
}
然后编译就可以了,这样就完成了适配器代码的实现部分。那么适配器是如何在Mixer中进行工作以及我们如何验证所编写的代码做了哪些事呢?下面的步骤将告诉你答案。
将适配器插入Mixer中
适配器开发完以后,我们还需要将适配器插入进Mixer中,首先要更新inventory.yaml文件并且将新的适配器添加到Mixer的适配器注册列表中。通过go generate命令在/adapter目录中运行来重新生成库存代码。到这里您的适配器已经插入到Mixer中并已经准备好接收数据。
本地验证适配器
以上工作做完以后,我们就可以在本地进行端到端的验证了。启动Mixer终端将会输出相应信息,并处于等待服务请求状态。
现在让我们使用Mixer客户端调用report请求。在这里我们需要Mixer服务器使用yaml构造的实例对象调用样例adapter。并启动一个新的终端窗口。在新窗口中调用命令:
tail $ ISTIO /istio/cloud.txttail $ ISTIO /istio/cloud.txt
执行完以后检查cloud.txt文件,就会看到相应的打印信息。
如何将Mixer集成到K8S环境中运行调试
在上面我们仅向大家演示了如何在本地测试自己开发的adapter。我想大家对于Istio充满热情的很大原因都是因为其可以部署集成到Kubernates(K8S)环境中运行。那么今天正好可以向您介绍如何将Mixer打包成镜像在K8S集群节点上运行调试。
在这里我们需要再回顾一下yaml文件,yaml文件可以完美的将我们需要上报的参数传递给k8s,在这里我们以一个流量监控的案例来简单描述一下adapter怎样与K8S协作运行。如下图所示:
首先定义一个用来计数的metric,它会根据我们定义的参数去采集相应数据,例如命名空间等,这些都将会传递到K8S中,还会将自己的value属性传递进HandlerMetric业务逻辑中,在HandlerMetric中我们就可以通过它的属性“1”来进行一个请求计数,从而实现流量监控的功能。
定义完了metric,我们还需要定义一个Handler来处理这个metric,如下所示:
在这个handler中我们将去处理COUTER类型的metric并获取其上报上来的参数,然后上报到指定的ip地址(自己根据需要设置)、集群等等。最后我们还需要在yaml中定义一个规则去调度使用你的handler,如下所示:
通过以上我们可以很清晰的看到。Mixer与K8S直接是通过上述yaml文件定义的参数来实现无缝衔接的集成部署。定义完yaml,我们还需要将其部署到heml文件夹下,如下图所示的目录中:
并且将上述yaml中的内容配置到该文件夹下的config.yaml中,这样当在界面上安装Istio控制面的时候,适配器上报过来的环境变量就会自动注入K8S的环境中。进而可以实现Mixer在K8S环境中的集成部署。接下来我们就可以将Mixer下的文件编译成二进制文件,然后制作成镜像,将镜像输出为tar包。通过远程登录命令ssh到自己的集群节点上,然后将镜像拷贝到环境上。到这里,如果你在pod列表中看到我们刚刚自己创建的镜像名,那么就表示我们的适配器已经成功部署到K8S环境中了。然后可以通过kubectl来查看日志了解自己的适配器工作情况。
Istio技术与实践04:最佳实践之教你写一个完整的Mixer Adapter的更多相关文章
- jQuery插件的编写相关技术 设计总结和最佳实践
原文:http://www.itzhai.com/jquery-plug-in-the-preparation-of-related-technical-design-summary-and-best ...
- [转]15年双11手淘前端技术巡演 - H5性能最佳实践
[原文地址]:https://github.com/amfe/article/issues/21 前言 2015年是全面『无线化』的一年,在BAT(财报)几家公司都已经超过50%的流量来自移动端,这次 ...
- UNIX-LINUX编程实践教程->第八章->实例代码注解->写一个简单的shell
一 分析 要实现一个shell,需包含3个步骤 1)读入指令 2)指令解析 3)执行指令 1 从键盘读入指令 从键盘读入指令的几个要点: 1)调用getc函数等待并获取用户键盘输入. 2)每一行命令的 ...
- 精彩分享 | 欢乐游戏 Istio 云原生服务网格三年实践思考
作者 吴连火,腾讯游戏专家开发工程师,负责欢乐游戏大规模分布式服务器架构.有十余年微服务架构经验,擅长分布式系统领域,有丰富的高性能高可用实践经验,目前正带领团队完成云原生技术栈的全面转型. 导语 欢 ...
- (转)iOS 最佳实践
本文转自http://www.jianshu.com/p/b0bf2368fb95 感谢作者和译者 iOS最佳实践 iOS最佳实践 译者注 本文翻译自 futurice 公司的 iOS Good Pr ...
- Aggregated APIServer 构建云原生应用最佳实践
作者 张鹏,腾讯云容器产品工程师,拥有多年云原生项目开发落地经验.目前主要负责腾讯云 TKE 云原生 AI 产品的开发工作. 谢远东,腾讯高级工程师,Kubeflow Member.Fluid(CNC ...
- (转载)RxJava 与 Retrofit 结合的最佳实践
RxJava 与 Retrofit 结合的最佳实践 作者:tough1985 感谢 DaoCloud 为作者提供的 500 RMB 写作赞助: 成为赞助方 /开始写作 前言 RxJava和Retrof ...
- Salesforce 开发整理(五)代码开发最佳实践
在Salesforce项目实施过程中,对项目代码的维护可以说占据极大的精力,无论是因为项目的迭代,还是需求的变更,甚至是项目组成员的变动,都不可避免的需要维护之前的老代码,而事实上,几乎没有任何一个项 ...
- 基于ABP落地领域驱动设计-02.聚合和聚合根的最佳实践和原则
目录 前言 聚合 聚合和聚合根原则 包含业务原则 单个单元原则 事务边界原则 可序列化原则 聚合和聚合根最佳实践 只通过ID引用其他聚合 用于 EF Core 和 关系型数据库 保持聚合根足够小 聚合 ...
随机推荐
- JavaScript基础------JavaScript语法
js的注释与分号 // 单行注释 /**/多行注释 ctrl +shift +/ 语句结束使用分号,如果省略,则由解析器确定语句的结尾js语法 1.变量.函数名.操作符都区分大小写 2.标识符 (1) ...
- Introduction - Supervised Learning
摘要: 本文是吴恩达 (Andrew Ng)老师<机器学习>课程,第一章<绪论:初识机器学习>中第3课时<监督学习>的视频原文字幕.为本人在视频学习过程中逐字逐句记 ...
- vue文字向上滚动
<template> <vue-seamless-scroll :data="listData" :class-option="optionHover& ...
- 获取父窗口iframe的ztree对象
问题如下:我要在jqgrid中获取ztree的选中节点对象 var iframe = parent.$("#ztree的iframeId").contents(); var ztr ...
- jquery和Ajax(异步js和XML)的应用
Ajax不是值一种单一的技术,而是有机的利用了一系列的交互式网页应用相关的技术所形成的的结合体.它的出现,解开了无刷新更新网页的新时代,并代替传统的Web方式和通过隐藏的框架来进行异步提交的趋势,是w ...
- poj1915(双向bfs)
题目链接:https://vjudge.net/problem/POJ-1915 题意:求棋盘上起点到终点最少的步数. 思路:双向广搜模板题,但玄学的是我的代码G++会wa,C++过了,没找到原因QA ...
- 输出重定向之python2和python3的区别
python语句支持输出重定向到文件里,与shell类似使用“>>”来重定向输出. python2: logfile = open('mylog.txt', 'a') print > ...
- 【Python】【demo实验36】【基础实验】【求3*3矩阵的主对角线之和】
题目: 求一个3*3矩阵主对角线元素之和. 主对角线:从左上多右下的书归为主对角线 副对角线:从左下至右上的数归为副对角线. 我的源码: #!/usr/bin/python # encoding=ut ...
- SQL SERVER DAY函数
定义: DAY函数返回指定日期的日的部分 语法: DAY(date) 参数: ①date参数是合法的日期表达式. 返回值: int型数据 例: 声明:本文是本人查阅网上及书籍等各种资料,再加上自己的 ...
- Double write Buffer的配置
InnoDB和XtraDB使用称为doublewrite缓冲区的特殊功能来提供数据损坏的强大保证.想法是在写入数据文件之前将数据写入主表空间中的顺序日志.如果发生部分页面写入(换句话说,写入损坏),I ...