golang

golang(11): 日志收集系统

半腔热情 提交于 2019-11-28 19:01:15
1. 项目背景 a. 每个系统都有日志,当系统出现问题时,需要通过日志解决问题 b. 当系统机器比较少时,登陆到服务器上查看即可满足 c. 当系统机器规模巨大,登陆到机器上查看几乎不现实 2. 解决方案 a. 把机器上的日志实时收集,统一的存储到中心系统 b. 然后再对这些日志建立索引,通过搜索即可以找到对应日志 c. 通过提供界面友好的web界面,通过web即可以完成日志搜索 3. 面临的问题 a. 实时日志量非常大,每天几十亿条 b. 日志准实时收集,延迟控制在分钟级别 c. 能够水平可扩展 4. 业界方案ELK 5. elk方案问题 a. 运维成本高,每增加一个日志收集,都需要手动修改配置 b. 监控缺失,无法准确获取logstash的状态 c. 无法做定制化开发以及维护 6. 日志收集系统设计 7. 各组件介绍 // a. Log Agent,日志收集客户端,用来收集服务器上的日志(部署在每个需要收集日志的业务服务器上) // b. Kafka,高吞吐量的分布式队列,linkin开发,apache顶级开源项目 // c. ES,elasticsearch,开源的搜索引擎,提供基于http restful的web接口 // d. Hadoop,分布式计算框架,能够对大量数据进行分布式处理的平台 (小量数据用 mysql 就行,海量数据利用 Hadoop ) // e.

Golang Gateway API 搭建教程

久未见 提交于 2019-11-28 18:43:15
原文链接 随着微服务的兴起,行业里出现了非常多优秀的微服务网关框架,今天教大家搭建一套国人,用Golang写的微服务网关框架。 这里啰嗦一句,可能到今天还有人不理解什么是微服务,为什么要用微服务。目前网上相对比较模糊,没有精确的定义,但大家的意思都差不多,这里个人通俗描述,就是小项目发展到大项目过程中,出于已维护,与稳定性等考虑,将一个整体项目分为多个微小服务。 微服务网关的作用是在用户第一个网关服务器,你按照业务服务相关需求,给网关分流,相比云主机厂商提供的负载均衡器,强大在于你可以根据自己业务去分流,同时还以可以实现鉴权、校验、聚合、缓存等自定义服务,而云主机的负载均衡器只是一个简单按照流量给你负载均衡请求,不具有自定义编程性质。 接下来教如何安装,以及注意事项。 地址: https://github.com/fagongzi/gateway 功能: 流量控制 熔断 负载均衡 服务发现 插件机制 路由(分流,复制流量) API 聚合 API 参数校验 API 访问控制(黑白名单) API 默认返回值 API 定制返回值 API 结果Cache JWT Authorization API Metric导入Prometheus API 失败重试 后端server的健康检查 开放管理API(GRPC、Restful) 支持websocket 支持在线迁移数据 1.下载 https:/

Golang防止多个进程重复执行

拥有回忆 提交于 2019-11-28 18:09:56
创建锁文件 lockFile := "./lock.pid" lock, err := os.Create(lockFile) if err != nil { log.Fatal("创建文件锁失败", err) } defer os.Remove(lockFile) defer lock.Close() lockFile 变量值自定义;在main函数执行完成后需要移除锁文件并关闭文件读取。 锁定文件 err = syscall.Flock(int(lock.Fd()), syscall.LOCK_EX|syscall.LOCK_NB) if err != nil { log.Println("上一个任务未执行完成,暂停执行") os.Exit(1) } syscall.LOCK_EX 排它锁,不允许其他人读和写。 syscall.LOCK_NB 意味着无法锁定文件时不能阻断操作,马上返回给进程。 lock.Fd() 返回文件描述符,文件描述符是一个索引值,指向当前进程打开的文件记录表。最后在执行完毕后对文件解锁。 defer syscall.Flock(int(lock.Fd()), syscall.LOCK_UN) 来源: https://www.cnblogs.com/enochzzg/p/11418527.html

Go语言的几大优势和特性

雨燕双飞 提交于 2019-11-28 17:49:15
要说起GO语言的优势,我们就得从GO语言的历史讲起了…… 本文由 腾讯技术工程官方号 发表在 腾讯云+社区 2007年,受够了C++煎熬的Google首席软件工程师Rob Pike纠集Robert Griesemer和Ken Thompson两位牛人,决定创造一种新语言来取代C++, 这就是Golang。出现在21世纪的GO语言,虽然不能如愿对C++取而代之,但是其近C的执行性能和近解析型语言的开发效率以及近乎于完美的编译速度,已经风靡全球。特别是在云项目中,大部分都使用了Golang来开发,不得不说,Golang早已深入人心。而对于一个没有历史负担的新项目,Golang或许就是个不二的选择。 被称为GO语言之父的Rob Pike说,你是否同意GO语言,取决于你是认可少就是多,还是少就是少(Less is more or less is less)。Rob Pike以一种非常朴素的方式,概括了GO语言的整个设计哲学--将简单、实用体现得淋漓尽致。 很多人将GO语言称为21世纪的C语言,因为GO不仅拥有C的简洁和性能,而且还很好的提供了21世纪互联网环境下服务端开发的各种实用特性,让开发者在语言级别就可以方便的得到自己想要的东西。 发展历史 2007年9月,Rob Pike在Google分布式编译平台上进行C++编译,在漫长的等待过程中,他和Robert

golang采坑记录

戏子无情 提交于 2019-11-28 16:45:21
安装golang,引入第三方库,采坑 1、获取安装包 go语言中文网: https://studygolang.com/dl 官网地址: https://studygolang.com/dl 2、下载 选择需要下载的安装包,右键复制服务包地址:wget https://studygolang.com/dl/golang/go1.11.13.linux-amd64.tar.gz 3、解压(为了规范,便于管理,解压到/usr/local,会生成go文件) tar zxvf go1.11.linux-amd64.tar.gz -C /usr/local 4、设置环境变量并使得全局生效 # 编辑profile文件 # vi /etc/profile # 在文件末尾添加如下内容 #go setting export GOROOT=/usr/local/go export GOPATH=/usr/local/gopath source /etc/profile 5、验证version和env 6、执行程序,报错 7、核心 整个项目(执行程序,以及需要的第三方库)需要移动的gopath的src下面去(为什么要新建src呢?这是go读取第三方库的规范) 来源: https://www.cnblogs.com/bailuoxi/p/11415952.html

面向对象编程三大特征4

半世苍凉 提交于 2019-11-28 16:26:32
接口(interface) 按顺序,我们应该讲解多态,但是在讲解多态前,我们需要讲解接口(interface) ,因为在Golang中 多态特性主要是通过接口来体现的。 接口快速入门: 这样的设计需求在Golang编程中也是会大量存在的,我曾经说过,一个程序就是一个世界,在现实世界存在的情况,在程序中也会出现。我们用程序来模拟一下前面的应用场景。 案例: package main import (   "fmt" ) //声明一个接口 type Usb interface {   //声明了两个没有实现的方法   Start()   Stop() } type Phone struct { } //让Phone 实现 Usb接口的方法 func (p Phone) Start() {   fmt.Println("手机开始工作...") } func (p Phone) Stop() {   fmt.Println("手机停止工作...") } type Camera struct { } //让camera 实现了Usb接口的方法 func (c Camera) Start() {   fmt.Println("相机开始工作...") } func (c Camera) Stop() {   fmt.Println("相机停止工作...") } //计算机 type

golang语言sql Rows转化保存成map

左心房为你撑大大i 提交于 2019-11-28 15:54:27
func DoQuery(db *sql.DB, sqlInfo string, args ...interface{}) ([]map[string]interface{}, error) { rows, err := db.Query(sqlInfo, args...) if err != nil { return nil, err } columns, _ := rows.Columns() columnLength := len(columns) cache := make([]interface{}, columnLength) //临时存储每行数据 for index, _ := range cache { //为每一列初始化一个指针 var a interface{} cache[index] = &a } var list []map[string]interface{} //返回的切片 for rows.Next() { _ = rows.Scan(cache...) item := make(map[string]interface{}) for i, data := range cache { item[columns[i]] = *data.(*interface{}) //取实际类型 } list = append(list, item) } _ =

xorm:golang的orm(只写了一小部分)

我与影子孤独终老i 提交于 2019-11-28 15:51:34
xorm xorm是一个简单而强大的Go语言ORM库. 通过它可以使数据库操作非常简便。这个库是国人开发的,是基于原版 xorm:https://github.com/go-xorm/xorm 的定制增强版本。安装该orm的话,直接通过go get -u github.com/xormplus/xorm即可 当然orm并不能直接操作数据库,还是要借助第三方驱动的,目前支持的驱动如下 Mysql: https://github.com/go-sql-driver/mysql MyMysql: https://github.com/ziutek/mymysql Postgres: https://github.com/lib/pq Tidb: https://github.com/pingcap/tidb SQLite: https://github.com/mattn/go-sqlite3 MsSql: https://github.com/denisenkom/go-mssqldb Oracle: https://github.com/mattn/go-oci8 (试验性支持) 创建引擎 引擎使用来执行我们所写的sql语句的 package main import ( "fmt" _ "github.com/lib/pq" // 引用驱动,python中,是不需要显示引用的

pipeline和channel的区别

依然范特西╮ 提交于 2019-11-28 13:33:29
pipeline和channel的区别 在golang中,学到channel时,往往都会产生一些疑惑,和channel的区别是什么? 以下就是区别: difference channel pipeline structure streams of a Go type unstructured streams of bytes platform specific type in golang unix Or unix like buffer Depending on the circumstances always buffered features connected between goroutine between two process(std.in/out) 事实上,这两个东西区别还是挺大的,但是用处都很明确,就是通信 来源: https://www.cnblogs.com/wangha/p/11409092.html

golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web

会有一股神秘感。 提交于 2019-11-28 13:08:06
micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境, golang微服务框架go-micro 入门笔记2.1 micro工具之micro api 本文应用环境 名称 描述 操作系统 win10 go version go version go1.12.7 windows/amd64 GOPATH E:\winlion\gopath GOPROXY https://goproxy.io G111MODULE on 命令行工具 cmder工具,可自行百度安装 命令行说明 micro web指令全部参数如下 NAME: micro web - Run the web dashboard USAGE: micro web [command options] [arguments...] OPTIONS: --address value Set the web UI address e.g 0.0.0.0:8082 [%MICRO_WEB_ADDRESS%] --namespace value Set the namespace used by the Web proxy e.g. com.example.web [%MICRO