首页 文章 精选 留言 我的

精选列表

搜索[api],共10000篇文章
优秀的个人博客,低调大师

图解kubernetes中的api多版本中反序列化与转换

在之前的文章中分析过kubernetes是如何进行多版本管理中提到了一个关键的设计解码器, 负责将请求对象反序列化成一个具体的数据模型,今天一起来了解下其内部是如何实现多版本管理、转换的设计要点 1.版本化管理的关键设计 1.1 从拓扑转换到星状转换 在通常的web开发中更多的时候,大家都是断代向前兼容更新,大多数情况下当版本更新之后会独立演进,如果要在多版本之间转换通常则会出现如下的情况 如果我们要为每个版本都去适配其他所有的版本,则复杂度会指数级上升,而在kubernetes中则通过一个内部版本的设计来进行解决,内部版本是一个稳定的版本,所有的版本都只针对目标版本来进行转换的实现,而不关注其他版本 1.2 兼容设计之转换 那如果谋个版本需要独立的演进,或者增设一些新的字段,修改字段名称等破坏性更新的时候,则就需要一种转换机制,负责在当前版本和内部版本之间来进行字段或者数据的转换 1.3 转换的最终之反射 转换其实核心目标是完成从目标对象的字段中获取数据,然后经过一系列操作最终为目标对象的对应的字段进行赋值操作,要完成该操作,则就需要借助反射来实现,通过枚举字段,来获取对应的转换函数,执行转换函数,完成目标赋值 2. 关键设计的实现 为了实现上面的方案,kubernetes中设计了如下组件:Scheme(负责各个版本的注册和管理)、Convert(转换实现)、Serializer(实现对应版本的反序列化),让我们依次看下其关键设计 2.1 Convert Convert实现从一个目标对象到另外一个目标对象的转换, 为了实现这种转换,kubernetes里面主要是借助反射和不同版本的转换函数来共同完成 1.首先我们通过目标函数来获取对应的属性字段,然后针对该字段进行计算赋值操作 2.如果发现对应的字段需要来转换,则会调用对应的转换函数来进行赋值操作,如果不需要转换则会直接通过反射来进行赋值 2.2 外部版本到内部版本的转换 在构建rest接口的时候,每个rest接口都会持有一个生成当前版本对象的构造函数,当请求进入之后,会首先通过目标版本获取对应的decoder decoder会利用当前的GroupVersionKind来进行第一步解析,首先将字节数组解析成当前版本,然后在解析成目标对象之后,又会根据目标版本进行转换 2.3 Scheme Scheme负责各个资源版本的统一注册和管理,为其他组件提供根据GVK来获取对应的资源对象,也提供通过资源对象获取版本等操作,内部还持有convert对象,包装了源对象到目标对象的转换操作 Scheme对象是一个复合的数据结构,其实现了多种结果,诸如typer、defaulter、creater等,很多地方都是通过直接传递scheme来进行对应的参数的填充, 其内部关键数据结构如下 GVK与资源类型的映射,以及当前资源类型支持哪些GVK gvkToType map[schema.GroupVersionKind]reflect.Type typeToGVK map[reflect.Type][]schema.GroupVersionKind 则创建对象的时候可以直接通过New来实例化对应的对象 func (s *Scheme) New(kind schema.GroupVersionKind) (Object, error) { if t, exists := s.gvkToType[kind]; exists { // 利用反射来创建对象 return reflect.New(t).Interface().(Object), nil } // 省略相关代码 } 默认初始化函数 defaulterFuncs map[reflect.Type]func(interface{}) 根据对应的类型来完成初始化操作 func (s *Scheme) Default(src Object) { if fn, ok := s.defaulterFuncs[reflect.TypeOf(src)]; ok { fn(src) } } 提供转换函数注册接口, 注册到convert中 func (s *Scheme) AddConversionFunc(a, b interface{}, fn conversion.ConversionFunc) error { return s.converter.RegisterUntypedConversionFunc(a, b, fn) } 3.学习总结 实现上无疑是复杂的作为一个工业设计有很多需要care的边缘情况,剖丝抽茧每个人看到的都不一样,这可能就是源码阅读的乐趣,从上面可以看到核心其实就三个点:将HTTP数据反序列化成为当前URL的资源对象,然后目标资源对象进行初始化默认值函数的执行,最后通过convert来处理不同版本之间的差异,最后统一操作内部版本,好了今天就到这了,希望对大家有所帮助 > 微信号:baxiaoshi2020 > 关注公告号阅读更多源码分析文章 > 更多文章关注 www.sreguide.com > 本文由博客一文多发平台 OpenWrite 发布

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册