文|朱德江(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() {// 注册 parserhttp.RegisterHttpFilterConfigParser(&parser{})
}func (p *parser) Parse(any *anypb.Any) interface{} {configStruct := &xds.TypedStruct{}if err := any.UnmarshalTo(configStruct); err != nil {panic(err)}v := configStruct.Valueconf := &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.golangtyped_config:"@type": type.googleapis.com/envoy.extensions.filters.http.golang.v3alpha.Configlibrary_id: examplelibrary_path: /etc/envoy/libgolang.soplugin_name: basic-authplugin_config:"@type": type.googleapis.com/xds.type.v3.TypedStructvalue: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

MoE 系列(二)|Golang 扩展从 Envoy 接收配置相关推荐

  1. MoE 系列(五)|Envoy Go 扩展之内存安全

    前面几篇介绍了 Envoy Go 扩展的基本用法,接下来几篇将介绍实现机制和原理. Envoy 是 C++ 实现的,那 Envoy Go 扩展,本质上就相当于把 Go 语言嵌入 C++ 里了. 在 G ...

  2. webapi 设置参数可为空_Web API系列(二):灵活多样的路由配置

    1.导言 路由系统是请求消息进入http://ASP.NET Web API消息处理管道的第一道屏障,其根本目的在于利用注册的路由对请求的URL进行解析以确定目标HTTPController和Acti ...

  3. MoE 系列(三)|使用 Istio 动态更新 Go 扩展配置

    上一篇我们用 Go 扩展实现了 Basic Auth,体验了 Go 扩展从 Envoy 接受配置. 之所以这么设计,是想复用 Envoy 原有的 xDS 配置推送通道,今天我们就来体验一番,云原生的配 ...

  4. MoE 系列(一)|如何使用 Golang 扩展 Envoy

    文|朱德江(GitHub ID:doujiang24) MOSN 项目核心开发者 蚂蚁集团技术专家 专注于云原生网关研发的相关工作 本文 2680 字 阅读 7 分钟 本文作为 MoE 系列第一篇,主 ...

  5. GoLang之map底层系列二(浅显学习)

    文章目录 GoLang之map底层系列二(浅显学习) 1.map++ 2.map引用传递 3.map不是并发安全 4.map的value为空接口 5.map的value为切片 6.value,ok=m ...

  6. GoLang之interface底层系列二(类型断言)

    文章目录 GoLang之interface底层系列二(类型断言) 1.抽象类型.具体类型 2.断言的作用类型与目标类型 3.空接口.(具体类型) 4.非空接口.(具体类型) 5.空接口.(非空接口) ...

  7. 微服务架构系列二:密码强度评测的实现与实验

    本文是继<微服务架构系列一:关键技术与原理研究>的后续,系列一中论述了微服务研究的背景和意义,主要调研了传统架构的发展以及存在的问题和微服务架构的由来,然后针对微服务架构的设计原则.容器技 ...

  8. protobuf3 自定义option_Protobuf3 系列二 定义复杂的proto文件

    定义复杂的对象 这是Protobuf3的系列二: 如何在protobuf中定义更复杂的对象 proto文件 除了定义string, int等基础对象外(protobuf的基础数据结构和Java变量的对 ...

  9. 搜索引擎ElasticSearchV5.4.2系列二之ElasticSearchV5.4.2+kibanaV5.4.2+x-packV5.4.2安装

    相关博文: 搜索引擎ElasticSearchV5.4.2系列一之ES介绍 搜索引擎ElasticSearchV5.4.2系列二之ElasticSearchV5.4.2+klanaV5.4.2+x-p ...

最新文章

  1. Java基础—ClassLoader的理解
  2. python三大神器之装饰器
  3. 左神算法:两个单链表相交的一系列问题(链表是否有环 / 两无环链表是否相交 / 两有环链表是否相交)
  4. Linux目录配置及应放置的内容
  5. Delphi:第一个hello world程序
  6. python 直方图排序_利用直方图对lis进行排序
  7. iOS之Cocoapods安装
  8. C++ Primer Plus学习(二)—— 基本编程技能
  9. android小小的开发细节
  10. Ardunio开发实例-雨滴传感器
  11. centos os u盘启动盘_UltraISO制作u盘centos启动盘教程
  12. c语言多位数除法,大数除法 C语言
  13. Windows XP 深度增强精简版下载 - Deepin XP Lite V2
  14. 从零部署Linux服务器完全指南2022版(CentOS 8+Nginx+PHP)
  15. InetAddress类常用方法
  16. 蓝桥杯大学本科B组考点整理
  17. 无刷电机FOC控制------转速计算、载波频率相关
  18. 使用Wireshark工具分析网络协议
  19. python小游戏扫雷怎么玩的技巧_用 Python 实现扫雷小游戏
  20. FPS游戏原理漫谈:玩家延时与服务器同步

热门文章

  1. 向更深更远处迈进 | 数据计算解密神秘宇宙
  2. charts框架 横向 纵向柱状图
  3. SSD训练数据集流程(学习记录)
  4. 【面试题】2023前端vue面试题及答案
  5. 小项目:创建收据打印程序
  6. 俄罗斯政府网站遭供应链攻击
  7. mq是消息服务器,MQ命令
  8. 资料整理中的计算机汇总方式,资料整理
  9. java内存溢出 栈溢出的原因与排查方法
  10. DataGridView导出Excel 隐藏列不显示