【Go研究】Go语言脚本化的可行性——yaegi项目体验
0x01 背景——云计算中脚本化困境
作为云基础设施管理中,大量需要跟文件系统、容器等相关的操作,这些操作实现通常用脚本来实现。
现在探讨下,这些脚本为什么一定要用脚本语言来实现,以及目前实现中的常见的问题。
常见的两个场景:安装与升级。
安装过程的特点是,涉及大量的文件拷贝、服务启停、配置文件更新。升级的过程也类似,升级过程还要考虑热升级过程中对业务的影响,相对更加复杂。
另外一个特点是对内的,这两种运维性质的操作是一种通用的机制类活动,所有参与到一个产品中的团队和服务都要考虑,但各种业务服务可能有不同的操作,所以要求这种机制具备足够的扩展性和灵活性。
所以这种特点要求此类活动,有通用机制+扩展插件组成。通用机制有专门的团队提供和维护,扩展性插件由各业务自己负责。
而扩展性的插件可以如下的实现方式:
- 直接使用脚本,也是目前大规模使用的。
- 使用某种DSL实现。
- 使用二进制,即各业务提供自己的二进制,由框架在合适的时机调用。
先分析下第3种的问题。第3种一般来说没什么可挑剔的。但对使用的语言的要求,要求它足够高效率,而且容易移植到其他的Linux环境中。如果放在云环境下,似乎很难找到合适的。大家一开始想到的就是Go语言,但Go编译后的二进制体积过大。升级又通常要求多个版本共存,对存储有很大的压力,直接使用Go语言有点尴尬。
使用脚本呢?目前在用的,但也有一些问题。最常用的脚本语言是Bash Shell,这种语言少量的代码还可以维护,代码量大了之后,就会遇到很问题。
- 语法过于灵活,跟常用的Go这种语言相比,上手容易,写出稳健的代码比较难。
- 坑很多。即使用了shellcheck工具,也很难发现所有问题。
- 处理yaml/json/ini这种配置文件比较麻烦,需要借助jq/yq这种工具。
那么自然想到使用Python语言。但Python也有自己的问题。
- pypi上的软件包需要rpm化,才能统一管理,依赖某个库,就要先把库打到整包中才能使用,打包比较繁琐。
- rpm包容易产生依赖地狱,可能与OS强相关的一些库冲突。
假如能将Go直接作为一种脚本执行,是不是就可以完美解决其他脚本语言的问题了呢。
一种直接的想法,是将Go直接集成到运行环境中,go run就可以了,但go run有一个编译过程,有时候很慢,这点生产环境下肯定不行。
0x02 Go 脚本化的可能性
从社区中了解到了https://github.com/traefik/yaegi这个项目。基本的使用方法可以从官方文档中看到,不用额外的实验也知道初步看是具备以下能力:
- 可以直接解释执行一个只引用了标准库的.go文件。
- 也可以作为module引用到一个项目中,动态解释了执行Go语句。
先不说项目本身的稳定性,但距离一个真正可用的脚本化语言还有以下疑问:
- 能否快捷的引用其他的第三方库,比如yaml的读写。
- 能否建立一个定制化的公共库,如日志、事务等。
它是通过如下方式引用的引用标准库:
- 将所有标准库的代码中导出的函数整理在了stdlib目录下。
- 然后将通过Symbols map保存这些导出函数、类型的反射对象。
func init() {Symbols["runtime/runtime"] = map[string]reflect.Value{// function, constant and variable definitions"BlockProfile": reflect.ValueOf(runtime.BlockProfile),...}
}
不难猜出,它是通过这样的方式实现脚本中的动态调用标准库函数。
先来实验下yaml读写。demo示例见https://github.com/go-yaml/yaml/tree/v3,由于提前看了下yaegi的实验,看起来它是支持加载其他库的,只要它能在GOPATH下找到这些源码。
将readme中的demo保存下,直接使用yaegi运行。
run: demo.go:7:2: import "gopkg.in/yaml.v3" error: package location /mnt/data/code/lean/go not in GOPATH
直接报了错。
按照要求的路径,将yaml.v3 git clone到指定的路径 $GOPATH/src/gopkg.in/yaml.v3下,再次运行,成功了,跟直接使用go运行它没区别。
$ yaegi run demo.go
--- t:
{Easy {2 [3 4]}}...
同时也尝试了将go可执行文件重命名,unset掉GOROOT,也能正常地运行这个demo.go文件,说明真的可以完全无go工具链执行.go文件了。
0x03 初步的分析结论
yaegi的能力非常强大,可以满足基本的脚本化要求。而且可以引入第3方库,当然前提是这些三方库没有过于复杂的依赖关系。有了这样基本的能力,其他的规范化的日志、文件事务这些都不是问题。
当然考虑实际工程化的需求,yaegi还有一些可优化和不确定的地方:
- 支持将那些三方库预编译到yaegi中。yaegi本身就具备的能力,稍微扩展下就行了。
- 能支持指定多个源码文件,执行其中的main函数。这个不支持问题也不大,强制使用方把其他依赖的放到GOPATH下就行了。
- 不确定复杂一些的脚本在运行的时候解析过程是否耗时较长。
yaegi本身的稳定性应该不错,大概看了下,基本上利用Go本身的ast解析能力,主要部分是实现了一个interpeter,具体的分析还结合实现和项目的issue进行分析。
相关文章:
【Go研究】Go语言脚本化的可行性——yaegi项目体验
0x01 背景——云计算中脚本化困境 作为云基础设施管理中,大量需要跟文件系统、容器等相关的操作,这些操作实现通常用脚本来实现。 现在探讨下,这些脚本为什么一定要用脚本语言来实现,以及目前实现中的常见的问题。 常见的两个场…...
Genome Research | 俄亥俄州立于忠堂组-结合深度学习与蛋白质数据库系统探究反刍动物真核微生物...
结合深度学习与蛋白质数据库系统探究反刍动物真核微生物 Probing the eukaryotic microbes of ruminants with a deep-learning classifier and comprehensive protein databases 期刊:Genome Research DOI:https://doi.org/10.1101/gr.279825.124 第一作…...
centos7yum安装mysql5.7
1、安装mysql5.7 (1) 正常安装 [rootBrianZhu /]# wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm [rootBrianZhu /]# yum -y install mysql57-community-release-el7-10.noarch.rpm [rootBrianZhu /]# yum -y install mysql-community-se…...
JavaScript系列(8)-- Array高级操作
JavaScript Array高级操作 📚 在前七篇文章中,我们探讨了JavaScript的语言特性、ECMAScript标准、引擎工作原理、数值类型、字符串处理、Symbol类型和Object高级特性。今天,让我们深入了解JavaScript中的Array高级操作。数组是最常用的数据结…...
蓝牙架构介绍
架构1:hostcontroller双芯片标准架构 这个标准把蓝牙协议栈分成host和controller两部分,其中host跑在AP上,controller跑在蓝牙模块上,两者之间通过HCI协议进行通信,AP芯片厂商一般会直接采用开源的Bluez来实现Host功能…...
青少年编程与数学 02-006 前端开发框架VUE 08课题、列表渲染
青少年编程与数学 02-006 前端开发框架VUE 08课题、列表渲染 一、列表渲染v-for 指令:key 属性遍历对象响应式更新列表渲染的作用 二、应用示例项目结构public/index.htmlsrc/components/TodoApp.vuesrc/main.jspackage.json构建和运行项目 课题摘要:本文介绍了Vue.js中的列表渲…...
12.3【hardware][day3]
关于使用硬件 DSP 资源实现乘法的含义 在 Xilinx 7 Series FPGA(现场可编程门阵列)中,乘法运算可以通过专门的数字信号处理(DSP)硬件资源来完成。当使用 Verilog 语言编写代码进行乘法运算时,直接使用乘号&…...
降维算法之PCA(PrincipalComponent Analysis,主成分分析)
降维是指在保留数据特征的前提下,以少量的变量表示有许多变量的数据,这有助于降低多变量数据分析的复杂度。比如在分析有 100 个变量的数据时,与其直接分析数据,不如使用 5 个变量表示数据,这样可以使后续分析比较容易…...
【JVM】总结篇-类的加载篇之 类的加载器 和ClassLoader分析
文章目录 类的加载器ClassLoader自定义类加载器双亲委派机制概念源码分析优势劣势如何打破Tomcat 沙箱安全机制JDK9 双亲委派机制变化 类的加载器 获得当前类的ClassLoader clazz.getClassLoader() 获得当前线程上下文的ClassLoader Thread.currentThread().getContextClassLoa…...
Android:文件管理:打开文件意图
三步走: 一、先在AndroidManifest.xml声明provider: <providerandroid:name"androidx.core.content.FileProvider"android:authorities"${applicationId}.FileProvider"android:exported"false"android:grantUriPermi…...
《计算机网络A》单选题(详解)
《计算机网络A》单选题-复习题库 1、计算机网络最突出的优点是( D ) A、存储容量大 B、将计算机技术与通信技术相结合 C、集中计算 D、资源共享 解析:算机网络最突出的优点是 D、资源共享。通过计算机网络&…...
【SpringBoot3】Spring Boot 3.0 集成 Mybatis Plus
在Spring Boot 3.0中,你可以使用MyBatis Plus来简化数据库操作。以下是一个基本的集成示例: 1.添加依赖到你的pom.xml: <dependencies> <!-- Spring Boot Starter --> <dependency> <groupId>org.springframework.…...
第147场双周赛:子字符串匹配模式、设计任务管理器、最长相邻绝对差递减子序列、删除所有值为某个元素后的最大子数组和
Q1、子字符串匹配模式 1、题目描述 给你一个字符串 s 和一个模式字符串 p ,其中 p 恰好 包含 一个 * 符号。 p 中的 * 符号可以被替换为零个或多个字符组成的任意字符序列。 如果 p 可以变成 s 的子字符串,那么返回 true ,否则返回 false…...
数据结构C语言描述9(图文结合)--二叉树和特殊书的概念,二叉树“最傻瓜式创建”与前中后序的“递归”与“非递归遍历”
前言 这个专栏将会用纯C实现常用的数据结构和简单的算法;有C基础即可跟着学习,代码均可运行;准备考研的也可跟着写,个人感觉,如果时间充裕,手写一遍比看书、刷题管用很多,这也是本人采用纯C语言…...
开源存储详解-分布式存储与ceph
ceph体系结构 rados:reliable, autonomous, distributed object storage, rados rados采用c开发 对象存储 ceph严格意义讲只提供对象存储能力,ceph的块存储能力实际是基于对象存储库librados的rbd 对象存储特点 对象存储采用put/get/delete…...
Vue 快速入门:开启前端新征程
在当今的 Web 开发领域,Vue.js 作为一款极具人气的 JavaScript 前端框架,正被广泛应用于各类项目之中。它以简洁的语法、高效的数据绑定机制以及强大的组件化开发模式,为开发者们带来了前所未有的开发体验。如果你渴望踏入前端开发的精彩世界…...
GPT系统重大升级,开创国内先河:o1支持图片识别功能正式上线
文章目录 零、前言一、授权码登录体验优化:一步直达聊天界面二、全新“项目”功能:让工作更有条理三、语音功能升级:全新交互体验四、o1支持图片识别五、总结 零、前言 我是虚竹哥,目标是带十万人玩转ChatGPT。 亲爱的用户&…...
常用的数据结构API概览
List ArrayList 1、在初始化一个ArrayList的时候,如果我想同时set一些值 比如存放int[ ] List<int[]> list new ArrayList(Arrays.asList(new int[]{intervals[0][0],intervals[0][1]}));//或者int[] temp new int[]{intervals[0][0],intervals[0][1]}…...
《探秘计算机视觉与深度学习:开启智能视觉新时代》
《探秘计算机视觉与深度学习:开启智能视觉新时代》 一、追溯起源:从萌芽到崭露头角二、核心技术:解锁智能视觉的密码(一)卷积神经网络(CNN):图像识别的利器(二࿰…...
Linux:操作系统不朽的传说
操作系统是计算机的灵魂,它掌控着计算机的硬件和软件资源,为用户和应用程序提供了一个稳定、高效、安全的运行环境。 在众多操作系统中,Linux 的地位举足轻重。它被广泛应用于服务器、云计算、物联网、嵌入式设备等领域。Linux 的成功离不开…...
Excel重新踩坑5:二级下拉列表制作;★数据透视表;
0、在excel中函数公式不仅可以写在单元格里面,还可以写在公式里面。 1、二级下拉列表制作: 2、数据透视表: 概念:通过拖拉就能实现复杂函数才能实现的数据统计问题。 概览:在插入选项中有个数据透视表,数…...
containerd配置镜像加速(含新旧版本)
文章目录 镜像加速使用文档containerd配置说明文档host.toml配置步骤(containerd2.x新版功能,与config.toml解耦,无需重启containerd)传统配置(需要重启containerd) 镜像加速使用文档 关于镜像加速的使用可…...
国产编辑器EverEdit - 常用资源汇总
1 国产编辑器EverEdit-常用资源汇总 EverEdit是一款国产文本编辑器,历经超过15年的更新和维护,拥有不输业界顶级商业文本编辑器(EmEditor、UltraEdit)的实力,甚至在某些方面的功能更强(当然,各有千秋),开发者对文本编辑…...
应急指挥系统总体架构方案
引言 应急指挥系统总体架构方案旨在构建一个高效、智能的应急管理体系,以应对自然灾害、事故灾难等突发事件,保障人民生命财产安全。 背景与挑战 近年来,安全生产形势严峻,自然灾害事故频发,对应急指挥系统的要求越…...
Edge Scdn的应用场景有哪些?
酷盾安全Edge Scdn 具备强大的安全防护能力,通过多层防御机制,如防火墙、DDoS 攻击防护、入侵检测和防御、数据加密等,有效抵御各种网络攻击,包括 DDoS 攻击、CC 攻击、SQL 注入攻击、XSS 跨站脚本攻击等,保障网站和应…...
LeetCode:98.验证二叉搜索树
跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:98.验证二叉搜索树 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 …...
mysql报错2059
客户端连接mysql服务时提示2059错误,通常与身份验证插件有关,具体表现为客户端无法加载指定的身份验证插件。这个错误在MySQL 8.0及更高版本中较为常见,因为从MySQL 8.0开始,默认的加密规则从mysql_native_password变为了caching_…...
2025/1/4期末复习 密码学 按老师指点大纲复习
我们都要坚信,道路越是曲折,前途越是光明。 --------------------------------------------------------------------------------------------------------------------------------- 现代密码学 第五版 杨波 第一章 引言 1.1三大主动攻击 1.中断…...
【数据仓库金典面试题】—— 包含详细解答
大家好,我是摇光~,用大白话讲解所有你难懂的知识点 该篇面试题主要针对面试涉及到数据仓库的数据岗位。 以下都是经典的关于数据仓库的问题,希望对大家面试有用~ 1、什么是数据仓库?它与传统数据库有何区别? 数据仓库…...
deepFM模型pytorch实现
deepFM deepfm包含两个部分:因子分解机FM和神经网络DNN,分别负责低阶特征和高阶特征的提取。可以处理全是分类特征的数据,或者分类与数值型结合的数据。 FM部分是对一阶特征和二阶特征(一阶特征之间的交互)的处理。 …...
【Linux】传输层协议UDP
目录 再谈端口号 端口号范围划分 UDP协议 UDP协议端格式 UDP的特点 UDP的缓冲区 UDP注意事项 进一步深刻理解 再谈端口号 在上图中,有两个客户端A和B,客户端A打开了两个浏览器,这两个客户端都访问同一个服务器,都访问服务…...
MOE怎样划分不同专家:K-Means聚类算法来实现将神经元特征聚类划分
MOE怎样划分不同专家:K-Means聚类算法来实现将神经元特征聚类划分 目录 MOE怎样划分不同专家:K-Means聚类算法来实现将神经元特征聚类划分MOE划分不同专家的方法K-Means聚类算法来实现将神经元特征聚类划分成不同专家(行或者列聚类)举例说明怎么聚类,最后神经网络怎么保存M…...
Redis两种主要的持久化方式是什么?
Redis支持两种主要的持久化方式,它们分别是RDB(Redis Database Snapshotting)和AOF(Append Only File)。以下是这两种持久化方式的详细介绍: 一、RDB(Redis Database Snapshotting) …...
【生活】冬天如何选口罩(医用口罩,N95, KN95还是KP95?带不带呼吸阀门?带不带活性炭?)
💡总结一下就是: 日常防护的话,医用口罩就可以啦。要是想长时间佩戴N95(KN95)口罩的话也可以. 在高风险环境(像医院、疫情防控期间),一定要选不带呼吸阀门的N95口罩KN95)…...
机器学习基础-卷积的计算
1 掌握卷积计算的基本过程 1.1 单通道单卷积核 如图3所示,现在有一张形状为[5,5,1]的灰度图,我们需要用图3右边的卷积核对其进行卷积处理,同时再考虑到偏置的作用。计算过程如下: 1.2 单通道多卷积核 如下图所示,左…...
使用LINUX的dd命令制作自己的img镜像
为了避免重复安装同一镜像,配置环境,首先我准备一个正常使用的完整系统。 使用Gparted软件先将母盘(如U盘,TF卡)分区调整为只有数据的大小。如:60G的TF卡,只用了3.5G,将未使用的空间…...
pdf预览兼容问题- chrome浏览器105及一下预览不了
使用的"tato30/vue-pdf": "^1.11.2"预览插件,发现chrome浏览器105及一下预览不了 pdfPreview预览组件: <template><div id"vue_pdf_view"><div class"tool_tip"><template v-if"pa…...
SpringBoot中实现拦截器和过滤器
【SpringBoot中实现过滤器和拦截器】 1.过滤器和拦截器简述 过滤器Filter和拦截器Interceptor,在功能方面很类似,但在具体实现方面差距还是比较大的。 2.过滤器的配置 2.1 自定义过滤器,实现Filter接口(SpringBoot 3.0 开始,jak…...
基于深度学习的视觉检测小项目(六) 项目的信号和变量的规划
• 关于前后端分离 当前流行的一种常见的前后端分离模式是vueflask,vueflask模式的前端和后端之间进行数据的传递通常是借助 API(应用程序编程接口)来完成的。vue通过调用后端提供的 API 来获取或提交数据。例如,前端可能通过发送…...
GitHub的简单操作
引言 今天开始就要开始做项目了,上午是要把git搭好。搭的过程中遇到好多好多的问题。下面就说一下git的简单操作流程。我们是使用的GitHub,下面也就以这个为例了 一、GitHub账号的登录注册 https://github.com/ 通过这个网址可以来到GitHub首页 点击中间绿色的S…...
LLM大语言模型自动化测试(ROUGE和RAGAS)及优化方案
1. 模型自动化测试 模型的测试中,不同类型的任务评测指标有显著差异,比如: 分类任务: 准确率(Accuracy):正确预测的比例。 精确度(Precision)、召回率(Recal…...
你已经分清JAVA中JVM、JDK与JRE的作用和关系了吗?
你已经分清JAVA中JVM、JDK与JRE的作用和关系了吗? 一. JVM、JDK与JRE的关系二. JVM、JDK与JRE的作用2.1 什么是JVM?2.2 什么是JDK?2.3 什么是JRE? 前言 点个免费的赞和关注,有错误的地方请指出,看个人主页有…...
实际开发中,常见pdf|word|excel等文件的预览和下载
实际开发中,常见pdf|word|excel等文件的预览和下载 背景相关类型数据之间的转换1、File转Blob2、File转ArrayBuffer3、Blob转ArrayBuffer4、Blob转File5、ArrayBuffer转Blob6、ArrayBuffer转File 根据Blob/File类型生成可预览的Base64地址基于Blob类型的各种文件的下载各种类型…...
Elasticsearch:Lucene 2024 年回顾
作者:来自 Elastic Chris Hegarty 2024 年对于 Apache Lucene 来说又是重要的一年。在本篇博文中,我们将探讨主要亮点。 Apache Lucene 在 2024 年表现出色,发布了许多版本,包括三年来的首次重大更新,其中包含令人兴奋…...
springboot实战纪实-课程介绍
教程介绍 Spring Boot是由Pivotal团队提供的一套开源框架,可以简化spring应用的创建及部署。它提供了丰富的Spring模块化支持,可以帮助开发者更轻松快捷地构建出企业级应用。 Spring Boot通过自动配置功能,降低了复杂性,同时支持…...
什么是TDD测试驱动开发(Test Driven Development)?
什么是测试驱动开发? 软件开发团队通常会编写自动化测试套件来防止回归。这些测试通常是在编写应用程序功能代码之后编写的。我们将采用另一种方法:在实现应用程序代码之前编写测试。这称为测试驱动开发 (TDD)。 为什么要应用 TDD?通过在实…...
学习随记:word2vec的distance程序源码注释、输入输出文件格式说明
word2vec中有5个程序,其中demo-word.sh中涉及两个:word2vec、distance。考虑到distance比较简单,所以我从这个入手,希望通过简单代码理解如何在一个高维数据空间计算距离(查找)。一维数据的查找,…...
CSS 之 position 定位属性详解
CSS系列文章目录 CSS 之 display 布局属性详解 CSS 之 position 定位属性详解一文搞懂flex布局 【弹性盒布局】 文章目录 CSS系列文章目录一、前言二、静态定位:position:static;二、相对定位:position:relative三、绝对定位:pos…...
初学STM32 --- USMART
目录 USMART简介 USMART主要特点: USMART原理 USMART组成: USMART 的实现流程简单概括 USMART扫描函数: USMART系统命令 USMART移植 USMART简介 USMART是一个串口调试组件,可以大大提高代码调试效率! USMART主…...
MySQL叶子节点为啥使用双向链表?不使用单向呢?
文章内容收录到个人网站,方便阅读:http://hardyfish.top/ 文章内容收录到个人网站,方便阅读:http://hardyfish.top/ 文章内容收录到个人网站,方便阅读:http://hardyfish.top/ MySQL 中的 B 树索引&#x…...