自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(70)
  • 收藏
  • 关注

原创 Azure VM支持eBPF XDP Native模式

需要将网卡的lro功能关闭,按照文档操作后就可以解决问题了。

2023-12-08 13:27:59 100

原创 Rust的eBFP框架Aya(一) - Linux内核网络基础

在我的Rust入门及实战系列文章中已经说明, Rust是一门内存安全的高性能编程语言,从它的这些优秀特性来看,就是一门专为系统开发而诞生的语言。至于很多使用Rust来进行web开发的行为,不能说它们不好,只能说是杀鸡焉用牛刀耳。本系列的文章旨在为大家介绍一个新的专用于开发eBPF程序的Rust框架:Aya。Aya 是 Rust 中的一个 eBPF(Extended Berkeley Packet Filter)库,提供了用 Rust 语言编写、加载和运行 eBPF 程序的能力。

2023-12-08 13:04:25 793

原创 Rust语言项目实战(九 - 完结) - 胜利与失败

在前面的章节中,我们已经实现了这个游戏中大部分的模块和功能,我们可以指挥我们的战机左右移动,并发射子弹;我们还创造了一堆的侵略者,从屏幕上方缓缓降落,试图到达屏幕的底部。本章中,我们将对游戏的输赢作出最后的裁决,到底是我们的保卫者英勇无敌,还是侵略者更胜一筹呢,作为这个程序的创造者,让我们来为输赢制定规则吧。

2023-12-04 12:55:11 531

原创 Rust语言项目实战(八) - 入侵者模块

我们已经说明,入侵者应当是一组敌人,所以我们应当先定义单个入侵者,然后定义入侵者们。下面的代码中, 单个入侵者具有坐标信息, 而入侵者军团包含军团(一组入侵者), 移动计时器,移动方向的信息;x: usize,y: usize,move_timer: Timer, // 计时器到时就移动direction: i32 // 移动方向, 正数为右, 负数为左所有入侵者的行动都是一致的,因此我们只需要对入侵者们统一定义一些行为, 也就是为Invadersx的坐标区间为(1, 列数-2)

2023-12-01 09:29:34 88

原创 Rust语言项目实战(七) - 子弹模块

x: usize,y: usize,Self {同时,还要定义玩家发射子弹的函数, 我们可以规定玩家可以同时拥有的存活的子弹数量上限,例如2, 如果达到了上限就不能继续发射子弹,并用一个bool类型返回发射结果,发射成功就返回true, 失败就返回falsetrue} else {false另外我们还需要对玩家的所有子弹进行状态更新,只保留那些还存活的子弹, 下面例子中的retain。

2023-12-01 09:29:20 61

原创 Rust语言项目实战(六) - 玩家模块

玩家的行为才是游戏的灵魂,还是与之前一样,我们将玩家的行为逻辑以及相关的函数,结构体都放在单独的模块中,以使项目的结构更加清晰。

2023-12-01 09:29:08 39

原创 Rust语言项目实战(五) - 动态渲染

Escq。

2023-12-01 09:28:56 43

原创 Rust语言项目实战(四) - 界面绘制与渲染

Escq目前游戏的界面还是一片空白,本章我们开始为游戏在终端上绘制并渲染界面,这真是一个激动人心的工作。

2023-12-01 09:28:45 414

原创 Rust语言项目实战(三) - 创建主循环

众所周知,游戏在不手动退出的情况下应该一直运行下去,因此所有的游戏机会都应该有一个主循环来保证游戏不会自动退出。

2023-12-01 09:28:30 27

原创 Rust语言项目实战(二) - 准备键盘和终端屏幕

上一章节中,我们实现了游戏开始音频的播放,本章我们开始编写游戏界面。我们的游戏是在命令行终端中运行的,因此编写的界面也是终端中展示的界面,上一章中,我们已经把相关的依赖包crossterm添加到了依赖列表中。本章首先为游戏准备所需的键盘和屏幕配置。

2023-12-01 08:46:11 66

原创 Rust语言项目实战(一) - 项目介绍及开始

在实战篇中,我们将制作一个终端小游戏,在终端中运行一款类似于太空大战的游戏,玩家控制一个小飞机,发射子弹打败敌人。

2023-12-01 08:45:51 275

原创 Rust语言入门教程(十四) - 闭包Closure

闭包在 Rust 中是非常强大的功能,允许你编写更灵活和表达性的代码。闭包的语法和功能在某些方面类似于其他语言(如 JavaScript 或 Python)中的匿名函数或 lambda 表达式。在Rust中,当我们想要生成一个新的线程,或者是想在迭代中进行一些函数式编程对迭代变量进行处理时,通常就会用到闭包, 当然,在标准库中一些其他的常见的地方,也会涉及到闭包的使用。闭包本质上是一个匿名函数,它可以从其所在的作用域中借用或捕获到一些变量或数据。

2023-11-30 08:47:41 161

原创 Rust语言入门教程(十五) -线程(Thread)

Rust的线程具有很好的可移植性,在Mac, Window, Linux以及其他许许多多不能一一列举的平台上,Rust的线程都可以完美运行。

2023-11-30 08:47:19 85

原创 Rust语言入门教程(十三) - 重要的枚举类型Option与Result

首先,还是再列出Option的定义, 它用于任何可能为空的变量。注意在中我们指定了x如果不为空时的关联数据变量类型,且使用None时, 也没有使用或者, 这是因为Option类型实在是太常用了,所以Rust默认已经把他们都引入了,不需要再手动导入。判断一个Option类的变量是Some还是None此外, Option还实现了的Trait, 这使得它可以被视为一个长度为0或1的向量,从而可以用for。

2023-11-29 08:30:00 298

原创 Rust语言入门教程(十二) - 枚举类型Enums与模式匹配

在Rust中, 枚举(Enums)类型更接近Haskell中的代数数据类型,而不是类似于C语言中的枚举类型。enum{ }如果只看上面的例子,其实有点类似于C语言中的枚举类型。当我们想要使用Color这个枚举类型中的特定变体时,可以用。

2023-11-29 00:45:00 341

原创 Rust语言入门教程(十一) - 集合类型Collections

在 Rust 中,collections 是一组用于存储多个值的标准库数据结构。不同于数组和元组,collections 可以存储可变数量的数据。Rust 的标准库提供了几种常用的集合类型,每种类型都有其特定的用途和性能特点。

2023-11-28 09:00:12 255

原创 Rust语言入门教程(十) - Trait与泛型

println!"}// 输出 “BYTE!如上,我们为内置类型u8实现我们自定义的Trait, 在前面的章节中我们已经提到了, 在Rust中,Byte和u8是等价的, 因此对u8类型实现get_noise这个方法,我们让他直接打印出“BYTE!在main函数中,我们调用, 由于参数类型是u8, 因此会调用到Noisy对u8类型的实现,直接打印出"BYTE!// 无默认行为的函数// 定义函数的默认行为println!// 定义函数的默认行为println!

2023-11-28 08:59:58 638

原创 Rust语言入门教程(九) - 结构体

在其他很多编程语言中,有类(Class)的存在,在Rust中,我们没有类(Class)的概念,我们使用结构体(Struct)。以struct关键词开头,后面紧跟结构体的名称(以大写字母开头的驼峰式命名),大括号中是结构体的数据字段,每个字段由字段名称及它的类型声明组成, 字段间用分隔。最后一个字段后面也可以加上, 并且我们推荐大家这样做,以防在以后添加新字段时忘记在前面的字段后添加。

2023-11-27 11:05:54 583

原创 Rust语言入门教程(八) - 引用与借用

上一章的内容中我们讨论了Rust的所有权系统,当我们不想移动值的所有权时,我们可以使用引用和借用,而这正是本章想要讨论的问题。

2023-11-27 07:00:00 796

原创 Rust语言入门教程(七) - 所有权系统

所有权系统是Rust敢于声称自己为一门内存安全语言的底气来源,也是让Rust成为一门与众不同的语言的所在之处。也正是因为这个特别的所有权系统,才使得编译器能够提前暴露代码中的错误,并给出我们必要且精准的错误提示。

2023-11-26 16:11:43 401

原创 Rust语言入门教程(六) - 字符串类型

Rust的标准库的集合类型提供的索引操作始终保证是时间恒定的操作, 但是对于字符串的索引却不能做到,因为当我们对字符串进行索引操作时,得到的是字节,而这个结果大概率并不是我们想要得到的结果(如上所述,一个有意义的语言文字字符可能是一个或多个字节组成的)。, UTF-8的编码规则下, 一个Unicode字符可能占用1 - 4个字节的长度不定,因此必须要遍历每个字节,才知道每个符号从哪里开始,在哪里结束。在Rust的标准库中,至少都提供了6种字符串类型,我们平常使用的最多的是其中的两种。从数据结构的角度来看,

2023-11-26 15:20:19 482

原创 Rust语言入门教程(五) - 流控制语句

在Rust中, if语句的判断条件不需要用( )括起来, 它会认为所有在if和判断条件的表达式必须返回一个bool如果要进行多分支的条件判断,可以使用else if(注意else和if是分开的),最后也可以用else注意,if是一种表达式, 而不是语句。注意,在上面的例子中,每个判断分支的结尾没有;, 因为这是一个尾部表达式, 用于给if表达式返回一个值;我们也不能使用return关键字, 而只能使用尾部表达式,因为return只能用于函数定义的代码块中,给函数返回结果;

2023-11-24 17:17:30 527

原创 Rust语言入门教程(四) - 数据类型

变量的值可能是一个英文字母,也可能是一个其他语言中的字母,也可能是一个汉字, 甚至可以是一个表情符号,还可能是一些不可打印的控制符号,只要它是在。, 根据参数的类型不同,函数的行为会发生变化, 此时如果我需要传入的参数值为5, 那么我就需要为这个5指定类型,那么便可以写为。我们的代码编辑器显示的源代码也是UTF-8格式的,因此,我们在代码中看到的一个字符,其实并不等同于Rust中的一个。需要注意的是,虽然Rust有这些整型,但根据你的系统位数不同,有的整型类型可能不被支持,比如在一个。

2023-11-24 12:48:50 687

原创 Rust语言入门教程(三) - 函数与模块系统

Rust并不要求函数定义的位置必须在调用它之前,所以如果你习惯于把main函数放在最前面的话,是完全没有问题的。函数的参数格式为参数名: 参数类型, 多个参数之间用分隔,在参数列表后, 用->

2023-11-23 18:03:02 867

原创 Rust语言入门教程(二) - 变量与作用域

语句以分号结尾,用花括号包含语句块。Rust的语法其实借鉴了很多其他的语言,比如C语言和Python, 所以变量定义的格式看起来也跟很多我们熟悉的其他语言相似。Rust中,使用let关键字声明一个变量。在上面的例子中, 我们声明了一个变量bunnies, 并且初始化了它的值为2Rust是一种强类型的语言,那么在上面的语句中,哪里标注了这个变量的类型呢?在Rust编程中,如果Rust能准确的识别这个变量的类型,那么我们不需要显式的标注变量的类型,也不需要像C#那样标注一个auto表示它的类型是自动识别的。

2023-11-23 16:51:12 884

原创 Rust语言入门教程(一) - 简介及Cargo使用

内存安全: 在编译阶段就保证了内存的安全;无畏并发: 由于更优秀的安全性,所以在进行并发编程时更加无所畏惧,因为所有的不安全因素都会在编译时被发现;快速:由于零成本的抽象和其他优秀特性,Rust具有惊人的运行速度和性能;相比之下, 一些高级语言如Ruby和Python虽然可以保证内存安全, 但是却很难做到高并发和高性能。一些系统编程语言如C语言和C++, 虽然可以获得高性能,以及一定程度上的高并发,但是却总是被内存安全问题所困扰。

2023-11-23 14:24:39 1284

原创 【kubernetes】Argo Rollouts -- k8s下的自动化蓝绿部署

在现代软件开发和交付中,确保应用程序的平稳更新和发布对于用户体验和业务连续性至关重要。蓝绿部署是一种备受推崇的部署策略,它允许开发团队在不影响用户的情况下,将新版本的应用程序引入生产环境。蓝绿部署的核心思想在于维护两个独立的环境:蓝环境和绿环境。蓝环境是当前正在运行的稳定版本,而绿环境是即将发布的新版本。在进行部署时,首先将新版本部署到绿环境中,并在绿环境中进行严格的测试和验证。一旦新版本通过了各项测试,并被确认为稳定和可靠,就可以将流量从蓝环境切换到绿环境,使用户开始访问新版本。

2023-09-01 17:08:12 1511

原创 【DevOps】GitOps最佳实践(五) - 多目录模式管理多环境

多分支模式在管理复杂环境时会遇到很多棘手的问题,而多目录模式则基本解决了这些问题。本文列举了一个复杂环境的目录结构设计示例以供参考,再次墙裂建议大家在GitOps的实践中采用多目录模式来管理多个环境。

2023-04-20 17:18:03 453

原创 【DevOps】GitOps最佳实践(四) - 弃用分支区分环境

上面说的这些问题,在环境越来越多的情况下,处理的难度会指数级的上升,因此,在GitOps的实践中,一定不要选用分支的方式来管理多个环境。下一篇文章中,我们会推荐一种在GitOps中进行多环境管理的方式。

2023-04-15 22:32:45 541

原创 【DevOps】GitOps最佳实践(三) - 未竟之事

虽然GitOps有这么多令人头疼的问题,但是仍然不失为一种优秀的持续交付方案,并且越来越收到欢迎,上面说到的这些问题,相信在将来也会被不断地完善。

2023-04-14 22:54:44 504

原创 【DevOps】GitOps最佳实践(二) - 困难与简例

上一篇文章中,我们介绍了GitOps能为我们带来许多的好处,然而,任何新的探索都将不会是一帆风顺的。在开始之前,如果能了解实践GitOps通常会遇到的挑战,并对此作出合适的应对,可能会使我们使用GitOps的旅程更加的顺利。

2023-04-07 23:02:02 372

原创 【DevOps】GitOps最佳实践(一) - 为DevOps助力

GitOps是一套贯穿整个应用开发和部署周期的DevOps最佳实践。它将Git作为主要的基础设施,应用和配置的存储和同步机制。这种模式将开发人员从基础设施管理任务中解放出来,让他们能够专注于应用程序的开发和交付。GitOps的工作流程非常简单,所有的更改都在Git存储库中进行,包括应用程序代码、基础设施配置和应用程序配置等。当新的更改被推送到存储库时,GitOps控制器会检测到更改并将其自动部署到目标环境中。这种自动化过程可以消除部署过程中的人为错误,从而提高生产力和可靠性。

2023-04-07 10:43:47 564 1

原创 【kubernetes-工具篇】K9S详解-宝藏k8s界面工具

K9s是一个命令行界面(CLI)工具,用于管理Kubernetes集群。它是一个流行的开源工具,可以帮助Kubernetes管理员和开发人员轻松管理他们的Kubernetes集群。在本文中,我们将简单介绍K9s的概念、功能和如何使用它。

2023-04-06 14:31:53 3413

原创 【dapr】服务调用(Service Invokation) - app id的解析

dapr的服务调用中 app id解析方式

2023-02-09 11:36:28 688

原创 【kubernetes-工具篇】ksniff - 微服务网络抓包

本文介绍了一个k8s插件ksniff, 用于在远程k8s集群的pod及容器上抓包,并将结果重定向到本地的wireshark进行查看。

2023-02-07 11:45:52 385

原创 【kubernetes】从僵尸进程探讨容器的多进程管理

在kubernetes的架构设计中,同一个pod内有多个服务的情况下,每个服务作为一个容器是最佳实践,各容器通过pause容器共享网络命令空间。如果违背这一原则,在一个容器内运行了多个进程,则可能引发一些意料之外的问题。僵尸进行无法回收示例情景如下:一个pod内只有一个容器 容器内运行两个进程(一个后台,一个前台)该pod容器镜像的entrypoint脚本如下:#!/bin/bash/usr/sbin/sshd &exec "$@"传入的command参数为:..

2022-03-31 16:07:28 1557

原创 【kubernetes-网络】Multus CNI为pod添加网卡

背景在特定的业务场景下,某些pod需要添加指定类型的网卡,以满足业务需求. 如下图所示:pod内运行的服务是gobgpd, 监听179端口,且需要与物理环境的路由器建立bgp链接,于是有以下要求:由于服务本身监听端口,为了兼容两个pod调度在同一node上的情况,不能使用hostnetwork(否则会出现端口冲突), 需要使用容器网络; 由于需要与物理环境的路由器建立bgp链接, 需要一个能与外部物理网络联通的网卡, 且IP需要固定,以便路由器上的配置能固定不变;方案方案逻辑图如上.

2022-03-30 10:03:06 1206

原创 【kubernetes】Deployment中的pod如何进行域名解析

背景假设一个名为ws的无状态服务,在业务代码中,服务需要根据hostname解析本机ip,并绑定端口启动监听进程, 例如:import socketdef get_hostname(): with open("/etc/hostname") as f: return f.read().strip()ip = socket.gethostbyname(get_hostname())server = socket.socket(socket.AF_INET, soc

2021-04-25 21:37:45 3303

原创 【kubernetes】k8s利用coredns解析集群外部域名

kube-dns简介众所周知,在一个kubernetes集群中,各服务之间可以通过各自的FQDN互相访问,而集群中的kube-dns服务为此提供了域名解析的功能, 使用如下的命令可以看到root@cxy:~# kget svc -n kube-systemNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkube-dns ClusterIP 10....

2021-04-08 22:23:33 6089

原创 【kubernetes】Ubuntu16.04.5下kubernetes高可用集群搭建

基本参数系统版本: Ubuntu 16.04.5 执行用户: root 必须的软件包及版本ii kubeadm 1.20.4-00 amd64 Kubernetes Cluster Bootstrapping Toolii kubectl 1.20.4-00

2021-02-27 14:24:38 339

Rust语言项目实战 - 完整源码

https://blog.csdn.net/m0_37904728/article/details/134669376?spm=1001.2014.3001.5501 Rust语言项目实战系列文章完整源码

2023-12-04

Rust语言项目实战 - Invaders完整源码

https://blog.csdn.net/m0_37904728/article/details/134669376?spm=1001.2014.3001.5501 Rust语言项目实战系列文章完整源码

2023-12-04

invadors基础音频文件

Rust实战项目的基础音频文件包

2023-11-28

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除