自定义博客皮肤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)
  • 资源 (1)
  • 问答 (1)
  • 收藏
  • 关注

原创 mangokit:golang web项目管理工具,使用proto定义http路由和错误

mangokit是一个web项目的管理工具,它的功能如下:1. 根据预设的项目结构创建出一个web项目,使用已有的代码框架,减少工作量2. 使用proto来定义http路由以及错误码,使用相关工具生成代码,完成自动结构体反序列化以及返回值响应3. 使用wire来管理依赖注入,减少依赖管理的烦恼

2023-12-20 18:58:45 1871

原创 Golang中gRPC使用及原理探究

gRPC是一种进程间通信技术,在微服务和云原生领域都有着广泛的应用。在使用之前需要使用proto文件来定义出message类型和service接口,比如下面的greeter";syntax表示proto语法版本,在此使用proto3版本第3行用于声明生成的go代码的package第9行和第13行定义了两个消息,都包含一个data的字段,类型为string第5行定义了一个名为Greeter的service,该service包含一个rpc方法为SayHello为请求类型,HelloReply。

2023-10-14 23:26:33 1466

原创 go字符串拼接方式及性能比拼

在golang中字符串的拼接方式有多种,本文将会介绍比较常用的几种方式,并且对各种方式进行压测,以此来得到在不同场景下更适合使用的方案。

2023-09-25 17:40:21 1317

原创 Golang源码探究——从Go程序的入口到GMP模型

在大多数的编程语言中,main函数都是用户程序的入口函数,go中也是如此。那么main.main是整个程序的入口吗, 肯定不是,因为go程序依赖于runtime,在程序的初始阶段需要初始化运行时,之后才会运行到用户的main函数,那么main.main是在哪里被调用的呢?接下来就从go程序的入口,再到go的GMP模型进行一个探究。

2023-06-29 13:13:43 636 2

原创 k8s调度器扩展(Scheduler Framework)、源码编译及部署

因为研究的需要,需要对K8S的调度器进行扩展,本文主要讲解了k8s调度器扩展的一个流程,其中包含源码修改、源码编译、调度器配置以及部署和本人所踩的一些坑,使用的k8s的版本为1.23.1

2023-04-13 20:10:27 1933 3

原创 k8s编程operator实战之云编码平台——⑤项目完成、部署

截至目前,云编码平台的基本功能已经实现了。使用该平台,我们可以根据空间模板来创建出一个云开发环境。对于每个用户来说,允许存在的工作空间最大数量为20个,允许同时启动的工作空间数量为1个。用户的代码数据以及安装的插件都是可以保存下来的。

2023-03-03 15:42:07 2279 4

原创 k8s编程operator实战之云编码平台——④web后端实现

在前两章中分别实现了k8s controller和后端pod的访问。通过controller可以实现code-server容器的创建、删除以及状态维护等,通过openresty可以实现后端pod的动态反向代理。接下来将会实现web后端,使用的`web框架为Gin`;`mysql驱动为sqlx`;`redis驱动为go-redis`;`以及grpc`。

2022-12-15 21:09:45 1164

原创 k8s编程operator实战之云编码平台——③Code-Server Pod访问实现

在上一节中实现了controller的逻辑,可以通过grpc来创建、删除工作空间以及查询信息。接下来要实现的就是如何访问到工作空间,我们就采用反向代理的方式,反向代理服务器就使用nginx。 openresty是一个基于nginx和luajit的web平台,我们可以通过它来实现动态的反向代理。接下来将会逐步实现。

2022-12-14 17:58:05 1062

原创 k8s编程operator实战之云编码平台——②controller初步实现

在上一章中介绍了整个云编码平台的架构设计,本章中将实现架构中的controller。需要使用的技术:k8s二次开发kubebuilder、grpc

2022-12-12 19:27:10 1858

原创 k8s编程operator实战之云编码平台——①架构设计

之前偶然接触到了腾讯的Cloud Studio平台,使用这个平台我们可以创建一个云上的IDE,我们在本地使用浏览器即可打开vscode来写代码。之后我就一直在想,这样一个平台是怎么样实现的?

2022-12-12 19:19:30 1693

原创 k8s编程operator——(4) kubebuilder & controller-runtime源码分析

在本章中将会介绍k8s operator开发的脚手架kubebuilder和其生成的代码依赖的controller-runtime

2022-12-12 14:57:50 1461

原创 k8s编程operator——(3) 自定义资源CRD.md

在K8S系统扩展中,开发者可以通过CRD(CustomResourceDefinition)来扩展K8S API,其功能主要由APIExtensionServer负责。使用CRD扩展资源分为三步:注册自定义资源、 使用自定义资源、删除自定义资源

2022-11-26 20:38:07 2618

原创 k8s编程operator——(2) client-go中的informer

使用client-set可以很容易地对ApiServer中的数据进行增删改查。但是,如果每次都从ApiServer获取数据,特别是执行List操作时,ApiServer会查询并传输大量的数据,将会对其产生很大的压力。如果能将数据缓存到本地,并在数据变化时进行更新,获取数据时从本地获取,那么将会大大减轻ApiServer的压力。因此,本章将会对client-go中的informer进行一个探究,通过Infomer,我们可以实现将数据缓存到本地,并且当资源对象发生变化时,我们能获取到相应的变化,并进行处理。

2022-11-23 16:45:41 2061 3

原创 Golang标准库限流器rate使用

限流就是限制系统的输入和输出流量来达到保护系统的目的,限流在实际场景中应用十分广泛,尤其在高并发场景下,为了保证系统的可以用性,我们需要采取一些限流措施降级,一旦达到限制的阈值,就需要限制流量并采取一些措施来完成限制流量的目的(比如:延迟处理、拒绝处理等),以防止过多的请求而导致系统崩溃。在golang的标准库golang.org/x/time/rate有一个限流器的实现,这个限流器的实现方案是令牌桶。

2022-11-21 12:48:30 2198

原创 k8s权限控制RBAC

kubernetes集群所有的交互都是通过apiServer来进行的,因此k8s对权限的控制就尤其重要。从1.6版本起,kubernetes默认启用RBAC访问控制策略。RBAC(Role-Based Access Control):基于角色的访问控制RBAC中4种顶级资源:Role、ClusterRole、RoleBinding、ClusterRoleBinding角色,包含一组权限的规则。没有拒绝规则,只是附加运行。Namespace隔离,只作用于命名空间。

2022-11-14 12:07:42 1246

原创 k8s编程operator——(1) client-go基础部分

client-go是一个golang的client,我们可以通过client-go与K8S apiServer进行交互,对k8s集群中资源对象,包括内置资源(例如:Pod、Deployment、Service等)和CRD进行增删改查等操作。client-go地址目录结构:该包包含了可以访问kubernetes集群的api,通过这些API可以与apiServer进行通信,对集群的资源对象进行增删改查。

2022-11-11 22:15:49 3906

原创 Kubernetes(K8S)学习笔记

Kubernetes是一个可移植的、可扩展的、开源的平台,用于管理容器化的工作负载和服务,它促进了声明式配置和自动化。它有一个庞大的、快速增长的生态系统。Kubernetes的服务、支持和工具可以广泛使用。Kubernetes这个名字源于希腊语,意思是舵手或飞行员。K8s作为一个缩写词,是计算“K”和“s”之间的八个字母的结果。谷歌于2014年开放Kubernetes项目。Kubernetes结合了谷歌超过15年的大规模运行生产负载的经验,以及来自社区的最佳品种的想法和实践。 传统部署时代(Traditio

2022-11-01 20:20:02 1424 1

原创 mongodb学习笔记

MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。https://www.mongodb.com/docs/manual/introduct

2022-10-28 16:08:02 1365

原创 go build常用命令行选项

go build实质上是通过调用go自带的compile工具对go代码进行编译的。在linux下的位置为$GOROOT/pkg/tool/linux_amd64/compile。go build可以经过-gcflags向compile工具传递编译所需的命令标志选项集合。

2022-10-13 15:27:58 2156

原创 Golang源码探究 —— 网络轮询器netpoller

网络通信是服务端程序必不可少也是至关重要的一部分,基于TCP Socket的通信则是网络编程的主流。TCP Socket是最常见的网络编程,在POSIX标准发布后,Socket得到了各大主流操作系统平台很好的支持。 Go是自带运行时的跨平台编程语言,Go的net包中暴露给开发者的Socket也是建立在操作系统原生socket接口之上的。netpoller是Go语言用来屏蔽各个操作系统底层高效I/O多路复用的网络轮询器,它屏蔽了各个操作系统底层不同而且复杂的I/O多路复用的使用,在上层为我们提

2022-10-12 22:10:55 1532

原创 Linux网络编程修改内核参数

修改主机能打开的最大文件描述符数量、修改主机可用端口范围

2022-10-12 20:13:30 290

原创 Golang源码探究 —— chan

在Golang中,chan是我们常用的数据结构,chan是并发安全的,在使用它的时候我们无需考虑锁的问题。而且chan使用非常方便,chan与goroutine配合,很容易就可以实现一个生产者/消费者模型。了解chan的源码可以让我们了解更多关于chan的实现以及更好的使用。

2022-09-08 14:32:41 2187

原创 云vscode搭建--使用容器化部署

本文主要介绍了云vscode的搭建,使用docker来部署code-server,并解决了无法访问容器中启动的服务器的问题。

2022-09-03 20:42:56 2170 1

原创 Golang骚操作——使用runtime私有函数

在Golang中,变量、函数、结构体等访问权限是由标识符的首字母大小写决定的,首字母小写的变量等在其它包中是不可见的,那么我们如何才能使用它们呢?这就需要使用一些骚操作了。说起Golang的入口函数,我们都会认为是main.main,但是在Golang程序启动前,需要先执行runtime.main来初始化调度器、垃圾回收器等。这个main_main函数没有函数体,在链接的时候,编译器会将其链接到我们自己的main函数,然后由runtime.main来调用。

2022-08-23 14:39:21 597

原创 Golang源码探究 —— sync.Map

Golang内置的map是不支持并发读写的,它在内部有检测机制,一旦发现并发读写,就会panic。如果需要并发读写map,有三种方案。 。前两者的效率在大部分情况下都不如官方提供的sync.Map。接下来来分析一下sync.Map是如何实现并发读写的。 sync.Map的结构用图表示如下:源码如下: sync.Map结构体中包含了四个字段,其中包含了两个map[interface{}]*entry ,entry中包含了一个unsafe的Pointer,这个指针指向了真正的value值。

2022-06-28 17:04:12 1162

原创 Golang源码探究 —— map

哈希表的实现方式有多种,比如哈希表、红黑树等。Golang的map底层是用哈希表实现的,在介绍Golang map的实现之前首先介绍一下哈希表的两种实现方式: 开放寻址法,底层是一个数组,每个数组都存放一个键值对,空闲的地方就是没有放键值对的地方。首先看如何插入:key-val首先经过一个哈希函数将key值进行哈希得到一个大的数字,然后将其对数组的长度取模,这样它就落在了数组中的一个位置。如果得到的位置没有被占用,那么就直接存放在对应位置。如果已经被占用了,那么就向后寻找一个槽,直到找到空闲的

2022-06-25 14:10:03 2536 7

原创 Linux进程间通信(Linux IPC)

在Linux下由很多种进程间通信的方式,在下面主要介绍七种,分别是:匿名管道(PIPE)、命名管道(FIFO)、信号、共享内存映射、共享内存、消息队列、信号量、UNIX域套接字。

2022-06-04 18:32:28 5571

原创 Golang+Mysql+Vue+Nginx前后端分离项目--个人博客

之前利用空闲时间做了一个个人博客系统,后端主要使用golang+gin框架+Mysql实现,前端使用vue+element ui + bootstrap。项目的部署使用docker,nginx作为静态资源服务器和反向代理服务器。结构图如下:1、效果图访问地址:我的博客博客首页:博客详情页文章标签归档资源库博客后台管理 数据库设计数据库主要包含12张表,分别是用户表、博客类型表、博客标签表、资源库表、资源类别表、格言表、留言表、随笔表、博客评论表、博客标签中

2022-05-24 13:15:06 2231 10

原创 使用适配器简化golang gin框架开发

我们在使用Gin框架时,可能在handler中有很多分支判断语句,就要写很多的ctx.Json来返回数据,这样用起来很麻烦,看起来也不美观。本文将使用一个装饰器来简化Gin的数据响应。比如,我们在使用Gin框架时,往往会这么写,在创建用户的handler中反复使用ctx.Json来返回数据,handler多了也会显得很烦。因此能不能实现一个handle,直接返回值就可以达到写出数据的目的呢。这时就可以使用装饰器模式来进行优化一下了。type User struct { Username string

2022-04-29 09:40:20 333

原创 Golang函数选项模式

由于Golang不支持函数重载,因此无法像C++或Java那样可以定义多个同名不同参的构造函数,因此如果要定义多个构造函数就需要使用不同的名称。但是如果后续要给结构体增加新的字段,那么可能就需要修改很多的构造函数,函数选项模式就可以完美解决这个问题。1、正常的构造函数拿下面的代码举个例子:type User struct { username string password string nickname string age uint8 gender bool

2022-04-21 13:06:34 314

原创 Windows下非常好用的软件

1、GeekGeek是一个用于卸载软件的软件,而且可以检测注册表以及残留文件并删除,它很轻量,非常好用!下载地址:Geek Uninstaller - the best FREE uninstaller 2、EverythingEverything是一个用于搜索文件的软件,它的搜索速度极快,相比于Windows的搜索快的不知多少倍,非常好用!下载地址:Everything - voidtools 3、WoxWox是一个快捷的启动器,可以与Everything配合使用

2021-11-23 21:41:18 7576

原创 Git常用命令

Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。Git的结构:团队内协作:团队外协作:1、本地库操作1.1 本地库初始化git init1.2 设置签名用于区分不同开发人员身份命令:项目级别:仅在当前本地库范围内有效,信息保存在当前项目的.git/config中git config user.name NAMEgit config.

2021-11-22 22:17:59 265

原创 Golang标准库binary

binary包实现了数字和字节序列之间的简单转换。1、ByteOrderByteOrder指定了如何将一个字节序列转换为16、32或64位的无符号整数:type ByteOrder interface { Uint16([]byte) uint16 Uint32([]byte) uint32 Uint64([]byte) uint64 PutUint16([]byte, uint16) PutUint32([]byte, uint32) PutUint64([]byte, uint64)

2021-11-20 18:07:40 2765

原创 Golang反射reflect

反射的基本介绍:反射可以在运行时动态获取变量的各种信息,比如变量的类型、类别。如果是结构体变量,还可以获取到结构体本身的信息(包含结构体的字段、tag、方法等)。通过反射可以修改变量的值,可以调用关联的方法。反射在很多框架中都有使用,使用反射可以写出一些比较通用性的方法,比如json数据的编解码。1、Golang反射中的一些定义1.1 KindKind代表Type类型值表示的具体分类。零值表示非法分类。Type是类型,Kind是类别。Type和Kind可能相同,也可能不相同:比如:

2021-11-15 23:38:30 734 1

原创 vs使用protobuf的各种坑

最近准备做一个即时通讯系统的客户端与服务端,选用protobuf作为TCP之上网络传输的协议,服务端使用的是Go语言,Go语言的protobuf使用起来很舒服很愉悦。客户端使用的是vs + qt,但是在安装protobuf的过程中遇到了各种坑爹的东西,特此记录下来。下面讲解windows安装protobuf并在vs中使用它,以及各种坑。1、下载protobuf和cmakeprotobuf下载地址:https://github.com/protocolbuffers/protobuf/releases/t

2021-11-15 18:35:11 4478 8

原创 redis学习笔记

1、redis下载安装–ubuntu环境​ 中文官网:http://www.redis.cn/# 将下载后的压缩包上传到linux上,执行下面命令解压缩文件。tar -zxvf 压缩包名字# 编译redis。redis是由C语言编写的因此编译redis需要gcc编译器,先安装gcc编译器以及makesudo apt install build-essential# 使用make编译makesudo make install# redis的默认安装路径在/usr/local/bin

2021-11-14 20:02:44 1253

原创 Golang源码探究 —— Slice

Golang中的切片算是在代码中使用频率最高的数据结构了,因此了解切片的底层实现可以让我们对切片的使用可以更加熟练和灵活。go的版本:go version go1.16.8 windows/amd641、切片的数据结构Golang中的切片定义在runtime包下的slice.go中,它在底层为一个结构体:type slice struct { array unsafe.Pointer // 指向数据缓冲区的指针 len int // 当前数据

2021-11-13 15:03:03 1213

原创 Golang中的一些小细节

1、golang中的结构体是可以直接比较的,底层调用了memequal函数来对内存进行比较,memequal是用汇编实现的。 2、golang中只有值传递。例如,用切片作为函数的形参时也是值传递,切片底层的数据结构为:// SliceHeader is the runtime representation of a slice.// It cannot be used safely or portably and its representation may// change in a

2021-11-09 15:26:00 391

原创 Golang打开文件资源管理器

有时候在使用git bash的终端时,想在终端中直接打开该位置的文件资源管理器,这个时候就可以用Go来一个这样的小程序,使用起来还是很方便的。package mainimport ( "fmt" "os" "os/exec" "strings")func main() { argLen := len(os.Args) dirName, err := os.Getwd() if err != nil { fmt.Println("Get Current Working Direc

2021-11-08 17:07:44 1107

原创 Golang字符串string详解

1、 string的定义Golang中的string的定义在reflect包下的value.go中,定义如下:StringHeader 是字符串的运行时表示,其中包含了两个字段,分别是指向数据数组的指针和数组的长度。// StringHeader is the runtime representation of a string.// It cannot be used safely or portably and its representation may// change in a late

2021-11-08 15:59:51 13025

坦克大战素材.7z

该资源为坦克大战游戏的一些图片以及音频素材。

2019-05-10

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

TA关注的人

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