自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 文件描述符(File Descriptor)简介

实际应用过程中,如果出现“Too many open files” , 可以通过增大进程可用的文件描述符数量来解决,但往往故事不会这样结束,很多时候,并不是因为进程可用的文件描述符过少,而是因为程序bug,打开了大量的文件连接(web连接也会占用文件描述符)而没有释放。Linux 系统中,把一切都看做是文件,当进程打开现有文件或创建新文件时,内核向进程返回一个文件描述符,文件描述符就是内核为了高效管理已被打开的文件所创建的索引,用来指向被打开的文件,所有执行I/O操作的系统调用都会通过文件描述符。

2024-05-17 16:21:15 668

原创 Docker alpine linux 修改时区

如果是在 dockerfile 中。

2024-05-14 09:57:41 692 3

原创 Golang线上内存||cup过高问题排查(pprof)

profile: CPU profile. You can specify the duration in the seconds GET parameter. After you get the profile file, use the go tool pprof command to investigate the profile.【默认进行30s的CPU Profing,用于观察CPU使用情况】需要注意的是,对于profile而言,总是需要采样一段时间,才可以看到数据。

2024-05-06 00:19:21 1047

原创 Linux ssh免密登录配置

私钥文件(id_rsa)将被保存在 /home/ 目录下,公钥文件则会自动生成在同一目录下,并将其扩展名改为 .pub。生成的密钥对可用于 SSH 远程登录和身份验证。-f /home/id_rsa1: 用于指定要生成的密钥文件的路径和名称。在这个命令中,我们将生成的私钥文件命名为 /home/id_rsa1。配置成功,到目标服务器的 /root/.ssh/authorized_keys 文件可以查看到公钥信息。将公钥存放到目标服务器的这个的 /root/.ssh/authorized_keys 文件中。

2024-03-30 10:32:55 639

原创 Docker 安装 Nginx 容器,反向代理

当服务器和容器都不存在 nginx.conf 文件时, 执行启动命令的时候 docker会将nginx.conf 作为目录创建 , 这并不是我们想要的结果。之所以要先创建 , 是因为Nginx本身容器只存在/etc/nginx 目录 , 本身就不创建 nginx.conf 文件。/home/nginx/conf/conf.d 下面创建新文件或者在原来文件基础上编辑,xxx-gateway.conf。启动前需要先创建Nginx外部挂载的配置文件( /home/nginx/conf/nginx.conf)

2024-03-21 15:00:03 1008 1

原创 DockerFile遇到的坑

当您在运行 docker run 命令时提供了额外的命令,Docker 不会执行 Dockerfile 中的 CMD 指令,而是执行您提供的命令。(会执行CMD)执行docker run -d imageName,会直接结束,通过docker ps -a 查看CMD是已经执行了。(会执行CMD)执行docker run imageName,再启动新终端执行docker exec -it查看CMD命令执行结构。dockerfile 中的 CMD 命令在docker run -it 不会执行 CMD 命令。

2024-03-18 14:31:46 668

原创 golang 注释插件

自动生成golang注释,该插件为 Intellij/Goland 中的 golang 提供自动生成注释。Select "Tools - Goanno Setting"(工具->Goanno Setting)Edit comment template(编辑模板)Edit template(编辑模板)模板支持的变量,请参考GitHub。2、 搜索 Goanno,安装。简单安装 Goanno 插件。

2024-03-05 18:58:26 749 2

原创 k8s-项目测试环境部署

将nginx、mysql、redis、es等部署到k8s之外,用作线上独立环境(至于你想把某些中间件部署到k8s内部这个自行处理,本次重点是如何将go-zero开发的微服务部署到k8s集群内部),这里我就直接使用项目下的docker-compose-env.yaml了,把所有依赖的第三方中间件环境直接安装在。2、另外一个就是我们的服务发现,线上我们部署在k8s中,go-zero直接支持k8s服务发现,所以不需要etcd等,我们在配置zrpc client的时候,要改成target,k8s的配置方式。

2024-02-29 10:09:29 1180

原创 centos7.9 搭建k8s

K3s 提供了一个安装脚本,可以方便地将其作为服务安装在基于 systemd 或 openrc 的系统上。K3s 易于安装,仅需要 Kubernetes 内存的一半,所有组件都在一个小于 100 MB 的二进制文件中。kubeconfig 文件将写入到 /etc/rancher/k3s/k3s.yaml,由 K3s 安装的 kubectl 将自动使用该文件。将安装其他实用程序,包括 kubectl、crictl、ctr、k3s-killall.sh 和 k3s-uninstall.sh。

2024-02-15 17:05:59 1014

原创 Windows搭建docker+k8s

因为开启K8s,主要是启动对应的服务,大概有七八个服务,镜像是很麻烦的,特别是没有配置本地加速的情况下(加速可以用阿里云或者中科大的地址,百度即可)。所以需要从远程仓库把镜像拉下来,过程很慢,即便我用VPN了,也一个小时未成功,无奈只能重装,换了第二种方案。开启 Kubernetes,并等待 Kubernetes 开始运行。有一点需要注意就是要看好对应的版本,因为后边涉及到版本的问题。从官网下载,然后直接安装即可,过程很简单,一直Next就行。中间的打马赛克的默认也是没有的,这是我已经安装好的。

2024-02-13 16:42:53 1848 1

原创 go基础-垃圾回收+混合写屏障GC全分析

Golang中的垃圾回收主要应用三色标记法,GC过程和其他用户goroutine可并发运行,但需要一定时间的**STW(stop the world)**,STW的过程中,CPU不执行用户代码,全部用于垃圾回收,这个过程的影响很大,Golang进行了多次的迭代优化来解决这个问题。,结合了删除写屏障和插入写屏障的优点,只需要在开始时并发扫描各个goroutine的栈,使其变黑并一直保持,这个过程不需要STW,而标记结束后,因为栈在扫描后始终是黑色的,也无需再进行re-scan操作了,减少了STW的时间。

2024-01-29 10:02:27 1316

原创 go-zero集成asynq

scheduler:looklook/app/mqueue/cmd/scheduler目录,定时生成任务。server:looklook/app/mqueue/cmd/job目录,消费任务。client:looklook/app/order/rpc目录,业务生成任务。参考looklook/app/mqueue/cmd/scheduler目录。参考looklook/app/mqueue/cmd/job目录。参考looklook/app/order/rpc目录。资源依赖填充(ServiceContext)

2024-01-23 16:06:36 454

原创 gitignore中配置了新的规则,如何强制生效?

在 Git 中,.gitignore 文件用于指定哪些文件或目录不应该被 Git 跟踪和提交。执行以上命令后,Git 将会重新读取 .gitignore 文件,并根据文件内容更新 Git 缓存。需要注意的是,以上命令会删除 Git 缓存中所有文件和目录,因此在执行前需要确保没有重要的未提交修改。git commit -m "update .gitignore":提交修改,并添加一条提交信息。git rm -r --cached .:删除 Git 缓存中所有文件和目录。

2024-01-22 19:30:42 612

原创 go-zero模板定制化

如果只想维护一份模板,那么我们初始化模板的时候和生成代码的时候都不用指定–home了,默认的模板tpl文件在.goctl里面;一般来说除非是开源的包,我们可以直接指定写,但是有些包是项目内的包,模板直接指定的话换了项目就不行了;开发者可能是想我们做一套好用的模板,但是目前看来开源的模板都没几个;回滚其实就是把你修改的东西不要了,要回初始的;, 默认情况下,模板生成器会选择内存中的模板进行生成,而对于有模板修改需求的开发者来讲,则。在模板中添加文件是不生效的,只能是修改他已有的tpl文件。

2024-01-10 09:23:54 644 1

原创 go-zero错误处理

按照正常情况下,go-zero的rpc服务是基于grpc的,默认返回的错误是grpc的status.Error 没法给我们自定义的错误合并,并且也不适合我们自定义的错误,它的错误码、错误类型都是定义死在grpc包中的,ok ,如果我们在rpc中能用自定义错误返回,然后在拦截器统一返回时候转成grpc的status.Error , 那么我们rpc的err跟api的err是不是可以统一管理我们自己的错误了呢?

2024-01-08 14:15:11 1088

原创 go-zero数据库

注意:虽然go-zero的goctl model mysql 指令支持从 sql 文件,数据库连接两个来源生成代码,两者生成的代码是完全一样的。本节使用golang新增的泛型特性,对查询、新增、修改这三种类型的代码进一步优化,从而实现使用同一个接口操作多个数据表的目的。查询数据库有数据,则在Redis缓存中将指定key的数据设置为数据库查到的数据,时长自定义,同时将查询到的结果返回。※默认的缓存接口主要针对的是单条数据,因为设置到Redis里的key只细化到了id,因此针对单条数据的。

2024-01-08 11:00:58 527

原创 go-zero开发流程

添加user rpc配置,service/user/api/internal/config/config.go。添加user rpc配置,service/user/api/internal/config/config.go。完善服务依赖,service/user/api/internal/svc/servicecontext.go。添加yaml配置,service/user/api/etc/config.yaml。添加yaml配置,service/user/api/etc/config.yaml。

2024-01-06 10:32:28 456

原创 docker&docker-compose安装

如果安装了这些较旧版本的 Docker :docker、http://docker.io、docker-engine,通过运行镜像来验证Docker Engine安装是否成功 hello-world。如果不需要保存现有数据,并希望从全新安装开始,可以进行手动删除。通过检查版本来验证 Docker Compose 是否正确安装。您现在已经成功安装并启动了 Docker Engine。以下是ubuntu安装,其他安装请参考官网。以下是ubuntu安装,其他安装请参考官网。安装 Docker 软件包。

2024-01-05 10:23:09 385

原创 MySQL-面经

通过辅助索引(辅助索引存放的是指向聚簇索引的ID值),找到聚簇索引的ID值,然后再基于查询到的ID值,再走ID字段的主键索引,最终得到一整条行数据并返回。先记录redo-log日志,标记为prepare状态,提交之后再写bin-log,然后更新redo-log为commit状态。叶节点:不会存储数据,仅存储指向叶子节点的指针,好处让叶节点存储更多元素,确保树的高度不会由于数据增长而变得很高。并非所有的正向范围操作都会走索引,例如IS NULL就不会走,它的反向操作:IS NOT NULL同样不会走。

2024-01-02 01:15:08 371

原创 MySQL-分库分表&主从

会先写入到主节点中,接着主节点会向所有从节点发送一个写入数据的请求,但半同步模式中无需等待所有从节点全部写入完成后再返回,而是只要有一个从节点写入成功并返回了ACK,则会直接向客户端返回写入成功,这样既能够保证性能,又能够确保数据不丢失。当主节点接收到一个客户端的写请求后,先会往自身写入数据,自身数据写入成功后,就会立马向客户端返回写入成功的信息,对于从节点的数据,会在其他的时间内再异步复制过去。①在主节点宕机或故障的情况下,从节点能自动切换成主节点的身份,从而继续对外提供服务。

2023-12-26 19:35:15 50

原创 MySQL-调优&sql优化&排查

弊端是指存储容量的上限+木桶效应,因为多主模式中的每个节点都会存储完整的数据,因此当数据增长达到硬件的最大容量时,就无法继续写入数据了,此时只能通过加大磁盘的形式进一步提高存储容量,但硬件也不可能无限制的加下去,而且由于多主是基于主从架构实现的,因为具备木桶效应,要加得所有节点一起加,否则另一个节点无法同步写入数据时,就会造成所有节点无法写入数据。在条件允许的情况下,尽量使用最简单的类型代替复杂的类型,如IP的存储可以使用int而并非varchar,因为简单的数据类型,操作时通常需要的CPU资源更少。

2023-12-25 19:56:24 39

原创 MySQL-事务&锁

不会每次查询时都创建新的ReadView,而是在一个事务中,只有第一次执行查询会创建一个ReadView,在这个事务的生命周期内,所有的查询都会从这一个ReadView中读取数据,从而确保了一个事务中多次读取相同数据是一致的,也就是解决了不可重复读问题。一个事务在尝试读取一条数据时,MVCC基于当前MySQL的运行状态生成的快照,也被称之为读视图,即ReadView,在这个快照中记录着当前所有活跃事务的ID(活跃事务是指还在执行的事务,即未结束(提交/回滚)的事务)

2023-12-25 19:39:32 55

原创 MySQL-索引

发生磁盘IO,磁盘寻道,读到数据载入内存(触发1),根据SQL条件对读到的数据做判断,不符合,重复执行,符合,写入到结果集中,然后继续判断其他数据,直到数据没有,结果集返回。根据条件字段,去内存中找到聚簇索引的根节点,然后根据节点中记录的地址去找次级的叶节点,最后再根据叶节点中的指针地址,找到最下面的叶子节点,从而获取其中的行数据。过程大致是相同的,重点是:先删非聚簇索引信息,再删聚簇索引的信息,因为聚簇索引上存放着行数据,如果先把聚簇索引删了,就无法找到非聚簇索引上的信息了。叶子节点:存储实际的数据。

2023-12-25 00:56:20 53

原创 MySQL-结构+范式

写操作时,会先从缓冲区中查询是否有要操作的数据,如果有,则直接对内存中的数据进行操作(例如修改、删除等),对缓冲区中的数据操作完成后,会直接给客户端返回成功的信息,然后MySQL会在后台利用一种名为Checkpoint的机制,将内存中更新的数据刷写到磁盘。因为线程在任何系统中都属于珍贵资源,频繁创建和销毁的代价比较高,当客户端主动退出连接后,MySQL只会将对应线程绑定的会话信息清空,然后将“空闲”的线程放入自身的连接池当中,以备下次客户端连接时使用。

2023-12-25 00:21:47 52

原创 go基础-GMP原理与调度

M:线程想运行任务就得获取 P,从 P 的本地队列获取 G,P 队列为空时,M 也会尝试从全局队列拿一批 G 放到 P 的本地队列,或从其他 P 的本地队列偷一半放到自己 P 的本地队列。比如当 G 中包含创建新协程的时候,M 创建了 G’,为了继续执行 G,需要把 G’交给 M’执行,也造成了很差的局部性,因为 G’和 G 是相关的,最好放在 M 上执行,而不是其他 M’。比如所有的 M 此时都阻塞住了,而 P 中还有很多就绪任务,就会去寻找空闲的 M,而没有空闲的,就会去创建新的 M。

2023-12-15 14:52:48 39 1

原创 go基础-并发

其一大特点是goroutine的调度是在用户态下完成的, 不涉及内核态与用户态之间的频繁切换,包括内存的分配与释放,都是在用户态维护着一块大的内存池, 不直接调用系统的malloc函数(除非内存池需要改变),成本比调度OS线程低很多。当main()函数返回的时候该goroutine就结束了,所有在main()函数中启动的goroutine会一同结束,main函数所在的goroutine就像是权利的游戏中的夜王,其他的goroutine都是异鬼,夜王一死它转化的那些异鬼也就全部GG了。

2023-12-14 16:23:02 36 1

原创 go基础-接口/IO操作

Go语言提倡面向接口编程。每个接口类型由数个方法组成。type 接口类型名 interface{方法名1( 参数列表1 ) 返回值列表1方法名2( 参数列表2 ) 返回值列表2接口类型名:使用 type 将接口定义为自定义的类型名。Go语言的接口在命名时,一般会在单词后面添加 er,如有写操作的接口叫 Writer,有字符串功能的接口叫 Stringer,有关闭功能的接口叫 Closer 等。

2023-12-05 19:09:07 55

原创 go基础-包

提示:go get [包名]@[版本号]命令中版本号可以是 x.y.z 的形式,例如 go get foo@v1.2.3,也可以是 git 上的分支或 tag,例如 go get foo@master,还可以是 git 提交时的哈希值,例如 go get foo@e3702bed2。Go语言的包借助了目录树的组织形式,一般包的名称就是其源文件所在目录的名称,虽然Go语言没有强制要求包名必须和其所在的目录名同名,但还是建议包名和所在目录同名,这样结构更清晰。

2023-12-05 19:04:51 30

原创 go基础-结构体

接收器类型可以是(几乎)任何类型,不仅仅是结构体类型,任何类型都可以有方法,甚至可以是函数类型,可以是 int、bool、string 或数组的别名类型,但是接收器不能是一个接口类型,因为接口是一个抽象定义,而方法却是具体实现,如果这样做了就会引发一个编译错误invalid receiver type…在Go语言中有一个概念,它和方法有着同样的名字,并且大体上意思相同,Go 方法是作用在接收器(receiver)上的一个函数,接收器是某种类型的变量,因此方法是一种特殊类型的函数。

2023-11-27 00:32:44 17 1

原创 go基础-函数

Go语言是编译型语言,所以函数编写的顺序是无关紧要的,鉴于可读性的需求,最好把 main() 函数写在文件的前面,其他函数按照一定逻辑顺序进行编写(例如函数被调用的顺序)。假如函数F中书写了panic语句,会终止其后要执行的代码,在panic所在函数F内如果存在要执行的defer函数列表,按照defer的逆序执行。返回函数F的调用者G,在G中,调用函数F语句之后的代码不会执行,假如函数G中存在要执行的defer函数列表,按照defer的逆序执行。匿名函数的优越性在于可以直接使用函数内的变量,不必声明。

2023-11-26 10:37:40 25 1

原创 go并发面经

请求的writer到来,如果已经有一些reader请求了锁的话,writer会等待已经存在的reader都释放锁之后才获取到锁,后面来的新reader要等writer执行完后才会获得锁。唤醒的goroutine或者新来的goroutine首次获取不到锁,会自旋(spin),尝试一定的自旋次数后,再执行回原来的逻辑。独立的栈空间,共享堆空间,调度由用户自己控制,本质上有点类似于用户级线程,这些用户级线程的调度也是自己实现的。第一个参数:通道中的值,如果通道还有数据,那么就是通道中的下一个值。

2023-11-20 19:26:15 74 1

原创 go并发编程-路线总结3

根据此规则,go 语句传入的参数是一个函数执行的结果,那么,这个函数一定先于 goroutine 内部的代码被执行。只要一个异步函数执行成功,就立马返回。执行一个子任务,如果子任务执行失败,它会尝试一定的次数,如果一直不成功 ,就会返回失败错误 ,如果执行成功,它会立即返回。所有的子任务都是串行执行的,前一个子任务的执行结果会被当作参数传给下一个子任务,直到所有的任务都完成,返回最后的执行结果。有多个子任务返回错误,只会返回第一个出现的错误,所有的子任务都执行成功,返回 nil。

2023-11-15 17:01:15 40

原创 go并发编程-路线总结2

在处理多个goroutine 同时调用同一个函数的时候,只让一个 goroutine 去调用这个函数,等到这个goroutine 返回结果的时候,再把结果返回给这几个同时调用的 goroutine,这样可以减少并发调用的数量。TryAcquire:尝试获取 n 个资源,但是它不会阻塞,要么成功获取 n 个资源,返回 true,要么一个也不获取,返回 false。Done:返回一个 Channel 对象。Acquire,请求的资源数比最大的资源数大,可能永远被阻塞(依赖ctx的状态返回,否则一直等待)。

2023-11-14 19:43:13 32

原创 go并发编程-路线总结1

请求的writer到来,如果已经有一些reader请求了锁的话,writer会等待已经存在的reader都释放锁之后才获取到锁,后面来的新reader要等writer执行完后才会获得锁。在并发编程中,如果程序中的一部分会被并发访问或修改,那么,为了避免并发访问导致的意想不到的结果,这部分程序需要被保护起来,这部分被保护起来的程序,就叫做临界区。victim:用来存储空闲的元素。CAS 指令将给定的值和一个内存地址中的值进行比较,如果它们是同一个值,就使用新值替换内存地址中的值,这个操作是原子性的。

2023-11-13 20:24:18 36

原创 go基础 - 结构体

接收器类型可以是(几乎)任何类型,不仅仅是结构体类型,任何类型都可以有方法,甚至可以是函数类型,可以是 int、bool、string 或数组的别名类型,但是接收器不能是一个接口类型,因为接口是一个抽象定义,而方法却是具体实现,如果这样做了就会引发一个编译错误。在面向对象的语言中,类拥有的方法一般被理解为类可以做的事情。在Go语言中有一个概念,它和方法有着同样的名字,并且大体上意思相同,Go 方法是作用在接收器(receiver)上的一个函数,接收器是某种类型的变量,因此方法是一种特殊类型的函数。

2023-11-06 16:23:02 108

原创 go基础 - 函数

无论是值传递,还是引用传递,传递给函数的都是变量的副本,不过,值传递是值的拷贝。Go语言是编译型语言,所以函数编写的顺序是无关紧要的,鉴于可读性的需求,最好把 main() 函数写在文件的前面,其他函数按照一定逻辑顺序进行编写(例如函数被调用的顺序)。返回函数F的调用者G,在G中,调用函数F语句之后的代码不会执行,假如函数G中存在要执行的defer函数列表,按照defer的逆序执行。引用传递:是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

2023-11-06 09:12:49 23

原创 go基础-流程控制

在编程中,变量的作用范围越小,所造成的问题可能性越小,每一个变量代表一个状态,有状态的地方,状态就会被修改,函数的局部变量只会影响一个函数的执行,但全局变量可能会影响所有代码的执行状态,因此限制变量的作用范围对代码的稳定性有很大的帮助。goto 语句通过标签进行代码间的无条件跳转,同时 goto 语句在快速跳出循环、避免重复退出上也有一定的帮助,使用 goto 语句能简化一些代码的实现过程。switch 语句用于基于不同条件执行不同动作,每一个 case 分支都是唯一的,从上至下逐一测试,直到匹配为止。

2023-10-28 09:06:32 34 1

原创 go基础面经

一个goroutine的栈在其生命周期开始时只有很小的栈(典型情况下2KB),goroutine的栈不是固定的,他可以按需增大和缩小,goroutine的栈大小限制可以达到1GB。在内存中开辟了一片空间,空间存放着一个值(10),这片空间在整个内存当中,有一个唯一的地址,用来进行标识,指向这个地址的变量就称为指针。- 有缓冲通道:通道的容量填满才会阻塞,使用内置的len函数获取通道内元素的数量,使用cap函数获取通道的容量。如果发生扩容,就不会影响原切片,它底层会变成一个新的数组了。

2023-10-28 09:03:33 29 1

原创 go基础2 - 常量指针&数组-切片-map-nil

golang 基础 入门 常量 指针 数组 切片 map nil

2023-10-21 11:28:33 219 1

原创 go基础1 - 为什么使用GO&变量&基本类型

golang 基础 入门

2023-10-21 09:46:30 27 1

空空如也

空空如也

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

TA关注的人

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