Go 代码城市上云——KusionStack 实践

简介: 今天我们和大家分享一个好玩的 Go 代码城市应用,以及 KusionStack 是如何一键将其部署到 K8s 云原生环境的。

导语

KusionStack 是面向 Kubernetes 云原生场景的 IaC 配置代码化实践的开源一站式可编程协议栈。其基本思想是让「应用方+平台方」的同学能够共同基于 IaC 构建的 Konfig 模型库同一平面进行 DevOps 协同工作。今天我们和大家分享一个好玩的 Go 代码城市应用,以及 KusionStack 是如何一键将其部署到 K8s 云原生环境的。

KusionStack 项目主仓库:

https://github.com/KusionStack/kusion

PART. 1

什么是代码城市(CodeCity)

CodeCity 代码城市是瑞典工程师 Richard Wettel 开发的创意应用,可以通过类似数字城市的视觉形式展示和度量代码的复杂性。其效果如图:

在 3D 形式展示的代码城市中的中心地标非常直观——最大、最高的建筑总是容易追踪的焦点。因为这个极具特色的创意,CodeCity 获得了 2008 年的"Riconoscimento ated-ICT Ticino" 一等奖,同时也可以免费用于非商业的科研和学习用途。

今天要展示的 GoCity 是 Go 语言版本的代码城市,我们可以通过这种方式评估 KusionStack 等 Go 语言项目的代码复杂度。也可以通过在线的 GoCity 查看 KusionStack/kusion 仓库的展示效果。

PART. 2

本地执行 GO 代码城市

之前的 GoCity 还是在 2021 年 10 月更新的,在最新的 Docker 和 Go1.18 环境有一些小问题,还好 KusionStack 相关同学为其提交了补丁进行了修复(_这也是开源项目的魅力所在,也希望开源社区小伙伴能够参与 KusionStack 的共建_),现在可以执行以下命令安装:go install github.com/rodrigo-brito/gocity@latest。然后通过 gocity open 打开 Github 或本地仓库。

- 比如打开本地的 KusionStack/kusion 仓库

- 然后浏览器打开对应页面

本地执行一切正常!

PART. 3

Go 代码城市一键上云

作为一个类似数字城市的应用,在云原生、元宇宙等背景下,部署上云也是一个自然的需求。同时我们也希望通过 GoCity 展示下 KusionStack 的基本用法。在 GoCity 上云之前,我们先尝试如何本地执行该应用。

相应的容器镜像已经推送到 Docker Hubhttps://hub.docker.com/r/yuanhao1223/gocity,运行命令如下:

运行成功后,可打开本地地址http://localhost:4000/查看 Go 项目的数字城市 3D 效果。

容器化成功后,现在准备上云。从本地执行容器的方式可以看出,想要在 Kubernetes 部署,至少需要 Deployment 和 Service 两种资源。其中 Deployment 用来部署 Go 代码城市,Service 暴露端口,访问无状态应用。

首先安装好本地 Kusion 命令,然后通过 kusion init 的在线仓库提供了相应的模板。Kusion 命令支持一键初始化配置:

输出类似以下信息:

为了方便展示,Kusion 模板已经内置了 CodeCity 的例子。其中 code-city 模板依赖 konfig 大库中抽象化的前/后端模型,code-city 模板无依赖,可以自闭环。我们选择后者:

初始化过程中,指定了容器镜像,并且容器端口和 Service 端口均为 4000,现在进入配置目录,目录结构如下:

- 完整的代码可以参考 :

https://github.com/KusionStack/kusion-templates/tree/main/code-city-demo

为了方便本地测试,可以通过 minikube start 本地启动 MiniKube 服务。然后命令行模式切换到 code-city-kcl 目录,然后执行 kusion apply 命令生效配置。到此,开始正式上云:
kusion apply main.k

输出类似于:

检查 Deployment 的状态:

输出类似于:

使用 kubectl 端口转发:

访问本地地址https://localhost:4000/),点击 Example 处的链接 “KusionStack/kusion”,可以看到和本地执行一样的效果:

至此,完成了 Go 代码城市的一键上云。有兴趣的读者,可以基于模型库 Konfig,选择其他模板,探索 KusionStack 支持的其它运维场景,下面我们将探索代码城市内部的原理。

PART. 4

认识数字城市中的建筑含义

说实话代码城市第一眼看上去更像一个电路板,要理解其中的含义需要了解几个基本的参数映射关系,如预览页面的右下角图所示:

以上的对应关系在其官方文档中也说明,如下图所示:

其中地面的粉红色表示 Go 包对应的目录(_因为包的依赖关系可能再产生叠加_),灰色表示目录内部的文件,而蓝色表示结构体。其中表示文件的灰色建筑物的大小即文件的大小,表示结构体的蓝色建筑物的高度即方法的数量,建筑物的长宽表示结构体中属性的数量,蓝色颜色的深度表示相关代码行数。

我们可以选择 DiffOptions 结构体对应建筑物查看其相关的属性参数:

可以看到该结构体中有 15 个属性、3 个方法、共 156 行代码。通过点击其中的 “Github 链接” 按钮可以跳转到对应的位置:

因此通过这种方式我们可以很容易查看全局有无特别高大的建筑,从而判断是否存在某些文件和结构体的代码需要改进。可以说 GoCity 是一个很有趣的代码分析工具,甚至可以集成到 Github PR 代码评审流程中。

PART. 5

分析 GoCity 的代码架构

GoCity 代码架构主要分为代码数据提取和前端模型展示两块,如图所示:

首先 Codebase 表示要展示的代码,通过 Git Service 被拉取,然后通过 Parser 和 Position 服务提取得到对应的参数信息,然后通过前端展示。Go 语言代码主要集中在模型数据提取部分,而前端展示主要为 JS 等实现。前端展示资源文件通过 embed.FS 内嵌到程序中,GoCity 命令启动 Web 服务展示页面。代码架构比较清晰,也是一个比较理想可用于 Go 语言学习的开源项目。

PART. 6

展望

我们通过 KusionStack 的方式,配合少量的 KCL 配置代码,完成了 Go 代码城市一键上云的操作。虽然云上的 Go 代码城市和本地的版本看不出什么区别,但是云上程序的整个生命周期管理将大为不同。在后面的例子中我们将展示如何通过 KusionStack 结合 KCL 配置语言进行 IaC 方式的云原生应用的运维操作。感谢关注🙏

参考链接

https://github.com/KusionStack/kusion

https://github.com/KusionStack/examples

https://github.com/rodrigo-brito/gocity

https://wettel.github.io/codecity.html

了解更多...

KusionStack Star 一下✨:

https://github.com/KusionStack/Kusion

本周推荐阅读

KusionStack 在蚂蚁集团的探索实践 (上)

Kusion 模型库和工具链的探索实践

精彩回顾|KusionStack

历时两年,打破“隔行如隔山”困境

相关文章
|
2月前
|
Go 调度 开发者
Go语言中的并发编程:深入理解与实践###
探索Go语言在并发编程中的独特优势,揭秘其高效实现的底层机制。本文通过实例和分析,引导读者从基础到进阶,掌握Goroutines、Channels等核心概念,提升并发处理能力。 ###
|
27天前
|
安全 Serverless Go
Go语言中的并发编程:深入理解与实践####
本文旨在为读者提供一个关于Go语言并发编程的全面指南。我们将从并发的基本概念讲起,逐步深入到Go语言特有的goroutine和channel机制,探讨它们如何简化多线程编程的复杂性。通过实例演示和代码分析,本文将揭示Go语言在处理并发任务时的优势,以及如何在实际项目中高效利用这些特性来提升性能和响应速度。无论你是Go语言的初学者还是有一定经验的开发者,本文都将为你提供有价值的见解和实用的技巧。 ####
|
1月前
|
算法 安全 程序员
Go语言的并发编程:深入理解与实践####
本文旨在探讨Go语言在并发编程方面的独特优势及其实现机制,通过实例解析关键概念如goroutine和channel,帮助开发者更高效地利用Go进行高性能软件开发。不同于传统的摘要概述,本文将以一个简短的故事开头,引出并发编程的重要性,随后详细阐述Go语言如何简化复杂并发任务的处理,最后通过实际案例展示其强大功能。 --- ###
|
1月前
|
监控 Go API
Go语言在微服务架构中的应用实践
在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出,成为构建微服务的理想选择。本文将探讨Go语言在微服务架构中的应用实践,包括Go语言的特性如何适应微服务架构的需求,以及在实际开发中如何利用Go语言的特性来提高服务的性能和可维护性。我们将通过一个具体的案例分析,展示Go语言在微服务开发中的优势,并讨论在实际应用中可能遇到的挑战和解决方案。
|
1月前
|
安全 Go 开发者
代码之美:Go语言并发编程的优雅实现与案例分析
【10月更文挑战第28天】Go语言自2009年发布以来,凭借简洁的语法、高效的性能和原生的并发支持,赢得了众多开发者的青睐。本文通过两个案例,分别展示了如何使用goroutine和channel实现并发下载网页和构建并发Web服务器,深入探讨了Go语言并发编程的优雅实现。
38 2
|
2月前
|
Cloud Native Go API
Go语言在微服务架构中的创新应用与实践
本文深入探讨了Go语言在构建高效、可扩展的微服务架构中的应用。Go语言以其轻量级协程(goroutine)和强大的并发处理能力,成为微服务开发的首选语言之一。通过实际案例分析,本文展示了如何利用Go语言的特性优化微服务的设计与实现,提高系统的响应速度和稳定性。文章还讨论了Go语言在微服务生态中的角色,以及面临的挑战和未来发展趋势。
|
1月前
|
SQL 监控 算法
为Go应用无侵入地添加任意代码
这篇文章旨在提供技术深度和实践指南,帮助开发者理解并应用这项创新技术来提高Golang应用的监控与服务治理能力。在接下来的部分,我们将通过一些实际案例,进一步展示如何在不同场景中应用这项技术,提供更多实践启示。
|
2月前
|
SQL 关系型数据库 MySQL
Go语言项目高效对接SQL数据库:实践技巧与方法
在Go语言项目中,与SQL数据库进行对接是一项基础且重要的任务
91 11
|
2月前
|
Go 开发者
Go语言中的并发编程:从基础到实践
在当今的软件开发中,并发编程已经成为了一项不可或缺的技能。Go语言以其简洁的语法和强大的并发支持,成为了开发者们的首选。本文将带你深入了解Go语言中的并发编程,从基础概念到实际应用,帮助你掌握这一重要的编程技能。
|
1月前
|
NoSQL 测试技术 Go
自动化测试在 Go 开源库中的应用与实践
本文介绍了 Go 语言的自动化测试及其在 `go mongox` 库中的实践。Go 语言通过 `testing` 库和 `go test` 命令提供了简洁高效的测试框架,支持单元测试、集成测试和基准测试。`go mongox` 库通过单元测试和集成测试确保与 MongoDB 交互的正确性和稳定性,使用 Docker Compose 快速搭建测试环境。文章还探讨了表驱动测试、覆盖率检查和 Mock 工具的使用,强调了自动化测试在开源库中的重要性。