Golang 优化之路——HTTP长连接

写在前面 压测的是否发现服务端TIME_WAIT状态的连接很多。 netstat -nat | grep :8080 | grep TIME_WAIT | wc -l 17731 TIME_WAIT状态多,简单的说就是服务端主动关闭了TCP连接。 IMG-THUMBNAIL TCP频繁的建立连接,会有一些问题: 三次握手建立连接、四次握手断开连接都会对性能有损耗; 断开的连接断开不会立刻释放,会等待2MSL的时间,据我观察是1分钟; 大量TIME_WAIT会占用内存,一个连接实测是3.155KB...阅读全文

阅读:16281 评论:0

使用golang进行证书签发和双向认证

前言 数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件。证书签发涉及到了非对称加密方面的知识,这里介绍使用golang中的x509标准库进行证书自签发,还有证书签发后如何使用golang进行双向认证. 自签发证书 生成根证书 根证书是CA认证中心给自己颁发的证书,是信任链的起始点.这里我们自己做CA使用openssl命令来生成根证书. 首先生成私钥 openssl genrsa -out key.pem 2048 然后根据私钥提取公钥 openssl rsa -in...阅读全文

2017-06-05 23:06:14 pinecone
阅读:8185 评论:0

golang create tree from mysql

golang web develop always using tree menu in our project.then that can be Reference resources.this article teach you how to get tree menu in web project. 1.show table of menu in mysql database ``` mysql> desc menu; +-------+-------------+------+-----...阅读全文

2017.06.08 00:40* perryn
阅读:952 评论:0

第二章 Goroutine泄漏的调试

在我们谈论协程(Goroutines)泄漏之前,我们先看看并发编程的概念。并发编程处理程序的并发执行。多个连续流任务通过并发编程同时执行,得到更快的执行完成。对于运行在多核处理器上的现代软件,并发编程是必要的,它有助于更好地利用多核处理器的功能,实现更快的并发/并行程序。协程 (Goroutines)协程实现了并发执行,协程是Go运行时轻量级线程,协程和线程之间并无一对一的关系,协程由Go管理调度,运行在不同的线程上。Go协程的设计隐藏了许多线程创建和管理方面的复杂工作。关于并发/并行程序,并发...阅读全文

2017.06.10 22:58* 范彬2017
阅读:2555 评论:0

golang实践-异步系统的无锁

背景 这段时间,忙着学习AI,以及做一些服务的基础工具库,涉及到解耦的异步消息系统[eventbus],以及完善定时器[clock]。本来以为已经大幅简化了业务没问题了,结果5月份,其中一个服务因为广播事件,导致死锁。分析后,发现是一个非常基础的问题倒置,值得捋一捋。 使用场景 学习go的时候,很多资料都提到:“多用通道(chan),少用锁”。对于长期习惯同步编程,方法之间直接调用,对其中的理解并不深入。异步调用涉及到事件定义、订阅发布系统、延时返回,远远没有方法的直接调用来的方便感觉多了,通常...阅读全文

2017-06-11 19:04:03 alex_023
阅读:3141 评论:0

深入理解Go的interface

Understanding Go Interface 0. 引言 在 Golang 中,interface 是一个非常重要的概念和特性,之前写过两篇相关的文章:Golang “泛型编程”,谈一谈 Golang 的 interface 和 reflect。然后在 Gopher China 2017 的会上又有一个关于 interface 的 topic: understanding golang interface(Gopher China) — youtube,作者是 Francesc。故在此做...阅读全文

2017-06-13 10:03:18 徐学良
阅读:1436 评论:0

Go语言并发之美

简介 多核处理器越来越普及,那有没有一种简单的办法,能够让我们写的软件释放多核的威力?答案是:Yes。随着Golang, Erlang, Scale等为并发设计的程序语言的兴起,新的并发模式逐渐清晰。正如过程式编程和面向对象一样,一个好的编程模式需要有一个极其简洁的内核,还有在此之 上丰富的外延,可以解决现实世界中各种各样的问题。本文以GO语言为例,解释其中内核、外延。 并发模式之内核 这种并发模式的内核只需要协程和通道就够了。其中协程负责执行代码,通道负责在协程之间传递事件。 并发编程一直以来...阅读全文

阅读:2029 评论:0

ElasticHD:ElasticSearch Dashboard Go Application. 【工具、无需安装】

ElasticHD:ElasticSearch Dashboard Go ApplicationElasticHD 是一款 ElasticSearch的可视化应用。不依赖ES的插件安装,更便捷;导航栏直接填写对应的ES IP和端口就可以操作Es了。目前支持如下功能:  ES Real time data search  ES Dashboard data visualization ES Index Template (在线修改、查看、上传) ES Indices Index deletion ...阅读全文

2017-06-17 20:38:18 farmerx
阅读:3886 评论:2

Golang直接操作共享内存

前言 故事起源于要搭一个高性能的日志中心。当然使用了elk这一套。但是,对于logstash来说,它主要使用的是文件日志的方式了捕捉log。而写文件日志的话会非常慢。对于实时日志要处理滚动的日志更是这样,每次检查是否需要流动日志,然后打开日志,然后写入,然后关闭,当然这中间可以优化。这一切都是那么慢,发起了n个系统调用,硬盘寻道等。这时候想到了用共享内存来通信。 共享内存的基本知识 要使用共享内存要执行以下几步: 发起一个系统调用,让系统帮你生产一块内存,或者取得一块已经存在的内存来使用...阅读全文

阅读:17066 评论:2

Golang基础篇之数据结构-栈

本篇通过实现一个自定义的栈,来学习Go语言的自定义类型及其方法首先栈的概念不用多说,它是一种支持从顶端插入或删除的线性表,废话少说上代码。在GOPATH下新建stack目录,栈的所有实现在stack.go文件之中。首先需要一个能够保存数据的结构体 type Stack []interfice {} 这里声明Stack为空接口类型的切片(Go语言之中的切片可以理解为一个长度可变的数组)。由于Go语言所有类型都实现了空接口,因此任意类型的值都可以存储在Stack之中。接下来,由于Stack的底层数据...阅读全文

2017.07.26 00:29* 码码码码
阅读:19963 评论:0

Golang官方依赖管理工具:dep

在这里声明一下,百度或者google看到的godep不是我这篇博文说的dep,那它们是什么关系呢?按照Peter Bourgon博文来说,它们的作者都有相同的人,但是一个是dep是官方版本,godep是第三方工具。 我今天介绍的是dep,之前也有介绍过glide,有兴趣的可以到Golang依赖管理工具:glide从入门到精通使用看看。 现在还有一个疑问是为什么官方现在要支持依赖管理了呢?我个人认为有如下原因(勿喷,如果不同或者遗漏欢迎留言补充): 第三方依赖管理很多,虽然很好用,但是很少可以兼...阅读全文

2017-08-09 10:20:34 梦朝思夕
阅读:53556 评论:7

基于55-go的二次开发GUI版本Mac&Win&Linux

写在前面 继前段时间把iOS macOS版本的55客户端做出来后,发现还是很不爽,由于使用了NetworkExtension不允许外部分发,iOS上架AppStore无可厚非,但连macOS版本的也要求上架他的Mac App Store,我想基本很少人用MAS吧。 一直想搞win版本的,毕竟win的用户量是大头。 由于没有win的电脑,加上C#版本的55实在看不懂,只能去考虑跨平台了。 于是,golang来了~也是因为在论坛看到有大佬使用55-go的版本二次开发出跨 平台客户端,这个想法才最终落...阅读全文

2017.08.16 14:23 gwk_iOS
阅读:1298 评论:0

再谈CGO!

最近在kubernetes上搞集成其它team算法的事情,他们的算法是用c写的,自然地我需要用cgo去调用。本文整理了使用cgo过程中的一些函数,特此整理下来,记录。 1,给c函数传递二维整型数组 c函数需要接收一个二维整型数组作为参数, extern bool xxx_func(int** _matrix); 最初实现如下: goArray := [][]int{{1},{3,3},{3,3,2}} cArray := make([][]C.int, len(goArray)) for i, ...阅读全文

2017.08.18 14:39 Mark_Zhang
阅读:2154 评论:0

编写地道的Go代码

最地道的Go代码就是Go的标准库的代码,有空的时候可以多看看Google的工程师是如何实现的。 1. 注释 可以通过/* ... */或者//增加注释, //之后应该有个空格 如果想在每个文件的头部加上注释,需要在版权注释和Package前面加一个空行,否则版权注释会作为package的注释 // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-...阅读全文

2017.08.18 16:34 iCaptain
阅读:927 评论:0

golang 如何验证struct字段的数据格式

假设我们有如下结构体: type User struct { Id int Name string Bio string Email string } 我们需要对结构体内的字段进行验证合法性: Id的值在某一个范围内。 Name的长度在某一个范围内。 Email格式正确。 我们可能会这么写: user := User{ Id: 0, Name: "superlongstring", Bio: "", Email: "foobar", } if user.Id < 1 && user.Id > 1...阅读全文

2017-07-16 zhangyachen
阅读:3500 评论:0

NSQ的重塑之路

在 Gopherchina 2017 中,杭州有赞科技的李文带来了题为《NSQ 重塑之路》的分享,以下是对他演讲内容的整理。今天我会分享有赞 NSQ 重塑的一个过程,主要分为以下几个部分:第一,回顾旧的架构;第二,在使用的过程中遇到的一些问题,以及为什么要做重构;第三,重构具体的细节和架构;第四,测试的整个流程。第五,与其他产品进行对比;第六,有赞的使用场景。Original Architecture Overview首先,什么是 MQ?MQ 大多数在微服务或者一些业务之间的消息投递过程。一般情...阅读全文

阅读:10443 评论:0

压缩go build打包的可执行文件 —— 3.4MB -> 897K

## 前言 最近在写一个cli程序,习惯性的go build之后发现简简单单的几行代码打包出来就3.0+MB了,为此被做Python的同学嘲笑了很久,于是就研究了一下`go build`产生的可执行文件的压缩 ## 代码示例 代码如下: ``` package main import ( "os" "gopkg.in/urfave/cli.v2" ) const ( APP_NAME = "etcd-cli" APP_VERSION = "0.1" ...阅读全文

阅读:2667 评论:0

golang语言之groupcache

转载自:http://luodw.cc/2016/08/23/golang01/ 实习期间一直在用golang,今天想写篇博客,聊聊我对golang的一些思考,以及分析下groupcache的实现; 厦大美景 在没接触golang之前,在我的印象里,服务器开发就是常见的nginx多进程,memcache多线程,redis单线程;后来,golang这种多协程,一个连接对应一个协程的模式深深吸引了我,相比进程,线程,协程粒度相对较小,协程切换代价与进程和线程相比是非常小的,因此一个连接对应一个协程才...阅读全文

阅读:781 评论:0

Go语言channel与select原理

本文会尝试解释 go runtime 中 channel 和 select 的具体实现,部分内容来自 gophercon2017。Go版本为1.8.3 channel 第一部分讲述一下 channel 的用法。channel 可以看做一个队列,用于多个goroutine之间的通信,例如下面的例子,一个goroutine发送msg,另一个msg接受消息。channel 分为带缓冲和不带缓冲,差别不是很大,具体请自行google。看一个简单的例子,了解一下channel的使用。 package ma...阅读全文

2017-08-24 14:35:02 gopher_linuxer
阅读:693 评论:0

Docker学习笔记---Dockerfile

Docker可以通过从Dockerfile包含所有命令的文本文件中读取指令,自动构建镜像。 每个需要使用Docker的项目都应该有一个Dockerfile,这个文件描述了我们需要的镜像环境。 Dockerfile指令 FROM 有效的Dockerfile必须从FROM开始,镜像可以是任何有效的镜像。 官方建议,如果只需要一个linux基础镜像,建议使用Debian镜像,控制的很小。 FROM <image> [AS <name>] 或 FROM <image>[:<tag>] [AS <name...阅读全文

阅读:2716 评论:0