猿谋人

与其声嘶力竭的呐喊,不如身体力行的引导。

北京・360

github.com/apptut

linux命令中的点号和星号区别

在 linux 命令中,星号(*)和点号(.)作用还不一样,星号 `* `代表的是匹配所有合法文件或目录,但不包括隐藏文件或者隐藏目录(以点号开头的文件),而点号代表的是当前目录

Go中包版本号v2+设计

然而有些时候我们希望命名包版本为号为 v2+ 以上的版本,比如项目被整体重构的时候。如果需要构建版本号为 v2.* 及以上的版本号时,官方建议是新建子目录方式来实现,即在当前项目目录下新建一个主版本号子目录

【go代码优化】函数返回值类型还是指针?

关于这个话题,一般的思维是返回指针类型会比返回值类型数据更节约内存,确实没错,但是在 `go` 语言里函数返回指针类型的数据,常常会引发另一个问题:内存逃逸分析

【go代码优化】string和[]byte类型转换

go 中的 string 属于 immutable 类型,类型转换会产生新的内存分配,如果我们知道转换的数据不会被修改,那么我们可以尝试直接修改底层数据对应指针指向新的数据类型即可

【go代码优化】slice使用

初始化时不管是指定长度还是容量大小,整体内存分配次数确实都减小了很多,分别是4次和1次,但平均的运行时间,只有在指定容量cap时,才会有大的提升

使用athens搭建基于本地文件私仓代理

众所周知是一款比较知名的模块代理开源方案,由微软的团队提供,网上也有很多的教程分享如何部署构建公司级 `go` 模块代理服务。

wrk 压测工具使用

wrk 是一款针对Http协议的基准测试工具,它能够在单机多核 CPU 的条件下,使用系统自带的高性能 I/O 机制,如 epoll,kqueue 等,通过多线程和事件模式,对目标机器产生大量的负载。

go语言中的基准测试

基准测试,还是基于 `_test.go` 文件进行的,只要创建以 `Benchmark` 开头的测试函数即可,如我们在《使用Bcrypt保存密码》小节做的基准测试示例

go进程管理工具Pmon2实践

360导航团队 使用 go 语言开发 web 服务时间也比较早,对于go服务的进程管理工具的选择上也做了很多尝试。

go语言中单元测试

本节给大家分享了 `Go` 语言如何编写单元测试,已经常用命名使用方式介绍,下一节我们将继续分享 `Go` 另一个测试话题:基准测试,如果使用基准测试来测试代码的性能。

不常用又必须的git骚操作

docker部署gitlab实践总结

关于 gitlab 的容器部署方式,[官方文档](https://docs.gitlab.com/omnibus/docker/) 已经比较详细,在这里整理下在实操中的遇到的具体细节问题。

使用systemd管理go进程服务

systemd​ 作为 ​centos7​ 之后的默认系统进程管理工具,我们可以使用它来管理 ​go​ 进程服务。我们唯一需要做的就是配置一个 ​service​ 配置文件。

flink自定义Bucketer实现基于日志EventTime的精确小时级归档hdfs操作

使用 flink 把 kafka 队列数据按小时或天级别分文件目录归档存储到 hdfs 中是我们常见的数据处理方式,但在 flink 默认的数据输出 hdfs 配置中,时间的分桶是基于当前程序运行时间而不是日志真正触发的时间,有时候我们希望是基于日志本身触发的时间(EventTime)来定义数据切分规则,这样能够保证就算队列出现堆积或网络延迟,也不会导致日志日志混乱。

golang中切片有必要判断是否为nil么

golang h2c 实践

h2c 是 h2 的非 TLS 版本,即既希望使用 http2 的新特性,如压缩 header 头,多路复用等等新特性,又不想使用 tls 证书的版本。

nginx 配置 ssl_protocols 遇到的坑

请注意nginx配置ssl_protocols,只有 default_server server服务下的配置内容有效。

golang http 操作汇总

golang 常用的http操作方法整理,如 get 请求发送方式,post 发送请求的方式等。

go get 命令使用说明

go get 命令用于给当前开发的模块(module)添加安装依赖包。go get 首先需要找到最合适的版本。

go语言打印环境变量信息

Go语言内置了一些列的环境变量,要想操作这些环境变量,请使用如下命令:go env

flink实时转存kafka数据到hdfs注意事项

在实际项目实战中, flink 实时转存 kafka 数据到 hdfs 遇到一些具体的问题,这里整理总结一下。转存 hdfs 会用到两个内置的 sink 类

flink多目录路径读取数据源

在使用 `flink` 读取数据源时,经常会遇到从多个目录读取数据源的问题,例如像下面的 `hdfs` 路径:,但是在 `flink` 中却没有提供类似的方法,因此需要我们自己来扩展

Flink实战:02.保存项目为archetype模板

上一节:01.创建项目结构 内容中,我们利用官方提供的 Flink 模板生成了一个初始化的 Flink 项目目录结构,并且再次基础上,我们做了二次定制。我们针对不同的运行环境,新增了一些配置文件,以方便自己的项目部署运行。

Flink实战:03.docker部署nexus私仓并发布archetype模板

在上一章节中:Flink实战:02.保存项目为archetype模板,给大家分享了如何制作一个本地的项目模板,这一节内容我将分享如何如何部署一个 nexus 私仓,并把这个本地 archetype 模板发布到仓库中,以方便团队其他人使用。

使用mvn制作archetype时过滤特定文件目录

当我们使用 maven-archetype-plugin 插件基于当前项目生成一个 achvetype 模板项目是,默认的该插件会把当前项目下所有的文件都会打包到 jar 包中。很多时候我们希望在 build 的时候能过滤一些非必要的文件目录

go语言使用smtp发送邮件

在 go 语言里想要发送smtp邮件是非常容易的事情,官方自带 net/smtp 包可以使用,不过这里介绍的是另一个包:gomail ,不是因为别的,主要是上手简单。

一直寻找的流程图软件终于让我给找到了

作为软件开发日常的我,画流程图也成了家常便饭,但是自己画的流程图总是不够漂亮(不够装逼)。

golang中的字符串替换

编写代码时,字符串替换操作是常有的事情,Go 语言中也为我们内置了强大的字符串替换方法,总共是涉及到三个函数

hello world

正所谓实践出真知,学习一门编程语言的最好方式就是实践练习,让我们开始编写第一个 Go 程序吧。

Golang介绍和安装

本文是《Go系列教程》文章的第一篇,本节内容我们将对 `Go` 语言做简要介绍,以及相比较于其他编程语言使用 `Go` 语言开发的优势。并且我们将学到如何在 `Mac OS`, `Windows` 和 `Linux` 系统中安装 `Go` 环境。

golang 中的锁机制

对于读写锁使用时需要注意的是: 对于读和写操作都需要加锁,如果只对写加锁,并未对读加锁,那么也是达不到预想效果的。

Golang 优雅的终止一个服务

采用常规方式启动一个Golang http服务时,若服务被意外终止或中断,即未等待服务对现有请求连接处理并正常返回且亦未对服务停止前作一些必要的处理工作,这样即会造成服务硬终止。这种方式不是很优雅。

基于inotify实现配置文件热更新

在上一篇文章中给大家介绍了在Go语言中 利用发送系统信号更新配置文件 其核心思想就是:新起一个协程,监听linux 的用户自定义信号 USR1 , 当收到该信号类型时,主动更新当前配置文件。那么接下来,我们将继续完成上一篇文章提到的第二种实现配置文件热更新方式:利用linux提供的inotify 接口实现配置文件自动更新。

Go配置文件热加载 - 发送系统信号

在日常项目的开发中,我们经常会使用配置文件来保存项目的基本元数据,配置文件的类型有很多,如:JSON、xml、yaml、甚至可能是个纯文本格式的文件。不管是什么类型的配置数据,在某些场景下,我们可会有热更新当前配置文件内容的需求,比如:使用Go运行的一个常驻进程,运行了一个 Web Server 服务进程。

nginx自定义header中的server字段

那么,具体我们该如何修 Server 字段的值呢?大概需要修改如下几个地方(由于修改的是源码文件,不同版本略有差异,如下文件可能因版本变化而更改)

关于制作rpm包spec文件使用说明

license用来说明该软件的著作权类别,但该值需要提供其缩写格式,如:Apache License 2.0 ,需要提供简写格式ASL2,如果设置为:Apache Lisence 2.0 则不正确

构建RPM软件包

RPM Package Manager(简称:RPM)正如其名,是一款被广泛应用在Red Hat、CentOS、Fedora等操作系统的包管理系统。利用RPM,使得在软件管理、分发、更新等更加便捷。使用RPM你可以:

bash脚本常用代码

作为服务端码农,避免不了经常和bash脚本打交道,本文汇总了日常开发中常用到的shell代码,用以备忘。

关于win7无法连接samba服务的问题

使用 win7 操作系统连接 samba 时,总是提示你:"请输入账号密码的提示弹窗",即使你确信自己输入的账号密码没问题,但仍无法连接成功时,那么可以尝试在你的 samba 配置文件全局配置参数里添加如下值试试

bash脚本最佳实践

脚本参数选项使用较长命名(logger --priority 对比 logger -p)。如果您使用的是cli,缩写对于效率是有意义的。

vim常用操作

vim是linux下常用的编辑器,掌握vim常用技巧,让开发如鱼得水。此篇仅整理易忘知识点

关于Intellij构建Gradle项目

gradle这个后起之秀构建工具,相比于mvn,用起来要舒服很多,不过受限于国内网速问题,使用gradle wrapper方式自动下载官方gradle包初始化项目时,常常会因网速慢,而卡在下载gradle构建工具的这一步

ssl_stapling_verify 究竟验证了什么?

在配置nginx的ssl相关字段的时候,一般标配的文章(如下代码)都会告诉你需要配置ssl_stapling_verify字段值为on , 不过你是否知道当该参数设置为on的时候,你的服务器ssl组件(openssl或者其他)到底验证了什么额外内容呢?

nohup使用总结

远程登录后,启动后台进程,使用exit命令退出当前会话终端不会收到SIGHUP信号;远程登录后,使用su命令切换到另一个账号,然后启动一个后台进程,此时如果强行关闭终端,此用户下的进程不会收到SIGHUP信号;远程登录后,守护进程是放在一段shell脚本文件里被执行的,此种方式启动的进程在关闭终端也不会收到SIGHUP

使用守护进程方式运行rsync

rsyncd.conf 用于rsync在守护进程(daemon)模式下的配置文件,该文件定义了传输中的用户授权、权限访问、传输日志、配置传输模块等功能

https中关于sni的问题

这又是一个历史性的问题,sni 全称:Server Name Indication。TLS/SSL协议是基于TCP协议之上,但又何HTTP协议没半点关系的协议,该协议在和服务端建立握手(handshake)的时候,需要获取服务端证书(单向验证)验证,在HTTP协议中使用了host字段定义了当前请求的具体server_name