<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[random_w的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/random_w</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; random_w]]></copyright><item><title><![CDATA[通过 go module 引入`cleint-go`的正确姿势]]></title><link>https://blog.youkuaiyun.com/random_w/article/details/116804280</link><guid>https://blog.youkuaiyun.com/random_w/article/details/116804280</guid><author>random_w</author><pubDate>Fri, 14 May 2021 20:13:10 +0800</pubDate><description><![CDATA[1. 问题
在项目上我喜欢通过go module做包管理，在使用的过程中会遇到各种导入包的因为版本问题无法正常使用的问题，这次遇到的问题如下：

项目中引用了client-go包，执行完 go mod tidy 及 go mod vendor 后，运行程序发现程序无法运行，报错如下： cannot load k8s.io/api/auditregistration/v1alpha1…

2. 刨根问底
第一时间检查vendor目录下报错信息中的库是否存在，发现真的不存在，于是查看go.mod文件：
requ]]></description><category></category></item><item><title><![CDATA[epel-release的作用解密]]></title><link>https://blog.youkuaiyun.com/random_w/article/details/114299753</link><guid>https://blog.youkuaiyun.com/random_w/article/details/114299753</guid><author>random_w</author><pubDate>Wed, 03 Mar 2021 09:38:19 +0800</pubDate><description><![CDATA[再我们平时使用 RHEL 系列 Linux 操作系统的时候，安装软件包通常需要安装一个 epel-release 的软件包，那这个包有什么用呢？
EPEL是由 Fedora 社区打造，为 RHEL 及衍生发行版如 CentOS、Scientific Linux 等提供高质量软件包的项目。装上了 EPEL之后，就相当于添加了一个第三方源。官方的rpm repository提供的rpm包也不够丰富，很多时候需要自己编译那太辛苦了，而EPEL恰恰可以解决这两方面的问题。
EPEL 安装方法：
[root@rand]]></description><category></category></item><item><title><![CDATA[beego项目管理工具bee安装失败解决办法，总有一个适合你]]></title><link>https://blog.youkuaiyun.com/random_w/article/details/108983803</link><guid>https://blog.youkuaiyun.com/random_w/article/details/108983803</guid><author>random_w</author><pubDate>Fri, 09 Oct 2020 18:25:25 +0800</pubDate><description><![CDATA[因为墙的原因导致安装bee失败的解决办法，总有一个适合你。

先来看两种常见的报错：
第一种：
$ go get -u github.com/beego/bee
# cd C:\GOPATH\src\golang.org\x\text; git pull --ff-only
fatal: unable to access 'https://go.googlesource.com/text/': Failed to connect to go.googlesource.com port 443: Timed.]]></description><category></category></item><item><title><![CDATA[Go语言标准库学习之archive/zip——Go语言自带的文件压缩利器]]></title><link>https://blog.youkuaiyun.com/random_w/article/details/108889072</link><guid>https://blog.youkuaiyun.com/random_w/article/details/108889072</guid><author>random_w</author><pubDate>Wed, 30 Sep 2020 18:19:36 +0800</pubDate><description><![CDATA[在 Go 语言标准库中提供了 archive/zip 包用来进行文件的压缩和解压缩，正好最近工作中用到了这个库，在这里向大家介绍 zip 库的使用方法，希望对你有帮助。

1. 主要方法介绍
FileHeader 对象描述了 zip 文件中的一个文件信息，相关方法如下：


FileInfoHeader
// FileInfoHeader返回一个根据fi填写了部分字段的Header。
// 因为os.FileInfo接口的Name方法只返回它描述的文件的无路径名，有可能需要将返回值的Name字段修改为文件.]]></description><category></category></item><item><title><![CDATA[在Linux服务器上如何配置用户的sudo权限，教你配置如何让用户只能读写文件、上传文件、下载文件，但是不能删除文件]]></title><link>https://blog.youkuaiyun.com/random_w/article/details/108403865</link><guid>https://blog.youkuaiyun.com/random_w/article/details/108403865</guid><author>random_w</author><pubDate>Fri, 04 Sep 2020 14:43:12 +0800</pubDate><description><![CDATA[最近公司的中间件服务器因为同事的误操作，导致系统硬盘分区表丢失，系统直接挂掉了，好在最后恢复了，恢复后，老大有一个需求，想对中间件服务器做一下权限限制，之前大家都是以 admin 用户登陆的，它可以使用 root 用户的所有权限，但是现在我们想要让 admin 用户只能上传、下载文件，但是不能删除文件、重启系统，那么改怎么做呢？

思路：
刚看到这个需求，第一时间想到的是文件权限控制，但是仔细一想这样并不能满足需求，应为用户有了上传下载权限，必然就有删除文件的权限，于是我想到可以配置 sudo ，禁止 a.]]></description><category></category></item><item><title><![CDATA[kubernetes 开发必须要知道的知识点—— API Group]]></title><link>https://blog.youkuaiyun.com/random_w/article/details/108395448</link><guid>https://blog.youkuaiyun.com/random_w/article/details/108395448</guid><author>random_w</author><pubDate>Thu, 03 Sep 2020 23:42:08 +0800</pubDate><description><![CDATA[在使用k8s进行服务的部署过程中我们会使用到Deployment、Service、Pod等资源，在 yaml 文件中我们需要指定对应的 API 版本，我们可以通过访问相应的接口来管理相应的资源信息，在 k8s 中为了提高 API 的可扩展性，采用了 API Groups 进行标识这些接口，在 client-go 源码中就是通过指定的 API Groups 来访问 k8s 集群的，这里向大家介绍 API Groups 都有哪些，希望对你有帮助。

当前 k8s 支持两类 API Groups：
1. Cor.]]></description><category></category></item><item><title><![CDATA[如何通过Hash算法实现服务器节点的合理调度——通过Go语言实现一致性Hash算法]]></title><link>https://blog.youkuaiyun.com/random_w/article/details/108394855</link><guid>https://blog.youkuaiyun.com/random_w/article/details/108394855</guid><author>random_w</author><pubDate>Thu, 03 Sep 2020 22:56:12 +0800</pubDate><description><![CDATA[在分布式系统开发中，我们经常会遇到服务器负载均衡的问题，我们需要将用户的请求均匀的分摊到每一台服务器，从而保证系统资源的有效利用。那么如何将请求均匀的进行分配呢？比较常见的就是 Hash 算法了，但是普通的余数hash（hash(比如用户id)%服务器机器数）算法伸缩性很差，当新增或者下线服务器机器时候，用户id与服务器的映射关系会大量失效。一致性hash则利用hash环对其进行了改进。

1. Hash 算法
Hash，一般翻译做“散列”，也有直接音译为“哈希”的，就是把任意长度的输入（又叫做预映射， .]]></description><category></category></item><item><title><![CDATA[open-falcon监控系统组件学习之——agent组件]]></title><link>https://blog.youkuaiyun.com/random_w/article/details/108361167</link><guid>https://blog.youkuaiyun.com/random_w/article/details/108361167</guid><author>random_w</author><pubDate>Wed, 02 Sep 2020 14:13:25 +0800</pubDate><description><![CDATA[agent是监控系统中比较重要的一块，小米的oprn-falcon采用rpc的方式与server端进行通信，点击agent可以看到源码，当然，后面随着代码commit，本文介绍的部分内容会与实际代码不同，但思路是不会变的。

一、 Agent 模块启动流程
1. flag参数
main函数是整个agnet代码的入口，我们从这里开始进行分析。
cfg := flag.String("c", "cfg.json", "configuration file")
version := flag.Bool("v",.]]></description><category></category></item><item><title><![CDATA[Go语言标准库学习之reflect——Go语言中如何通过反射获取interface{}类型数据的值、类型以及方法调用]]></title><link>https://blog.youkuaiyun.com/random_w/article/details/108361115</link><guid>https://blog.youkuaiyun.com/random_w/article/details/108361115</guid><author>random_w</author><pubDate>Wed, 02 Sep 2020 14:10:11 +0800</pubDate><description><![CDATA[在Go语言中我们常常会用到接口类型来编写万能程序，函数接收到参数后，我们需要分析出参数类型，这就需要用到类型反射了，这篇文章向大家介绍Go语言标准库 reflect 的使用，希望对你有帮助。

一、interface和反射
1. Go语言中类型设计原则
学习反射前，我们先了解一下Golang关于类型设计的一些原则：

变量包括（type，value）两部分。
type包括static type和concrete type，简单来说static type是在编码看得见的类型（int、string、float.]]></description><category></category></item><item><title><![CDATA[open-falcon监控系统组件学习之——judge组件]]></title><link>https://blog.youkuaiyun.com/random_w/article/details/108266262</link><guid>https://blog.youkuaiyun.com/random_w/article/details/108266262</guid><author>random_w</author><pubDate>Thu, 27 Aug 2020 18:15:17 +0800</pubDate><description><![CDATA[在 open-falcon 监控系统中，judge 模块负责告警判断，它会定期向 hbs 请求告警策略信息，然后将告警信息推送到 redis ，本文向大家介绍 judge 是如何进行告警诊断的，希望对你有帮助。

阅读前需要了解的概念：
1. 监控数据分类

GAUGE：实测值，直接使用采集的原始数值，比如气温；
COUNTER：记录连续增长的数据，只增不减。比如汽车行驶里程，网卡流出流量，cpu_idle等；
DERIVE：变化率，类似COUNTER ，但是可增可减；

GAUGE 类型的值在进行告警诊.]]></description><category></category></item><item><title><![CDATA[open-falcon监控系统组件学习之——transfer组件]]></title><link>https://blog.youkuaiyun.com/random_w/article/details/108260690</link><guid>https://blog.youkuaiyun.com/random_w/article/details/108260690</guid><author>random_w</author><pubDate>Thu, 27 Aug 2020 14:50:46 +0800</pubDate><description><![CDATA[在open-falcon监控系统中，agent采集到数据后就会将数据上报的 transfer 组件，那transfer都做了什么呢？带着这个问题，我们一起学习transfer组件，希望对你有帮助。

一、 transfer 启动的时候都做了什么
同样我们从main函数入手，下面时main函数的执行流程：
#mermaid-svg-AJRPKzW60NAb9hkn .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--merm.]]></description><category></category></item><item><title><![CDATA[超级详细的跨域问题解决方法指南——以gin框架为例，解决跨域问题]]></title><link>https://blog.youkuaiyun.com/random_w/article/details/108258735</link><guid>https://blog.youkuaiyun.com/random_w/article/details/108258735</guid><author>random_w</author><pubDate>Thu, 27 Aug 2020 14:14:10 +0800</pubDate><description><![CDATA[一、什么是跨域
1. 同源策略
所谓同源是指：域名、协议、端口相同，而浏览器实现了同源策略，这里引用百度百科的解释：

同源策略（Same origin policy）是一种约定，它是浏览器最核心也最基本的安全功能，如果缺少了同源策略，则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的，浏览器只是针对同源策略的一种实现。

2. 同源策略分类
同源策略分为两种：


DOM 同源策略：禁止对不同源页面 DOM 进行操作。这里主要场景是 iframe 跨域的情况，不同域名的 ifram]]></description><category></category></item><item><title><![CDATA[windows系统安装protocol buffer如何解决protoc-gen-go依赖包安装的一系列问题]]></title><link>https://blog.youkuaiyun.com/random_w/article/details/108194927</link><guid>https://blog.youkuaiyun.com/random_w/article/details/108194927</guid><author>random_w</author><pubDate>Mon, 24 Aug 2020 10:47:51 +0800</pubDate><description><![CDATA[今天在学习 protocol buffer 的时候遇到了 protoc-gen-go not find 的问题，我是在 windows10 系统中安装的 protoc ，在官网下载了安装包（包虽然很小，但是下载是真的慢），然后安装，以为万事大吉，结果报依赖的问题，这里记录下解决方法，希望对大叫有帮助。

1. 先来看问题
$ protoc --go_out=. hello.proto
'protoc-gen-go' 不是内部或外部命令，也不是可运行的程序
或批处理文件。
--go_out: protoc-.]]></description><category></category></item><item><title><![CDATA[Go语言标准库学习之container——Go语言如何实现单链表、循环链表、双向链表、堆]]></title><link>https://blog.youkuaiyun.com/random_w/article/details/108096981</link><guid>https://blog.youkuaiyun.com/random_w/article/details/108096981</guid><author>random_w</author><pubDate>Wed, 19 Aug 2020 11:42:22 +0800</pubDate><description><![CDATA[在 Go 语言中我们可以直接使用 container 标准库完成链表和堆操作，非常方便，我们不需要自己去实现这些方法，本文向大家介绍 container 库的使用方法，希望对你有帮助。

一、双向链表
1. Element
Element 中保存了链表的所有信息，我们来看一下源码：
type Element struct {
	// 双链接元素列表中的下一个和上一个指针。
	next, prev *Element
	// 此元素所属的链表。
	list *List
	// value 中保存了链表的值
	.]]></description><category></category></item><item><title><![CDATA[Go语言标准库学习之database/sql——数据库管理的利器]]></title><link>https://blog.youkuaiyun.com/random_w/article/details/108005397</link><guid>https://blog.youkuaiyun.com/random_w/article/details/108005397</guid><author>random_w</author><pubDate>Fri, 14 Aug 2020 15:20:59 +0800</pubDate><description><![CDATA[在Go语言标准库中提供了进行数据库操作的 database/sql 库，需要注意的是在使用 sql 库的时候需要导入数据库驱动。本文记录了 database/sql 标准库的学习笔记，希望对你有帮助。

1. 数据库连接
链接数据库只需要四步即可：
#mermaid-svg-bDLD3V9aDVQFpofO .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;c.]]></description><category></category></item><item><title><![CDATA[Go语言标准库学习之strings——字符串格式化的利器]]></title><link>https://blog.youkuaiyun.com/random_w/article/details/107768992</link><guid>https://blog.youkuaiyun.com/random_w/article/details/107768992</guid><author>random_w</author><pubDate>Mon, 03 Aug 2020 17:14:13 +0800</pubDate><description><![CDATA[在 GO 语言中，我们可以使用 strings 标准库对字符串进行一系列操作，strings 标准库在日常的编程过程中是十分常用的，这里向大家介绍strings标准库的使用，希望对你有帮助。

一、字符串切割
1. 字符串前后端字符清理
// 返回将s前后端所有cutset包含的utf-8码值都去掉的字符串。
func Trim(s string, cutset string) string
// 返回将s前后端所有空白（unicode.IsSpace指定）都去掉的字符串。
func TrimSpace(.]]></description><category></category></item><item><title><![CDATA[Go语言标准库学习之net——有趣的网络编程]]></title><link>https://blog.youkuaiyun.com/random_w/article/details/107765775</link><guid>https://blog.youkuaiyun.com/random_w/article/details/107765775</guid><author>random_w</author><pubDate>Mon, 03 Aug 2020 15:53:19 +0800</pubDate><description><![CDATA[在go语言标准库中，net包提供了可移植的网络I/O接口，包括TCP/IP、UDP、域名解析和Unix域socket。本文向大家介绍net标准库的使用，希望对你有帮助。

一、 服务端
1.  解析地址
在TCP服务端我们需要监听一个TCP地址，因此建立服务端前我们需要生成一个正确的TCP地址，这就需要用到下面的函数了。
// ResolveTCPAddr函数会输出一个TCP连接地址和一个错误信息
func ResolveTCPAddr(network, address string) (*TCPAddr.]]></description><category></category></item><item><title><![CDATA[Go语言标准库学习之sync二（通过sync.Pool大幅度提升程序运行性能）]]></title><link>https://blog.youkuaiyun.com/random_w/article/details/107686076</link><guid>https://blog.youkuaiyun.com/random_w/article/details/107686076</guid><author>random_w</author><pubDate>Thu, 30 Jul 2020 11:18:10 +0800</pubDate><description><![CDATA[sync.pool对象在并发比较高的系统中是非常常见的，这篇博客向大家介绍sync包创建可复用的实例池的原理以及使用方法，希望对你有帮助。

1.  池的内部工作流程
我们调用sync.pool包中的方法的时候，init函数会自动注册一个清理pool对象的方法，该方法会在GC执行前被调用，所以Pool会在调用GC的时候性能较低（初始化的对象都被清理了，重新创建就会产生开销）。Pool只在两次GC之间是有效的，下面是官方的一张图，用来理解池的管理方式：

对于我们创建的每个 sync.Pool，go 生成一.]]></description><category></category></item><item><title><![CDATA[Go语言标准库学习之os/signal——使用Go语言管理信号]]></title><link>https://blog.youkuaiyun.com/random_w/article/details/107484349</link><guid>https://blog.youkuaiyun.com/random_w/article/details/107484349</guid><author>random_w</author><pubDate>Tue, 21 Jul 2020 11:11:14 +0800</pubDate><description><![CDATA[os/signal包实现了对输入信号的访问。这个包只有两个重要方法，这里向大家介绍一下，希望对你有帮助。

1. 信号的转发

Notify函数让signal包将输入信号转发到c。如果没有列出要传递的信号，会将所有输入信号传递到c；否则只传递列出的输入信号。
signal包不会为了向c发送信息而阻塞（就是说如果发送时c阻塞了，signal包会直接放弃）：调用者应该保证c有足够的缓存空间可以跟上期望的信号频率。对使用单一信号用于通知的通道，缓存为1就足够了。
可以使用同一通道多次调用Notify：每一次都会.]]></description><category></category></item><item><title><![CDATA[Go语言标准库学习之encoding/gob——Go语言Gob流的管理]]></title><link>https://blog.youkuaiyun.com/random_w/article/details/107482152</link><guid>https://blog.youkuaiyun.com/random_w/article/details/107482152</guid><author>random_w</author><pubDate>Tue, 21 Jul 2020 10:10:05 +0800</pubDate><description><![CDATA[gob包是用来管理gob流的，它可以实现在编码器（发送器）和解码器（接收器）之间进行二进制数据流的发送，一般用来传递远端程序调用的参数和结果，比如net/rpc包就有用到这个。下面我们来学习以下gob标准库的使用，希望对你有帮助。

一、主要函数介绍

gob和json的pack之类的方法一样，由发送端使用Encoder对数据结构进行编码。在接收端收到消息之后，接收端使用Decoder将序列化的数据变化成本地变量。与json编码格式相比，gob编码可以实现json所不支持的struct的方法序列化，利用g.]]></description><category></category></item></channel></rss>