MoE 系列(二)|Golang 扩展从 Envoy 接收配置
文|朱德江(GitHub ID:doujiang24)
MOSN 项目核心开发者蚂蚁集团技术专家
专注于云原生网关研发的相关工作
本文 1445 字 阅读 5 分钟
上一篇我们用一个简单的示例,体验了用 Golang 扩展 Envoy 的极速上手。
这次我们再通过一个示例,来体验 Golang 扩展的一个强大的特性:
从 Envoy 接收配置 。
Basic Auth
我们还是从一个小示例来体验,这次我们实现标准的 Basic Auth 的认证,与上一次示例不同的是,这次认证的用户密码信息,需要从 Envoy 传给 Go,不能在 Go 代码中写死了。
完整的代码可以看 example-basic-auth[1],下面我们展开介绍一番。
获取配置
为了更加灵活,在设计上,Envoy 传给 Go 的配置是 Protobuf 的 Any 类型,也就是说,配置内容对于 Envoy 是透明的,我们在 Go 侧注册一个解析器,来完成这个 Any 配置的解析。
如下示例:
func init() { // 注册 parser http.RegisterHttpFilterConfigParser(&parser{}) } func (p *parser) Parse(any *anypb.Any) interface{} { configStruct := &xds.TypedStruct{} if err := any.UnmarshalTo(configStruct); err != nil { panic(err) } v := configStruct.Value conf := &config{} if username, ok := v.AsMap()["username"].(string); ok { conf.username = username } if password, ok := v.AsMap()["password"].(string); ok { conf.password = password } return conf }
这里为了方便,Any 中的类型是 Envoy 定义的 TypedStruct 类型,这样我们可以直接使用现成的 Go pb 库。
值得一提的是,这个配置解析,只有在首次加载的时候需要执行,后续在 Go 使用的是解析后的配置,所以,我们解析到一个 Go map 可以拥有更好的运行时性能。
同时,由于 Envoy 的配置,也是有层级关系的,比如 http-filter, virtual host, router, virtual clusters 这四级,我们也支持这四个层级同时有配置,在 Go 侧来组织 merge。
当然,这个只有在 Go 侧有复杂的 filter 组织逻辑的时候用得上,后面我们在 MOSN 的上层封装的时候,可以看到这种用法,这里暂时不做展开介绍。
认证
具体的 Basic Auth 认证逻辑,我们可以参考 Go 标准 net/http 库中的 Basic Auth 实现。
func (f *filter) verify(header api.RequestHeaderMap) (bool, string) { auth, ok := header.Get("authorization") if !ok { return false, "no Authorization" } username, password, ok := parseBasicAuth(auth) if !ok { return false, "invalid Authorization format" } if f.config.username == username && f.config.password == password { return true, "" } return false, "invalid username or password" }
这里面的 parseBasicAuth
就是从 net/http 库中的实现,是不是很方便呢。
配置
简单起见,这次我们使用本地文件的配置方式。如下是关键的配置:
http_filters: - name: envoy.filters.http.golang typed_config: "@type": type.googleapis.com/envoy.extensions.filters.http.golang.v3alpha.Config library_id: example library_path: /etc/envoy/libgolang.so plugin_name: basic-auth plugin_config: "@type": type.googleapis.com/xds.type.v3.TypedStruct value: username: "foo" password: "bar"
这里我们配置了用户名密码:foo:bar
。
预告一下,下一篇我们会体验通过 Istio 来推送配置,体会一番动态更新配置的全流程。
测试
编译,运行,跟上篇一样,我们还是使用 Envoy 官方提供的镜像即可。
跑起来之后,我们测试一下:
$ curl -s -I 'http://localhost:10000/' HTTP/1.1 401 Unauthorized # invalid username:password $ curl -s -I 'http://localhost:10000/' -H 'Authorization: basic invalid' HTTP/1.1 401 Unauthorized # valid foo:bar $ curl -s -I 'http://localhost:10000/' -H 'Authorization: basic Zm9vOmJhcg==' HTTP/1.1 200 OK
是不是很简单呢,一个标准的 Basic Auth 扩展就完成了。
总结
Envoy 是面向云原生的架构设计,提供了配置动态变更的机制,Go 扩展可以从 Envoy 接受配置,也就意味着 Go 扩展也可以很好的利用这套机制。
Go 扩展的开发者,不需要关心配置的动态更新,只需要解析配置即可,非常的方便~
下一篇我们会介绍,配合 Istio 来动态更新用户名密码,体验一番云原生的配置变更体验。
后续还有更多 Golang 扩展的特性介绍,原理解析,以及,更上层的 MOSN 集成体验,欢迎持续关注。
[1]example-basic-auth:
https://github.com/doujiang24/envoy-go-filter-example/tree/master/example-basic-auth
了解更多…
MOSN Star 一下✨:
https://github.com/mosn/mosn
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
DLRover:云上自动扩缩容 DeepRec 分布式训练作业案例分享
文|王勤龙(花名:长凡) 蚂蚁集团技术专家 文|韩旭东(花名:玄钛) 蚂蚁集团高级开发工程师 专注于分布式深度学习领域,主要负责蚂蚁大规模分布式训练引擎的设计和开发。 本文 3988 字 阅读10 分钟 01 背景 如今,深度学习已广泛应用在搜索、广告、推荐等业务中,这类业务场景普遍有两个特点: 1)训练样本量大,需要分布式训练提升训练速度; 2)模型稀疏,即模型结构中离散特征计算逻辑占比较高。 DeepRec是阿里云机器学习平台 PAI 开源的面向推荐场景的高性能深度学习框架,针对稀疏模型在分布式、图优化、算子、Runtime 等方面进行了深度的性能优化,同时提供了搜索、推荐、广告场景下特有的动态弹性特征,动态弹性维度,自适应 EmbeddingVariable、增量模型导出及加载等一系列功能。 越来越多的公司为了节省成本开始在云上训练 AI 模型。通常,用户在云上提交一个分布式训练作业需要给作业配置资源,包括节点的数量和每个节点的资源(CPU & memory 等)。资源是影响训练性能的一个重要因素。在观察蚂蚁的 Kubernetes 集群上几千个训练作业后,我们发现大量的...
- 下一篇
ChatGPT 火了,一大批开源平替也来了
ChatGPT 凭一己之力让全球为 AI 沸腾,引发了科技巨头之间的聊天机器人军备竞赛。 众所周知,ChatGPT 的背后技术是 GPT(Generative Pre-trained Transformer)模型。GPT 是一种基于 Transformer 模型的自然语言处理模型,由 OpenAI 公司开发。它可以通过学习大量的自然语言数据来生成自然流畅的文本,例如文章、对话等。 2019 年 11 月,OpenAI 开源了 GPT-2 语言模型的完整版本(有 15 亿个参数)。GPT-2 是作为 OpenAI 2018 年 GPT 模型的 "直接扩展" 而创建的,其参数和训练数据集的大小都增加了 10 倍。 在 GPT-2 之后,OpenAI 又推出了 1750 亿个参数的 GPT-3,只是其源代码从未被公开。OpenAI 认为 GPT-3 可能被滥用,因此不应开源。包括后来的 GPT-3.5、GPT-4 都没有开源。目前,公开免费版 ChatGPT 仍然基于 GPT-3.5,不过按月订阅 “ChatGPT Plus” 的用户能够试用由 GPT-4 提供支持的更新版本的 Cha...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7设置SWAP分区,小内存服务器的救世主
- Hadoop3单机部署,实现最简伪集群
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Red5直播服务器,属于Java语言的直播服务器
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- CentOS8安装Docker,最新的服务器搭配容器使用
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Linux系统CentOS6、CentOS7手动修改IP地址
- Windows10,CentOS7,CentOS8安装Nodejs环境
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作