golang中time包使用
时间类型在编码中,经常会涉及到时间的转换,对于time的使用,一直比较模糊,现在做一下整理。
首先,了解时间的两种类型。时间可分为时间点与时间段,golang 提供了以下两种基础类型
时间点(Time)
时间段(Duration)
除此之外 golang 也提供了以下类型,做一些特定的业务
时区(Location)
Ticker
Timer(定时器)
时间点(Time)时间相关的业务都是基于点而延伸的,两点组成一个时间段,大多数应用也都是围绕这些点与面去做逻辑处理。
时间初始化Go 针对不同的参数类型提供了以下初始化的方式
1234567891011121314151617181920212223//2019-12-13 10:42:09.364687 +0800 CST m=+0.003140465fmt.Println(time.Now())//2010-04-23 12:24:51 +0000 UTCs, _ := time.Parse("2006-01-02 15:04:05", "2010-04-23 12:24:51")fm ...
Docker多重构建实现自动化构建
前言自动化构建是应用发布过程中必不可少的环节, 常用的构建工具有jenkins ,walle 等。而这些工具在构建应用时通常会有以下问题:
需要直接或间接的写一坨用于构建的shell命令等,不易管理、兼容性较差
上面一点可能还比较容易解决,但最为致命的是:重度依赖如jenkins宿主机或打包机上的软件环境,如git, maven,java等
理想情况是: 不同的应用如java应用、go应用、php应用等等,都可以在某台负责构建的宿主机上并行无干扰的执行构建操作,且构建中依赖的软件环境、构建流程等都可以由开发人员控制。
到目前为止,能很好的完成以上使命的,可能非docker莫属了!
在docker的世界里,构建交付的是镜像,而能够产生镜像的是Dockerfile (手动使用docker commit 的另当别论).
在docker ce 17.05 之后,出现了一个很重要的特性Multi-Stage Build (多阶段构建) , 它将显著提升你的运维生产力!
下文将用实战案例来详细解读Multi-Stage Build这一特性
在Multi-Stage Build之前以下演 ...
Go提示错误first path segment in URL cannot contain colon
今天使用Go做HTTP POST请求时,出现错误,提示first path segment in URL cannot contain colon。意思为URL中的第一个路径段不能包含冒号。
排查问题,发现Url实际上包含空格,才导致出现这样的错误。为防止出现,需要对url进行过滤处理。
示例代码如下:
12345678910111213141516func SyncDo(host string, mdId, openId string) (string, error) { form := url.Values{ "mdId": {mdId}, "openId": {openId}, } resp, err := http.PostForm(host, form) if err != nil { logs.Info("http.PostForm err=%s, host=%q, form=%v", err, host, form) ...
Elasticsearch + Fluentd + Kibana搭建Docker日志管理系统
随着Docker容器广泛应用,不同的容器都会产生日志。对大规模运行的容器集群来说,日志不能统一管理是很耗费精力的。大量的微服务,各个容器服务是有相互调用的,这时候发现问题时,通过日志排查问题,需要查看对应各个容器的日志。如果没有一个统一的日志管理工具,没有可视化Web查看,是很痛苦的,而且不方便快速定位问题。
为了统一日志管理,现在有了Fluentd,但日志的检索,查看就依赖于其他工具了。这里我们使用Elasticsearch + Fluentd + Kibana搭建Docker日志管理系统。这3个系统又简称EFK。
Elasticsearch是一个以易用性着称的开源搜索引擎。
Fluentd是一个日志管理工具。
Kibana是一个开源的Web UI,使Elasticsearch对工程师和数据科学家都很友好。
通过这3个系统,我们使用Docker compose搭建我们的日志系统。
搭建服务准备docker-compse.yml文件
12345678910111213141516171819202122232425version: '2's ...
Docker日志管理工具Fluentd及elasticsearch插件
随着Docker容器广泛应用,对大规模运行的容器集群来说,日志不能集中管理是一件很痛苦的事情。不能合理的收集,管理检索应用日志,在应用发生了故障的时候将无法很好的追溯问题发生的原因。
通常我们会将docker日志挂载到宿主机目录,但是查看时十分不方便。如果用flunted统一管理日志,可以方便做统一管理。基于Elasticsearch+Fluentd+Kibana,可以方便的搭建日志分析平台,通过Kibana面板,可以在浏览器上方便查看。
启动Fluentd12345docker run -d \-p 24224:24224 -p 24224:24224/udp \-v /data/logs/fluented:/fluentd/log \fluent/fluentd:v1.3
将log挂载在宿主机的/data/logs/fluented, 注意对应的权限
此时会在宿主机目录下生成data.<fluentd容器id>.log,所有收集到的日志文件将存储至此。
测试启动一个测试容器,写入日志。这里我们使用nginx服务。
12345678# docker run -d \ ...
Mac中搭建Kubernetes
Kubernetes是Google和RadHat公司共同主导的开源容器编排项目,功能非常强大,也非常的火热和流行,但同时里面也有很多的概念和名词需要我们去学习和理解。学习任何一个技术先需要把基础环境搭建起来,本篇就介绍怎样在Mac中启动单节点的Kubernetes。
启用Kubernetes在Mac中安装了Docker之后,会自动安装了Kubernetes,正常情况下,我们只需要在Docker的Preferrences->Kubernetes中勾选Enable Kubernetes,然后点击Apply按钮即可。但由于伟大的墙的存在,这么一个简单的启动也会变得一波三折。
如果您是直接在Docker中启用Kubernetes,Kubernetes的状态会一直都是kubernetes is starting...,原因是有一些Kubernetes依赖的镜像不能正常的下载。
所以需要手动拉取镜像,执行命令修改项目tag。有多种开源项目已经有脚本执行。
###参考 k8s-docker-for-mac
Github上有个开源项目可以帮我们手动拉取镜像,执行下面命令拉去改项目代码到本地
1g ...
Redis攻击模拟,获取服务器登录权限
公司服务器使用Redis集群,最近发现数据异常丢失。多方排除,找出问题。发现是Redis被人攻击,Redis中有开发了远程连接断开,被恶意用户远程登录后,注入了一些文件。
通过百度等各种途径,了解到了Redis的攻击方式,今天特意模拟了下,通过Redis漏洞,获取服务器权限,远程ssh登录。
排查过程,可以查看另外一篇文章Redis集群数据异常丢失,发现挖矿程序
安装Redis为模拟,先安装redis,而且是以漏洞方式启动
1234567891011121314151617181920yum install redischmod 0777 /var/log/redis/redis.log service redis start# 查看是否正常启动ps aux | grep redis# 测试redis-cli ping# 返回PONG#修改端口绑定vi /etc/redis.conf # bind 127.0.0.1bind 0.0.0.0# 重启redis# service redis restart 不能用此启动,此是用redis用户启动sudo redis-server /etc ...
Redis集群数据异常丢失,发现挖矿程序
现象公司服务器使用Redis集群,最近发现数据异常丢失。刚存储的数据,当时能够查询到,过了2天就无法查询。查询了内存是否溢出,集群节点信息,都没有排查到问题。
刚开始总是以为是redis哪里配置的有问题,可能配置的有定时清空数据库的机制吧,但是找了一圈没有发现redis配置的问题。
后来通过日志,定位到,是被人攻击,执行了清库命令。
排查查看数据过期时间1ttl key
数据正常
集群健康状况12345678#查看服务器内存free # 登录redis查看#集群状态cluster info#节点cluster nodes
查看Memory都是正常的,只有40M
查看内存淘汰机制maxmemory-policy是noeviction,为禁止驱逐数据
redis info信息详解
发现问题查看aof日志,发现问题,有被执行flushall清库命令
1egrep -i 'flushall|um_1765039' -A3 -B3 appendonly.aof
再查阿里云邮件,也提示了异常操作信息,定位为入侵。
原因是该服务器有外网IP,虽然服务链接地址是使用的内网IP+ ...
Go包管理工具Dep及翻墙设置
Go语言早期没有包管理工具,社区里go的第三方包托管在各个git托管平台。需要用到包时通过go get 命令工具安装,但这个工具没有版本描述性文件。在go的世界里没有“package.json”这种文件。这个给我们带来直接的影响就是依赖放在外网,而且没有版本约束
而且使用Gopath配置,多个项目时,配置比较繁琐。
目前依赖工具有很多,如:glide、godep等
从1.9版本开始,官方发布依赖工具,用来管理和下载工程依赖的工具。
123dep is a prototype dependency management tool for Go. It requires Go 1.9 or newer to compile. dep is safe for production use.
安装Mac安装1brew install dep
linux1curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
Windows1go get -u github.com/golang/dep/cmd/de ...
GO序列化和反序列化研究
序列化和反序列化的概念把对象转换为字节序列的过程称为对象的序列化;把字节序列恢复为对象的过程称为对象的反序列化。
对象的序列化主要有两种用途:
1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
2) 在网络上传送对象的字节序列。
在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存。比如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些seesion先序列化到硬盘中,等要用了,再把保存在硬盘中的对象还原到内存中。
当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送
Json序列化Struct 序列化为Json12345type Student struct { Name string Age uint8 Address string}
12345678910s1 := Student{"张三", 18, &q ...